From 12a28464d4c00f785f695ed16766392c146a7e7d Mon Sep 17 00:00:00 2001 From: Derek Reese Date: Thu, 25 May 2023 11:01:13 -0700 Subject: [PATCH 1/2] Updates gitignore to be more comprehensive --- .gitignore | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index d7624038..9d60abef 100644 --- a/.gitignore +++ b/.gitignore @@ -3,23 +3,70 @@ # =============== # [Tt]emp/ [Oo]bj/ -[Bb]uild -[Bb]uilds +[Bb]uild/ +[Bb]uilds/ [Ll]ibrary/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ sysinfo.txt + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Recordings can get excessive in size +/[Rr]ecordings/ + +/[Aa]ssets/AssetStoreTools* + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.aab +*.unitypackage +*.app + +# Crashlytics generated file +crashlytics-build.properties + +# Packed Addressables +/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* + +# Temporary auto-generated Android Assets +/[Aa]ssets/[Ss]treamingAssets/aa.meta +/[Aa]ssets/[Ss]treamingAssets/aa/* + # ===================================== # # Visual Studio / MonoDevelop generated # # ===================================== # [Ee]xported[Oo]bj/ -*.userprefs *.csproj +*.mdb +*.opendb +*.pdb *.pidb +*.sln *.suo +*.svd +*.tmp *.user *.unityproj +*.userprefs *.booproj +*.VC.db .vs/ packages/ + +# Gradle cache directory +.gradle/ + # ============ # # OS generated # # ============ # From 914903cf8e2c231873f122ef6eb765d51ef3d83d Mon Sep 17 00:00:00 2001 From: Derek Reese Date: Wed, 19 Jul 2023 14:20:43 -0700 Subject: [PATCH 2/2] Adds an Economy v2 Android IAP Example --- Samples/Unity/PlayFabEconomyV2/.vsconfig | 6 + .../Assets/AndroidIAPExample.cs | 527 ++ .../Assets/AndroidIAPExample.cs.meta | 11 + .../Assets/PlayFabEditorExtensions.meta | 9 + .../PlayFabEditorExtensions/Editor.meta | 9 + .../Editor/PlayFabEditor.cs | 445 + .../Editor/PlayFabEditor.cs.meta | 12 + .../Editor/PlayFabEditorExtensions.asmdef | 14 + .../PlayFabEditorExtensions.asmdef.meta | 7 + .../Editor/Resources.meta | 8 + .../Resources/Microsoft.Identity.Client.dll | Bin 0 -> 1524176 bytes .../Microsoft.Identity.Client.dll.meta | 33 + ....IdentityModel.Clients.ActiveDirectory.dll | Bin 0 -> 1080680 bytes ...tityModel.Clients.ActiveDirectory.dll.meta | 33 + .../Microsoft.IdentityModel.JsonWebTokens.dll | Bin 0 -> 67480 bytes ...osoft.IdentityModel.JsonWebTokens.dll.meta | 33 + .../Microsoft.IdentityModel.Logging.dll | Bin 0 -> 30056 bytes .../Microsoft.IdentityModel.Logging.dll.meta | 33 + .../Microsoft.IdentityModel.Tokens.dll | Bin 0 -> 926112 bytes .../Microsoft.IdentityModel.Tokens.dll.meta | 33 + .../MostRecentPackage.unitypackage.meta | 7 + .../Resources/PlayFabEditorPrefsSO.asset | 24 + .../Resources/PlayFabEditorPrefsSO.asset.meta | 8 + .../System.IdentityModel.Tokens.Jwt.dll | Bin 0 -> 82280 bytes .../System.IdentityModel.Tokens.Jwt.dll.meta | 33 + .../Editor/Scripts.meta | 9 + .../Editor/Scripts/Components.meta | 9 + .../Editor/Scripts/Components/ProgressBar.cs | 155 + .../Scripts/Components/ProgressBar.cs.meta | 12 + .../Scripts/Components/SubMenuComponent.cs | 102 + .../Components/SubMenuComponent.cs.meta | 12 + .../Scripts/Components/TitleDataEditor.cs | 54 + .../Components/TitleDataEditor.cs.meta | 12 + .../Scripts/Components/TitleDataViewer.cs | 156 + .../Components/TitleDataViewer.cs.meta | 12 + .../Components/TitleInternalDataEditor.cs | 55 + .../TitleInternalDataEditor.cs.meta | 12 + .../Components/TitleInternalDataViewer.cs | 147 + .../TitleInternalDataViewer.cs.meta | 12 + .../Editor/Scripts/Panels.meta | 9 + .../Panels/PlayFabEditorAuthenticate.cs | 403 + .../Panels/PlayFabEditorAuthenticate.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorDataMenu.cs | 123 + .../Panels/PlayFabEditorDataMenu.cs.meta | 11 + .../Scripts/Panels/PlayFabEditorHeader.cs | 69 + .../Panels/PlayFabEditorHeader.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorHelpMenu.cs | 100 + .../Panels/PlayFabEditorHelpMenu.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorMenu.cs | 132 + .../Scripts/Panels/PlayFabEditorMenu.cs.meta | 11 + .../Scripts/Panels/PlayFabEditorPackages.cs | 111 + .../Panels/PlayFabEditorPackages.cs.meta | 11 + .../Scripts/Panels/PlayFabEditorSDKTools.cs | 410 + .../Panels/PlayFabEditorSDKTools.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorSettings.cs | 359 + .../Panels/PlayFabEditorSettings.cs.meta | 12 + .../Scripts/Panels/PlayFabEditorToolsMenu.cs | 184 + .../Panels/PlayFabEditorToolsMenu.cs.meta | 12 + .../Editor/Scripts/PlayFabEditorSDK.meta | 9 + .../Scripts/PlayFabEditorSDK/ISerializer.cs | 80 + .../PlayFabEditorSDK/ISerializer.cs.meta | 12 + .../PlayFabEditorSDK/PlayFabEditorApi.cs | 99 + .../PlayFabEditorSDK/PlayFabEditorApi.cs.meta | 12 + .../PlayFabEditorSDK/PlayFabEditorHttp.cs | 246 + .../PlayFabEditorHttp.cs.meta | 12 + .../PlayFabEditorSDK/PlayFabEditorModels.cs | 470 + .../PlayFabEditorModels.cs.meta | 12 + .../Scripts/PlayFabEditorSDK/SimpleJson.cs | 2047 +++++ .../PlayFabEditorSDK/SimpleJson.cs.meta | 12 + .../Editor/Scripts/Utils.meta | 9 + .../Editor/Scripts/Utils/EditorCoroutine.cs | 145 + .../Scripts/Utils/EditorCoroutine.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorDataService.cs | 208 + .../Utils/PlayFabEditorDataService.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorHelper.cs | 228 + .../Scripts/Utils/PlayFabEditorHelper.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorPrefsSO.cs | 79 + .../Utils/PlayFabEditorPrefsSO.cs.meta | 11 + .../Scripts/Utils/PlayFabEditorUtils.cs | 118 + .../Scripts/Utils/PlayFabEditorUtils.cs.meta | 12 + .../Scripts/Utils/PlayFabEditorVersion.cs | 1 + .../Utils/PlayFabEditorVersion.cs.meta | 12 + .../Scripts/Utils/PlayFabGuiFieldHelper.cs | 149 + .../Utils/PlayFabGuiFieldHelper.cs.meta | 12 + .../PlayFabEditorExtensions/Editor/UI.meta | 9 + .../Editor/UI/Fonts.meta | 9 + .../Editor/UI/Fonts/Avalon Bold.ttf | Bin 0 -> 63922 bytes .../Editor/UI/Fonts/Avalon Bold.ttf.meta | 19 + .../Editor/UI/Fonts/Avalon.ttf | Bin 0 -> 51288 bytes .../Editor/UI/Fonts/Avalon.ttf.meta | 19 + .../Editor/UI/Images.meta | 9 + .../Editor/UI/Images/Black.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Black.png.meta | 57 + .../Editor/UI/Images/Clear.png | Bin 0 -> 127 bytes .../Editor/UI/Images/Clear.png.meta | 57 + .../Editor/UI/Images/Gray_base.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Gray_base.png.meta | 57 + .../Editor/UI/Images/Gray_dk1.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Gray_dk1.png.meta | 57 + .../Editor/UI/Images/Gray_lt1.png | Bin 0 -> 137 bytes .../Editor/UI/Images/Gray_lt1.png.meta | 57 + .../Editor/UI/Images/Gray_lt2.png | Bin 0 -> 137 bytes .../Editor/UI/Images/Gray_lt2.png.meta | 57 + .../Editor/UI/Images/Orange.png | Bin 0 -> 136 bytes .../Editor/UI/Images/Orange.png.meta | 57 + .../Editor/UI/Images/Square.png | Bin 0 -> 78 bytes .../Editor/UI/Images/Square.png.meta | 61 + .../Editor/UI/Images/White.png | Bin 0 -> 137 bytes .../Editor/UI/Images/White.png.meta | 57 + .../Editor/UI/Images/azure-playfab-logo.png | Bin 0 -> 23349 bytes .../UI/Images/azure-playfab-logo.png.meta | 91 + .../Editor/UI/Images/checkmark.png | Bin 0 -> 2763 bytes .../Editor/UI/Images/checkmark.png.meta | 91 + .../Editor/UI/Images/checkmark_off.png | Bin 0 -> 51228 bytes .../Editor/UI/Images/checkmark_off.png.meta | 91 + .../Editor/UI/Images/checkmark_on.png | Bin 0 -> 55178 bytes .../Editor/UI/Images/checkmark_on.png.meta | 91 + .../Editor/UI/Images/dashboardIcon.png | Bin 0 -> 49180 bytes .../Editor/UI/Images/dashboardIcon.png.meta | 91 + .../Editor/UI/Images/dashboardIconHover.png | Bin 0 -> 49499 bytes .../UI/Images/dashboardIconHover.png.meta | 91 + .../Editor/UI/Images/dn_colored.png | Bin 0 -> 514 bytes .../Editor/UI/Images/dn_colored.png.meta | 59 + .../Editor/UI/Images/dn_gray.png | Bin 0 -> 506 bytes .../Editor/UI/Images/dn_gray.png.meta | 59 + .../Editor/UI/Images/green.png | Bin 0 -> 2859 bytes .../Editor/UI/Images/green.png.meta | 57 + .../Editor/UI/Images/pfFullLogo_O.png | Bin 0 -> 11614 bytes .../Editor/UI/Images/pfFullLogo_O.png.meta | 57 + .../Editor/UI/Images/pfFullLogo_W.png | Bin 0 -> 10717 bytes .../Editor/UI/Images/pfFullLogo_W.png.meta | 57 + .../Editor/UI/Images/playfablogo.png | Bin 0 -> 75821 bytes .../Editor/UI/Images/playfablogo.png.meta | 91 + .../Editor/UI/Images/r_colored.png | Bin 0 -> 525 bytes .../Editor/UI/Images/r_colored.png.meta | 59 + .../Editor/UI/Images/r_gray.png | Bin 0 -> 517 bytes .../Editor/UI/Images/r_gray.png.meta | 59 + .../Editor/UI/Images/red.png | Bin 0 -> 2860 bytes .../Editor/UI/Images/red.png.meta | 57 + .../Editor/UI/Images/yellow.png | Bin 0 -> 2859 bytes .../Editor/UI/Images/yellow.png.meta | 57 + .../Editor/UI/PlayFabStyles.guiskin | 3540 ++++++++ .../Editor/UI/PlayFabStyles.guiskin.meta | 8 + .../PlayFabEconomyV2/Assets/PlayFabSDK.meta | 9 + .../Assets/PlayFabSDK/Admin.meta | 9 + .../PlayFabSDK/Admin/PlayFabAdminAPI.cs | 1558 ++++ .../PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta | 12 + .../Admin/PlayFabAdminInstanceAPI.cs | 1349 +++ .../Admin/PlayFabAdminInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Admin/PlayFabAdminModels.cs | 7474 ++++++++++++++++ .../Admin/PlayFabAdminModels.cs.meta | 12 + .../Assets/PlayFabSDK/Admin/PlayFabEvents.cs | 240 + .../PlayFabSDK/Admin/PlayFabEvents.cs.meta | 11 + .../Assets/PlayFabSDK/Authentication.meta | 8 + .../PlayFabAuthenticationAPI.cs | 104 + .../PlayFabAuthenticationAPI.cs.meta | 11 + .../PlayFabAuthenticationInstanceAPI.cs | 121 + .../PlayFabAuthenticationInstanceAPI.cs.meta | 11 + .../PlayFabAuthenticationModels.cs | 233 + .../PlayFabAuthenticationModels.cs.meta | 11 + .../Authentication/PlayFabEvents.cs | 18 + .../Authentication/PlayFabEvents.cs.meta | 11 + .../Assets/PlayFabSDK/Client.meta | 9 + .../PlayFabSDK/Client/PlayFabClientAPI.cs | 2323 +++++ .../Client/PlayFabClientAPI.cs.meta | 12 + .../Client/PlayFabClientInstanceAPI.cs | 2016 +++++ .../Client/PlayFabClientInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Client/PlayFabClientModels.cs | 7754 +++++++++++++++++ .../Client/PlayFabClientModels.cs.meta | 12 + .../PlayFabSDK/Client/PlayFabDeviceUtil.cs | 109 + .../Client/PlayFabDeviceUtil.cs.meta | 12 + .../Assets/PlayFabSDK/Client/PlayFabEvents.cs | 325 + .../PlayFabSDK/Client/PlayFabEvents.cs.meta | 11 + .../Assets/PlayFabSDK/CloudScript.meta | 8 + .../CloudScript/PlayFabCloudScriptAPI.cs | 218 + .../CloudScript/PlayFabCloudScriptAPI.cs.meta | 11 + .../PlayFabCloudScriptInstanceAPI.cs | 202 + .../PlayFabCloudScriptInstanceAPI.cs.meta | 11 + .../CloudScript/PlayFabCloudScriptModels.cs | 1130 +++ .../PlayFabCloudScriptModels.cs.meta | 11 + .../PlayFabSDK/CloudScript/PlayFabEvents.cs | 36 + .../CloudScript/PlayFabEvents.cs.meta | 11 + .../Assets/PlayFabSDK/Data.meta | 8 + .../Assets/PlayFabSDK/Data/PlayFabDataAPI.cs | 133 + .../PlayFabSDK/Data/PlayFabDataAPI.cs.meta | 11 + .../PlayFabSDK/Data/PlayFabDataInstanceAPI.cs | 137 + .../Data/PlayFabDataInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Data/PlayFabDataModels.cs | 404 + .../PlayFabSDK/Data/PlayFabDataModels.cs.meta | 11 + .../Assets/PlayFabSDK/Data/PlayFabEvents.cs | 24 + .../PlayFabSDK/Data/PlayFabEvents.cs.meta | 11 + .../Assets/PlayFabSDK/Economy.meta | 8 + .../PlayFabSDK/Economy/PlayFabEconomyAPI.cs | 656 ++ .../Economy/PlayFabEconomyAPI.cs.meta | 11 + .../Economy/PlayFabEconomyInstanceAPI.cs | 583 ++ .../Economy/PlayFabEconomyInstanceAPI.cs.meta | 11 + .../Economy/PlayFabEconomyModels.cs | 3105 +++++++ .../Economy/PlayFabEconomyModels.cs.meta | 11 + .../PlayFabSDK/Economy/PlayFabEvents.cs | 98 + .../PlayFabSDK/Economy/PlayFabEvents.cs.meta | 11 + .../Assets/PlayFabSDK/Entity.meta | 10 + .../PlayFabSDK/Entity/ScreenTimeTracker.cs | 255 + .../Entity/ScreenTimeTracker.cs.meta | 11 + .../Assets/PlayFabSDK/Events.meta | 8 + .../Assets/PlayFabSDK/Events/PlayFabEvents.cs | 14 + .../PlayFabSDK/Events/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Events/PlayFabEventsAPI.cs | 67 + .../Events/PlayFabEventsAPI.cs.meta | 11 + .../Events/PlayFabEventsInstanceAPI.cs | 81 + .../Events/PlayFabEventsInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Events/PlayFabEventsModels.cs | 89 + .../Events/PlayFabEventsModels.cs.meta | 11 + .../Assets/PlayFabSDK/Experimentation.meta | 8 + .../Experimentation/PlayFabEvents.cs | 36 + .../Experimentation/PlayFabEvents.cs.meta | 11 + .../PlayFabExperimentationAPI.cs | 208 + .../PlayFabExperimentationAPI.cs.meta | 11 + .../PlayFabExperimentationInstanceAPI.cs | 200 + .../PlayFabExperimentationInstanceAPI.cs.meta | 11 + .../PlayFabExperimentationModels.cs | 670 ++ .../PlayFabExperimentationModels.cs.meta | 11 + .../Assets/PlayFabSDK/Groups.meta | 8 + .../Assets/PlayFabSDK/Groups/PlayFabEvents.cs | 60 + .../PlayFabSDK/Groups/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Groups/PlayFabGroupsAPI.cs | 366 + .../Groups/PlayFabGroupsAPI.cs.meta | 11 + .../Groups/PlayFabGroupsInstanceAPI.cs | 334 + .../Groups/PlayFabGroupsInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Groups/PlayFabGroupsModels.cs | 985 +++ .../Groups/PlayFabGroupsModels.cs.meta | 11 + .../Assets/PlayFabSDK/Insights.meta | 8 + .../PlayFabSDK/Insights/PlayFabEvents.cs | 22 + .../PlayFabSDK/Insights/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Insights/PlayFabInsightsAPI.cs | 119 + .../Insights/PlayFabInsightsAPI.cs.meta | 11 + .../Insights/PlayFabInsightsInstanceAPI.cs | 125 + .../PlayFabInsightsInstanceAPI.cs.meta | 11 + .../Insights/PlayFabInsightsModels.cs | 235 + .../Insights/PlayFabInsightsModels.cs.meta | 11 + .../Assets/PlayFabSDK/Localization.meta | 8 + .../PlayFabSDK/Localization/PlayFabEvents.cs | 12 + .../Localization/PlayFabEvents.cs.meta | 11 + .../Localization/PlayFabLocalizationAPI.cs | 52 + .../PlayFabLocalizationAPI.cs.meta | 11 + .../PlayFabLocalizationInstanceAPI.cs | 68 + .../PlayFabLocalizationInstanceAPI.cs.meta | 11 + .../Localization/PlayFabLocalizationModels.cs | 26 + .../PlayFabLocalizationModels.cs.meta | 11 + .../Assets/PlayFabSDK/Matchmaker.meta | 9 + .../PlayFabSDK/Matchmaker/PlayFabEvents.cs | 18 + .../Matchmaker/PlayFabEvents.cs.meta | 11 + .../Matchmaker/PlayFabMatchmakerAPI.cs | 88 + .../Matchmaker/PlayFabMatchmakerAPI.cs.meta | 12 + .../PlayFabMatchmakerInstanceAPI.cs | 98 + .../PlayFabMatchmakerInstanceAPI.cs.meta | 11 + .../Matchmaker/PlayFabMatchmakerModels.cs | 229 + .../PlayFabMatchmakerModels.cs.meta | 12 + .../Assets/PlayFabSDK/Multiplayer.meta | 8 + .../PlayFabSDK/Multiplayer/PlayFabEvents.cs | 170 + .../Multiplayer/PlayFabEvents.cs.meta | 11 + .../Multiplayer/PlayFabMultiplayerAPI.cs | 1088 +++ .../Multiplayer/PlayFabMultiplayerAPI.cs.meta | 11 + .../PlayFabMultiplayerInstanceAPI.cs | 946 ++ .../PlayFabMultiplayerInstanceAPI.cs.meta | 11 + .../Multiplayer/PlayFabMultiplayerModels.cs | 4905 +++++++++++ .../PlayFabMultiplayerModels.cs.meta | 11 + .../Assets/PlayFabSDK/PlayFab.asmdef | 12 + .../Assets/PlayFabSDK/PlayFab.asmdef.meta | 7 + .../Assets/PlayFabSDK/Profiles.meta | 8 + .../PlayFabSDK/Profiles/PlayFabEvents.cs | 26 + .../PlayFabSDK/Profiles/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Profiles/PlayFabProfilesAPI.cs | 145 + .../Profiles/PlayFabProfilesAPI.cs.meta | 11 + .../Profiles/PlayFabProfilesInstanceAPI.cs | 147 + .../PlayFabProfilesInstanceAPI.cs.meta | 11 + .../Profiles/PlayFabProfilesModels.cs | 495 ++ .../Profiles/PlayFabProfilesModels.cs.meta | 11 + .../Assets/PlayFabSDK/Server.meta | 9 + .../Assets/PlayFabSDK/Server/PlayFabEvents.cs | 292 + .../PlayFabSDK/Server/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Server/PlayFabServerAPI.cs | 1953 +++++ .../Server/PlayFabServerAPI.cs.meta | 12 + .../Server/PlayFabServerInstanceAPI.cs | 1692 ++++ .../Server/PlayFabServerInstanceAPI.cs.meta | 11 + .../PlayFabSDK/Server/PlayFabServerModels.cs | 7306 ++++++++++++++++ .../Server/PlayFabServerModels.cs.meta | 12 + .../Assets/PlayFabSDK/Shared.meta | 9 + .../Assets/PlayFabSDK/Shared/Editor.meta | 5 + .../Shared/Editor/MakeSharedSettingsObj.cs | 21 + .../Editor/MakeSharedSettingsObj.cs.meta | 11 + .../PlayFabSDK/Shared/Editor/PlayFabHelp.cs | 38 + .../Shared/Editor/PlayFabHelp.cs.meta | 8 + .../Shared/Editor/PlayFabSdkEditor.asmdef | 16 + .../Editor/PlayFabSdkEditor.asmdef.meta | 7 + .../PlayFabSDK/Shared/Editor/PlayFablogo.png | Bin 0 -> 3521 bytes .../Shared/Editor/PlayFablogo.png.meta | 91 + .../Assets/PlayFabSDK/Shared/Internal.meta | 5 + .../PlayFabSDK/Shared/Internal/ISerializer.cs | 108 + .../Shared/Internal/ISerializer.cs.meta | 12 + .../Assets/PlayFabSDK/Shared/Internal/Log.cs | 44 + .../PlayFabSDK/Shared/Internal/Log.cs.meta | 12 + .../Shared/Internal/PlayFabErrors.cs | 808 ++ .../Shared/Internal/PlayFabErrors.cs.meta | 12 + .../Shared/Internal/PlayFabHttp.meta | 9 + .../Internal/PlayFabHttp/IPlayFabHttp.cs | 60 + .../Internal/PlayFabHttp/IPlayFabHttp.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabHTTP.cs | 500 ++ .../Internal/PlayFabHttp/PlayFabHTTP.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabUnityHttp.cs | 243 + .../PlayFabHttp/PlayFabUnityHttp.cs.meta | 13 + .../Shared/Internal/PlayFabHttp/PlayFabWWW.cs | 219 + .../Internal/PlayFabHttp/PlayFabWWW.cs.meta | 12 + .../Internal/PlayFabHttp/PlayFabWebRequest.cs | 544 ++ .../PlayFabHttp/PlayFabWebRequest.cs.meta | 12 + .../PlayFabSDK/Shared/Internal/SimpleJson.cs | 2081 +++++ .../Shared/Internal/SimpleJson.cs.meta | 12 + .../Shared/Internal/SingletonMonoBehaviour.cs | 58 + .../Internal/SingletonMonoBehaviour.cs.meta | 12 + .../Assets/PlayFabSDK/Shared/Internal/Util.cs | 157 + .../PlayFabSDK/Shared/Internal/Util.cs.meta | 12 + .../Internal/wsaReflectionExtensions.cs | 66 + .../Internal/wsaReflectionExtensions.cs.meta | 12 + .../Assets/PlayFabSDK/Shared/Models.meta | 9 + .../Shared/Models/PlayFabSharedSettings.cs | 34 + .../Models/PlayFabSharedSettings.cs.meta | 12 + .../PlayFabSDK/Shared/Models/SharedModels.cs | 44 + .../Shared/Models/SharedModels.cs.meta | 12 + .../Assets/PlayFabSDK/Shared/Public.meta | 9 + .../Shared/Public/IPlayFabPlugin.cs | 9 + .../Shared/Public/IPlayFabPlugin.cs.meta | 11 + .../Shared/Public/ISerializerPlugin.cs | 15 + .../Shared/Public/ISerializerPlugin.cs.meta | 11 + .../Shared/Public/ITransportPlugin.cs | 27 + .../Shared/Public/ITransportPlugin.cs.meta | 11 + .../Shared/Public/PlayFabApiSettings.cs | 84 + .../Shared/Public/PlayFabApiSettings.cs.meta | 11 + .../Public/PlayFabAuthenticationContext.cs | 77 + .../PlayFabAuthenticationContext.cs.meta | 11 + .../Shared/Public/PlayFabDataGatherer.cs | 138 + .../Shared/Public/PlayFabDataGatherer.cs.meta | 12 + .../PlayFabSDK/Shared/Public/PlayFabEvents.cs | 3275 +++++++ .../Shared/Public/PlayFabEvents.cs.meta | 11 + .../PlayFabSDK/Shared/Public/PlayFabLogger.cs | 270 + .../Shared/Public/PlayFabLogger.cs.meta | 12 + .../Shared/Public/PlayFabSettings.cs | 222 + .../Shared/Public/PlayFabSettings.cs.meta | 12 + .../Shared/Public/PluginContract.cs | 8 + .../Shared/Public/PluginContract.cs.meta | 11 + .../Shared/Public/PluginContractKey.cs | 23 + .../Shared/Public/PluginContractKey.cs.meta | 11 + .../PlayFabSDK/Shared/Public/PluginManager.cs | 110 + .../Shared/Public/PluginManager.cs.meta | 11 + .../PlayFabSDK/Shared/Public/Resources.meta | 9 + .../Resources/PlayFabSharedSettings.asset | 27 + .../PlayFabSharedSettings.asset.meta | 8 + .../Assets/PlayFabSDK/link.xml | 19 + .../Assets/PlayFabSDK/link.xml.meta | 8 + .../PlayFabEconomyV2/Assets/Resources.meta | 8 + .../Assets/Resources/BillingMode.json | 1 + .../Assets/Resources/BillingMode.json.meta | 7 + .../Unity/PlayFabEconomyV2/Assets/Scenes.meta | 8 + .../Assets/Scenes/SampleScene.unity | 253 + .../Assets/Scenes/SampleScene.unity.meta | 7 + ...hadercompiler-UnityShaderCompiler.exe0.log | 3 + .../arm64-v8a/lib_burst_generated.txt | 182 + .../ProjectSettings/AudioManager.asset | 19 + .../BurstAotSettings_Android.json | 14 + .../ProjectSettings/ClusterInputManager.asset | 6 + .../CommonBurstAotSettings.json | 6 + .../ProjectSettings/DynamicsManager.asset | 37 + .../ProjectSettings/EditorBuildSettings.asset | 11 + .../ProjectSettings/EditorSettings.asset | 40 + .../ProjectSettings/GraphicsSettings.asset | 64 + .../ProjectSettings/InputManager.asset | 487 ++ .../ProjectSettings/MemorySettings.asset | 35 + .../ProjectSettings/NavMeshAreas.asset | 93 + .../ProjectSettings/NetworkManager.asset | 8 + .../PackageManagerSettings.asset | 44 + .../ProjectSettings/Physics2DSettings.asset | 56 + .../ProjectSettings/PresetManager.asset | 7 + .../ProjectSettings/ProjectSettings.asset | 789 ++ .../ProjectSettings/ProjectVersion.txt | 2 + .../ProjectSettings/QualitySettings.asset | 225 + .../SceneTemplateSettings.json | 167 + .../ProjectSettings/TagManager.asset | 43 + .../ProjectSettings/TimeManager.asset | 9 + .../ProjectSettings/TimelineSettings.asset | 16 + .../UnityConnectSettings.asset | 36 + .../ProjectSettings/VFXManager.asset | 14 + .../VersionControlSettings.asset | 8 + .../ProjectSettings/XRSettings.asset | 10 + .../ProjectSettings/boot.config | 0 .../UserSettings/EditorUserSettings.asset | 28 + .../UserSettings/Layouts/default-2021.dwlt | 1062 +++ .../UserSettings/Search.settings | 1 + 395 files changed, 81836 insertions(+) create mode 100644 Samples/Unity/PlayFabEconomyV2/.vsconfig create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.Identity.Client.dll create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.Identity.Client.dll.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Clients.ActiveDirectory.dll create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Clients.ActiveDirectory.dll.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.JsonWebTokens.dll create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.JsonWebTokens.dll.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Logging.dll create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Logging.dll.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Tokens.dll create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Tokens.dll.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/System.IdentityModel.Tokens.Jwt.dll create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/System.IdentityModel.Tokens.Jwt.dll.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/azure-playfab-logo.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/azure-playfab-logo.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/green.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/green.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/Resources.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/Scenes.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity create mode 100644 Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity.meta create mode 100644 Samples/Unity/PlayFabEconomyV2/Logs/shadercompiler-UnityShaderCompiler.exe0.log create mode 100644 Samples/Unity/PlayFabEconomyV2/PlayFabEconomyV2Sample_BurstDebugInformation_DoNotShip/tempburstlibs/arm64-v8a/lib_burst_generated.txt create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/AudioManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/BurstAotSettings_Android.json create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/ClusterInputManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/CommonBurstAotSettings.json create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/DynamicsManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorBuildSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/GraphicsSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/InputManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/MemorySettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/NavMeshAreas.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/NetworkManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/PackageManagerSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/Physics2DSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/PresetManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectVersion.txt create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/QualitySettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/SceneTemplateSettings.json create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/TagManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimeManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimelineSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/UnityConnectSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/VFXManager.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/VersionControlSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/XRSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/ProjectSettings/boot.config create mode 100644 Samples/Unity/PlayFabEconomyV2/UserSettings/EditorUserSettings.asset create mode 100644 Samples/Unity/PlayFabEconomyV2/UserSettings/Layouts/default-2021.dwlt create mode 100644 Samples/Unity/PlayFabEconomyV2/UserSettings/Search.settings diff --git a/Samples/Unity/PlayFabEconomyV2/.vsconfig b/Samples/Unity/PlayFabEconomyV2/.vsconfig new file mode 100644 index 00000000..d70cd98b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/.vsconfig @@ -0,0 +1,6 @@ +{ + "version": "1.0", + "components": [ + "Microsoft.VisualStudio.Workload.ManagedGame" + ] +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs b/Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs new file mode 100644 index 00000000..5a459513 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs @@ -0,0 +1,527 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +using Unity.VisualScripting; +using UnityEngine; +using UnityEngine.Purchasing; +using UnityEngine.Purchasing.Extension; + +using PlayFab; +using PlayFab.ClientModels; +using PlayFab.EconomyModels; + +using CatalogItem = PlayFab.EconomyModels.CatalogItem; + +/** + * Unity behavior that implements the the Unity IAP Store interface. + * + * Attach as an asset to your Scene. + */ +public class AndroidIAPExample : MonoBehaviour, IDetailedStoreListener +{ + + // Bundles for sale on the Google Play Store. + private Dictionary GooglePlayCatalog; + + // In-game items for sale at the example vendor. + private Dictionary StorefrontCatalog; + + private string purchaseIdempotencyId = null; + + private PlayFabEconomyAPIAsyncResult lastAPICallResult = null; + + private static PlayFabEconomyAPIAsync economyAPI = new(); + + private static IStoreController m_StoreController; + + /** + * True if the Store Controller, extensions, and Catalog are set. + */ + public bool IsInitialized + { + get + { + return m_StoreController != null + && GooglePlayCatalog != null + && StorefrontCatalog != null; + } + } + + /** + * Returns false as this is just sample code. + * + * @todo Implement this functionality for your game. + */ + public bool UserHasExistingSave + { + get + { + return false; + } + } + + /** + * Integrates game purchasing with the Unity IAP API. + */ + public void BuyProductByID(string productID) + { + if (!IsInitialized) throw new Exception("IAP Service is not initialized!"); + + m_StoreController.InitiatePurchase(productID); + } + + /** + * Purchases a PlayFab inventory item by ID. + * + * @see the PlayFabEconomyAPIAsync class for details on error handling + * and calling patterns. + */ + async public Task PlayFabPurchaseItemByID(string itemID, PlayFabEconomyAPIAsyncResult result) + { + if (!IsInitialized) throw new Exception("IAP Service is not initialized!"); + + Debug.Log("Player buying product " + itemID); + + if (string.IsNullOrEmpty(purchaseIdempotencyId)) + { + purchaseIdempotencyId = Guid.NewGuid().ToString(); + } + + GetItemRequest getVillagerStoreRequest = new GetItemRequest() + { + AlternateId = new CatalogAlternateId() + { + Type = "FriendlyId", + Value = "villagerstore" + } + }; + GetItemResponse getStoreResponse = await economyAPI.getItemAsync(getVillagerStoreRequest); + if (getStoreResponse == null || string.IsNullOrEmpty(getStoreResponse?.Item?.Id)) + { + result.error = "Unable to contact the store. Check your internet connection and try again in a few minutes."; + return false; + } + + CatalogPriceAmount price = StorefrontCatalog.FirstOrDefault(item => item.Key == itemID).Value.PriceOptions.Prices.FirstOrDefault().Amounts.FirstOrDefault(); + PurchaseInventoryItemsRequest purchaseInventoryItemsRequest = new PurchaseInventoryItemsRequest() + { + Amount = 1, + Item = new InventoryItemReference() + { + Id = itemID + }, + PriceAmounts = new List + { + new PurchasePriceAmount() + { + Amount = price.Amount, + ItemId = price.ItemId + } + }, + IdempotencyId = purchaseIdempotencyId, + StoreId = getStoreResponse.Item.Id + }; + PurchaseInventoryItemsResponse purchaseInventoryItemsResponse = await economyAPI.purchaseInventoryItemsAsync(purchaseInventoryItemsRequest); + if (purchaseInventoryItemsResponse == null || purchaseInventoryItemsResponse?.TransactionIds.Count < 1) + { + result.error = "Unable to purchase. Try again in a few minutes."; + return false; + } + + purchaseIdempotencyId = ""; + result.message = "Purchasing!"; + return true; + } + + private void InitializePurchasing() + { + if (IsInitialized) return; + + var builder = ConfigurationBuilder.Instance(StandardPurchasingModule.Instance(AppStore.GooglePlay)); + + foreach (CatalogItem item in GooglePlayCatalog.Values) + { + var googlePlayItemId = item.AlternateIds.FirstOrDefault(item => item.Type == "GooglePlay")?.Value; + if (!googlePlayItemId.IsUnityNull()) { + builder.AddProduct(googlePlayItemId, ProductType.Consumable); + } + } + + UnityPurchasing.Initialize(this, builder); + } + + /** + * Attempts to log the player in via the Android Device ID. + */ + private void Login() + { + // Best practice is to soft-login with a unique ID, then prompt the player to finish + // creating a PlayFab account in order to retrive cross-platform saves or other benefits. + if (UserHasExistingSave) + { + // @todo Integrate this with the save system. + LoginWithPlayFabRequest loginWithPlayFabRequest = new() + { + Username = "", + Password = "" + }; + PlayFabClientAPI.LoginWithPlayFab(loginWithPlayFabRequest, OnRegistration, OnPlayFabError); + return; + } + + // AndroidDeviceID will prompt for permissions on newer devices. + // Using a non-device specific GUID and saving to a local file + // is a better approach. PlayFab does allow you to link multiple + // Android device IDs to a single PlayFab account. + PlayFabClientAPI.LoginWithAndroidDeviceID(new LoginWithAndroidDeviceIDRequest() + { + CreateAccount = true, + AndroidDeviceId = SystemInfo.deviceUniqueIdentifier + }, result => { + RefreshIAPItems(); + }, error => Debug.LogError(error.GenerateErrorReport())); + } + + /** + * Draw a debug IMGUI for testing examples. + * + * Use UI Toolkit for your production game runtime UI instead. + */ + public void OnGUI() + { + // Support high-res devices. + GUI.matrix = Matrix4x4.TRS(new Vector3(0, 0, 0), Quaternion.identity, new Vector3(3, 3, 3)); + + if (!IsInitialized) + { + GUILayout.Label("Initializing IAP and logging in..."); + return; + } + + if (!string.IsNullOrEmpty(purchaseIdempotencyId) + && (!string.IsNullOrEmpty(lastAPICallResult?.message) + || !string.IsNullOrEmpty(lastAPICallResult?.error))) + { + GUILayout.Label(lastAPICallResult?.message + lastAPICallResult?.error); + } + + GUILayout.Label("Shop for game currency bundles."); + // Draw a purchase menu for each catalog item. + foreach (CatalogItem item in GooglePlayCatalog.Values) + { + // Use a dictionary to select the proper language. + if (GUILayout.Button("Get " + (item.Title.ContainsKey("en-US") ? item.Title["en-US"] : item.Title["NEUTRAL"]))) + { + BuyProductByID(item.AlternateIds.FirstOrDefault(item => item.Type == "GooglePlay").Value); + } + } + + GUILayout.Label("Hmmm. (Translation: Welcome to my humble Villager store.)"); + // Draw a purchase menu for each catalog item. + foreach (CatalogItem item in StorefrontCatalog.Values) + { + // Use a dictionary to select the proper language. + if (GUILayout.Button("Buy " + + (item.Title.ContainsKey("en-US") ? item.Title["en-US"] : item.Title["NEUTRAL"] + + ": " + + item.PriceOptions.Prices.FirstOrDefault().Amounts.FirstOrDefault().Amount.ToString() + + " Diamonds" + ))) + { + PlayFabPurchaseItemByID(item.Id, lastAPICallResult); + } + } + } + + private void OnRegistration(LoginResult result) + { + PlayFabSettings.staticPlayer.ClientSessionTicket = result.SessionTicket; + } + + public void OnInitialized(IStoreController controller, IExtensionProvider extensions) + { + m_StoreController = controller; + } + + public void OnInitializeFailed(InitializationFailureReason error) + { + Debug.Log("OnInitializeFailed InitializationFailureReason:" + error); + } + + public void OnInitializeFailed(InitializationFailureReason error, string message) + { + Debug.Log("OnInitializeFailed InitializationFailureReason:" + error + message); + } + + private void OnPlayFabError(PlayFabError error) + { + Debug.LogError(error.GenerateErrorReport()); + } + + public void OnPurchaseFailed(UnityEngine.Purchasing.Product product, PurchaseFailureReason failureReason) + { + Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", + product.definition.storeSpecificId, failureReason)); + } + + public void OnPurchaseFailed(UnityEngine.Purchasing.Product product, PurchaseFailureDescription failureDescription) + { + Debug.Log(string.Format("OnPurchaseFailed: FAIL. Product: '{0}', PurchaseFailureReason: {1}", + product.definition.storeSpecificId, failureDescription)); + } + + /** + * Callback for Store purchases. + * + * @note This code does not account for purchases that were pending and are + * delivered on application start. Production code should account for these + * cases. + * + * @see https://docs.unity3d.com/Packages/com.unity.purchasing@4.8/api/UnityEngine.Purchasing.PurchaseProcessingResult.html + */ + public PurchaseProcessingResult ProcessPurchase(PurchaseEventArgs purchaseEvent) + { + if (!IsInitialized) + { + return PurchaseProcessingResult.Complete; + } + + if (purchaseEvent.purchasedProduct == null) + { + Debug.LogWarning("Attempted to process purchase with unknown product. Ignoring."); + return PurchaseProcessingResult.Complete; + } + + if (string.IsNullOrEmpty(purchaseEvent.purchasedProduct.receipt)) + { + Debug.LogWarning("Attempted to process purchase with no receipt. Ignoring."); + return PurchaseProcessingResult.Complete; + } + + Debug.Log("Attempting purchase with receipt " + purchaseEvent.purchasedProduct.receipt.Serialize().ToString()); + RedeemGooglePlayInventoryItemsRequest request = new() + { + Purchases = new List { + new GooglePlayProductPurchase() { + ProductId = purchaseEvent.purchasedProduct.receipt, + Token = GooglePurchase.FromJson(purchaseEvent.purchasedProduct.receipt).PayloadData?.signature + } + } + }; + RedeemGooglePlayInventoryItemsResponse redeemResponse = new(); + PlayFabEconomyAPI.RedeemGooglePlayInventoryItems(request, result => { + redeemResponse = result; + Debug.Log("Processed receipt validation."); + }, + error => Debug.Log("Validation failed: " + error.GenerateErrorReport())); + if (redeemResponse?.Failed.Count > 0) + { + Debug.Log("Validation failed for " + redeemResponse.Failed.Count + " receipts."); + Debug.Log(redeemResponse.Failed.Serialize().ToSafeString()); + } + else + { + Debug.Log("Validation succeeded!"); + } + + return PurchaseProcessingResult.Complete; + } + + /** + * Queries the PlayFab Economy Catalog V2 for updated listings + * and then fills the local catalog objects. + */ + private async void RefreshIAPItems() + { + GooglePlayCatalog = new Dictionary(); + SearchItemsRequest playCatalogRequest = new() + { + Count = 50, + Filter = "Platforms/any(platform: platform eq 'GooglePlay')" + }; + SearchItemsResponse playCatalogResponse; + do + { + playCatalogResponse = await economyAPI.searchItemsAsync(playCatalogRequest); + Debug.Log("Search response: " + playCatalogResponse.Serialize().ToSafeString()); + foreach (CatalogItem item in playCatalogResponse.Items) + { + GooglePlayCatalog.Add(item.Id, item); + } + } while (playCatalogResponse.ContinuationToken != null + && playCatalogResponse.ContinuationToken != ""); + Debug.Log("Completed pulling from PlayFab Economy v2 googleplay Catalog: " + + GooglePlayCatalog.Count() + + " items retrieved"); + + StorefrontCatalog = new Dictionary(); + GetItemRequest storeCatalogRequest = new() + { + AlternateId = new CatalogAlternateId() + { + Type = "FriendlyId", + Value = "villagerstore" + } + }; + GetItemResponse storeCatalogResponse; + storeCatalogResponse = await economyAPI.getItemAsync(storeCatalogRequest); + List itemIds = new() { }; + foreach (CatalogItemReference item in storeCatalogResponse.Item.ItemReferences) + { + itemIds.Add(item.Id); + } + GetItemsRequest itemsCatalogRequest = new() + { + Ids = itemIds + }; + GetItemsResponse itemsCatalogResponse = await economyAPI.getItemsAsync(itemsCatalogRequest); + foreach (CatalogItem item in itemsCatalogResponse.Items) + { + StorefrontCatalog.Add(item.Id, item); + } + Debug.Log("Completed pulling from PlayFab Economy v2 villagerstore store: " + + StorefrontCatalog.Count() + + " items retrieved"); + + InitializePurchasing(); + } + + // Start is called before the first frame update. + public void Start() + { + Login(); + } + + // Update is called once per frame. + public void Update() { } +} + +// Utility classes for the sample. +public class PlayFabEconomyAPIAsyncResult +{ + public string error = null; + + public string message = null; +} + +/** + * Example Async wrapper for PlayFab API's. + * + * This is just a quick sample for example purposes. + * + * Write your own customer Logger implementation to log and handle errors + * for user-facing scenarios. Use tags and map which PlayFab errors require your + * game to handle GUI or gameplay updates vs which should be logged to crash and + * error reporting services. + */ +public class PlayFabEconomyAPIAsync +{ + // @see https://learn.microsoft.com/en-us/rest/api/playfab/economy/catalog/get-item + private TaskCompletionSource getItemAsyncTaskSource; + + public void onGetItemRequestComplete(GetItemResponse response) + { + getItemAsyncTaskSource.SetResult(response); + } + + public Task getItemAsync(GetItemRequest request) + { + getItemAsyncTaskSource = new(); + PlayFabEconomyAPI.GetItem(request, onGetItemRequestComplete, error => Debug.LogError(error.GenerateErrorReport())); + return getItemAsyncTaskSource.Task; + } + + // @see https://learn.microsoft.com/en-us/rest/api/playfab/economy/catalog/get-items + private TaskCompletionSource getItemsAsyncTaskSource; + + public void onGetItemsRequestComplete(GetItemsResponse response) + { + getItemsAsyncTaskSource.SetResult(response); + } + + public Task getItemsAsync(GetItemsRequest request) + { + getItemsAsyncTaskSource = new(); + PlayFabEconomyAPI.GetItems(request, onGetItemsRequestComplete, error => Debug.LogError(error.GenerateErrorReport())); + return getItemsAsyncTaskSource.Task; + } + + // @see https://learn.microsoft.com/en-us/rest/api/playfab/economy/inventory/purchase-inventory-items + private TaskCompletionSource purchaseInventoryItemsAsyncTaskSource; + + public void OnPurchaseInventoryItemsRequestComplete(PurchaseInventoryItemsResponse response) + { + purchaseInventoryItemsAsyncTaskSource.SetResult(response); + } + + public Task purchaseInventoryItemsAsync(PurchaseInventoryItemsRequest request) + { + purchaseInventoryItemsAsyncTaskSource = new(); + PlayFabEconomyAPI.PurchaseInventoryItems(request, + OnPurchaseInventoryItemsRequestComplete, + error => { Debug.LogError(error.GenerateErrorReport()); }); + return purchaseInventoryItemsAsyncTaskSource.Task; + } + + // @see https://learn.microsoft.com/en-us/rest/api/playfab/economy/catalog/search-items + private TaskCompletionSource searchItemsAsyncTaskSource; + + public void OnSearchItemsRequestComplete(SearchItemsResponse response) + { + searchItemsAsyncTaskSource.SetResult(response); + } + + public Task searchItemsAsync(SearchItemsRequest request) { + searchItemsAsyncTaskSource = new(); + PlayFabEconomyAPI.SearchItems(request, OnSearchItemsRequestComplete, error => Debug.LogError(error.GenerateErrorReport())); + return searchItemsAsyncTaskSource.Task; + } +} + +public class PurchaseJsonData +{ + public string orderId; + public string packageName; + public string productId; + public long purchaseTime; + public int purchaseState; + public string purchaseToken; +} + +public class PurchasePayloadData +{ + public PurchaseJsonData JsonData; + + public string signature; + public string json; + + public static PurchasePayloadData FromJson(string json) + { + var payload = JsonUtility.FromJson(json); + payload.JsonData = JsonUtility.FromJson(json); + return payload; + } +} + +public class GooglePurchase +{ + public PurchasePayloadData PayloadData; + + public string Store; + public string TransactionID; + public string Payload; + + public static GooglePurchase FromJson(string json) + { + var purchase = JsonUtility.FromJson(json); + // Only fake receipts are returned in Editor play. + if (Application.isEditor) + { + return purchase; + } + purchase.PayloadData = PurchasePayloadData.FromJson(purchase.Payload); + return purchase; + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs.meta new file mode 100644 index 00000000..f50382d3 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/AndroidIAPExample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a84ea2cc254a5b4ab57e898fb31f9ea +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions.meta new file mode 100644 index 00000000..b0a06f56 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e6b6b62449f1f4ed1bdf033d7f2d2ccf +folderAsset: yes +timeCreated: 1470764459 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor.meta new file mode 100644 index 00000000..7e91acb9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c897fef01cc7d7d4a84f9f114b5133c6 +folderAsset: yes +timeCreated: 1466049927 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs new file mode 100644 index 00000000..3abb445c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs @@ -0,0 +1,445 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditor : UnityEditor.EditorWindow + { +#if !UNITY_5_3_OR_NEWER + public GUIContent titleContent; +#endif + + #region EdEx Variables + // vars for the plugin-wide event system + public enum EdExStates { OnLogin, OnLogout, OnMenuItemClicked, OnSubmenuItemClicked, OnHttpReq, OnHttpRes, OnError, OnSuccess, OnWarning } + + public delegate void PlayFabEdExStateHandler(EdExStates state, string status, string misc); + public static event PlayFabEdExStateHandler EdExStateUpdate; + + public static Dictionary blockingRequests = new Dictionary(); // key and blockingRequest start time + private static float blockingRequestTimeOut = 10f; // abandon the block after this many seconds. + + public static string latestEdExVersion = string.Empty; + + internal static PlayFabEditor window; + #endregion + + #region unity lopps & methods + void OnEnable() + { + if (window == null) + { + window = this; + window.minSize = new Vector2(320, 0); + } + + if (!IsEventHandlerRegistered(StateUpdateHandler)) + { + EdExStateUpdate += StateUpdateHandler; + } + + PlayFabEditorDataService.RefreshStudiosList(true); + GetLatestEdExVersion(); + } + + void OnDisable() + { + // clean up objects: + PlayFabEditorPrefsSO.Instance.PanelIsShown = false; + + if (IsEventHandlerRegistered(StateUpdateHandler)) + { + EdExStateUpdate -= StateUpdateHandler; + } + } + + void OnFocus() + { + OnEnable(); + } + + [MenuItem("Window/PlayFab/Editor Extensions")] + static void PlayFabServices() + { + var editorAsm = typeof(UnityEditor.Editor).Assembly; + var inspWndType = editorAsm.GetType("UnityEditor.SceneHierarchyWindow"); + + if (inspWndType == null) + { + inspWndType = editorAsm.GetType("UnityEditor.InspectorWindow"); + } + + window = GetWindow(inspWndType); + window.titleContent = new GUIContent("PlayFab EdEx"); + PlayFabEditorPrefsSO.Instance.PanelIsShown = true; + } + + [MenuItem("Window/PlayFab/Forum")] + static void PlayFabForums() + { + Application.OpenURL("https://community.playfab.com/index.html"); + } + + [MenuItem("Window/PlayFab/Provide Feedback")] + static void PlayFabFeedback() + { + Application.OpenURL("https://community.playfab.com/index.html"); + } + + [InitializeOnLoad] + public static class Startup + { + static Startup() + { + if (PlayFabEditorPrefsSO.Instance.PanelIsShown || !PlayFabEditorSDKTools.IsInstalled) + { + EditorCoroutine.Start(OpenPlayServices()); + } + } + } + + static IEnumerator OpenPlayServices() + { + yield return new WaitForSeconds(1f); + if (!Application.isPlaying) + { + PlayFabServices(); + } + } + + private void OnGUI() + { + HideRepaintErrors(OnGuiInternal); + } + + private void OnGuiInternal() + { + GUI.skin = PlayFabEditorHelper.uiStyle; + + using (new UnityVertical()) + { + //Run all updaters prior to drawing; + PlayFabEditorHeader.DrawHeader(); + + GUI.enabled = blockingRequests.Count == 0 && !EditorApplication.isCompiling; + + if (PlayFabEditorAuthenticate.IsAuthenticated()) + { + PlayFabEditorMenu.DrawMenu(); + + switch (PlayFabEditorMenu._menuState) + { + case PlayFabEditorMenu.MenuStates.Sdks: + PlayFabEditorSDKTools.DrawSdkPanel(); + break; + case PlayFabEditorMenu.MenuStates.Settings: + PlayFabEditorSettings.DrawSettingsPanel(); + break; + case PlayFabEditorMenu.MenuStates.Help: + PlayFabEditorHelpMenu.DrawHelpPanel(); + break; + case PlayFabEditorMenu.MenuStates.Data: + PlayFabEditorDataMenu.DrawDataPanel(); + break; + case PlayFabEditorMenu.MenuStates.Tools: + PlayFabEditorToolsMenu.DrawToolsPanel(); + break; + case PlayFabEditorMenu.MenuStates.Packages: + PlayFabEditorPackages.DrawPackagesMenu(); + break; + default: + break; + } + } + else + { + PlayFabEditorAuthenticate.DrawAuthPanels(); + } + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"), GUILayout.ExpandHeight(true), GUILayout.ExpandWidth(true))) + { + GUILayout.FlexibleSpace(); + } + + // help tag at the bottom of the help menu. + if (PlayFabEditorMenu._menuState == PlayFabEditorMenu.MenuStates.Help) + { + DisplayHelpMenu(); + } + } + + PruneBlockingRequests(); + + Repaint(); + } + + private static void HideRepaintErrors(Action action) + { + try + { + action(); + } + catch (Exception e) + { + if (!e.Message.ToLower().Contains("repaint")) + throw; + // Hide any repaint issues when recompiling + } + } + + private static void DisplayHelpMenu() + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("PlayFab Editor Extensions: " + PlayFabEditorHelper.EDEX_VERSION, PlayFabEditorHelper.uiStyle.GetStyle("versionText")); + GUILayout.FlexibleSpace(); + } + + //TODO Add plugin upgrade option here (if available); + if (ShowEdExUpgrade()) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("UPGRADE EDEX", PlayFabEditorHelper.uiStyle.GetStyle("textButtonOr"))) + { + UpgradeEdEx(); + } + GUILayout.FlexibleSpace(); + } + } + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("VIEW DOCUMENTATION", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + Application.OpenURL("https://github.com/PlayFab/UnityEditorExtensions"); + } + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REPORT ISSUES", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + Application.OpenURL("https://github.com/PlayFab/UnityEditorExtensions/issues"); + } + GUILayout.FlexibleSpace(); + } + + if (!string.IsNullOrEmpty(PlayFabEditorHelper.EDEX_ROOT)) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("UNINSTALL ", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + RemoveEdEx(); + } + GUILayout.FlexibleSpace(); + } + } + } + } + #endregion + + #region menu and helper methods + public static void RaiseStateUpdate(EdExStates state, string status = null, string json = null) + { + if (EdExStateUpdate != null) + EdExStateUpdate(state, status, json); + } + + private static void PruneBlockingRequests() + { + List itemsToRemove = new List(); + foreach (var req in blockingRequests) + if (req.Value + blockingRequestTimeOut < (float)EditorApplication.timeSinceStartup) + itemsToRemove.Add(req.Key); + + foreach (var item in itemsToRemove) + { + ClearBlockingRequest(item); + RaiseStateUpdate(EdExStates.OnWarning, string.Format(" Request {0} has timed out after {1} seconds.", item, blockingRequestTimeOut)); + } + } + + private static void AddBlockingRequest(string state) + { + blockingRequests[state] = (float)EditorApplication.timeSinceStartup; + } + + private static void ClearBlockingRequest(string state = null) + { + if (state == null) + { + blockingRequests.Clear(); + } + else if (blockingRequests.ContainsKey(state)) + { + blockingRequests.Remove(state); + } + } + + /// + /// Handles state updates within the editor extension. + /// + /// the state that triggered this event. + /// a generic message about the status. + /// a generic container for additional JSON encoded info. + private void StateUpdateHandler(EdExStates state, string status, string json) + { + switch (state) + { + case EdExStates.OnMenuItemClicked: + PlayFabEditorPrefsSO.Instance.curSubMenuIdx = 0; + break; + + case EdExStates.OnSubmenuItemClicked: + int parsed; + if (int.TryParse(json, out parsed)) + PlayFabEditorPrefsSO.Instance.curSubMenuIdx = parsed; + break; + + case EdExStates.OnHttpReq: + object temp; + if (string.IsNullOrEmpty(json) || Json.PlayFabSimpleJson.TryDeserializeObject(json, out temp)) + break; + + var deserialized = temp as Json.JsonObject; + object useSpinner = false; + object blockUi = false; + + if (deserialized.TryGetValue("useSpinner", out useSpinner) && bool.Parse(useSpinner.ToString())) + { + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.spin); + } + + if (deserialized.TryGetValue("blockUi", out blockUi) && bool.Parse(blockUi.ToString())) + { + AddBlockingRequest(status); + } + break; + + case EdExStates.OnHttpRes: + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.off); + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.success); + ClearBlockingRequest(status); + break; + + case EdExStates.OnError: + // deserialize and add json details + // clear blocking requests + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.error); + ClearBlockingRequest(); + Debug.LogError(string.Format("PlayFab EditorExtensions: Caught an error:{0}", status)); + break; + + case EdExStates.OnWarning: + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.warning); + ClearBlockingRequest(); + Debug.LogWarning(string.Format("PlayFab EditorExtensions: {0}", status)); + break; + + case EdExStates.OnSuccess: + ClearBlockingRequest(); + ProgressBar.UpdateState(ProgressBar.ProgressBarStates.success); + break; + } + } + + public static bool IsEventHandlerRegistered(PlayFabEdExStateHandler prospectiveHandler) + { + if (EdExStateUpdate == null) + return false; + + foreach (PlayFabEdExStateHandler existingHandler in EdExStateUpdate.GetInvocationList()) + if (existingHandler == prospectiveHandler) + return true; + return false; + } + + private static void GetLatestEdExVersion() + { + var threshold = PlayFabEditorPrefsSO.Instance.EdSet_lastEdExVersionCheck != DateTime.MinValue ? PlayFabEditorPrefsSO.Instance.EdSet_lastEdExVersionCheck.AddHours(1) : DateTime.MinValue; + + if (DateTime.Today > threshold) + { + PlayFabEditorHttp.MakeGitHubApiCall("https://api.github.com/repos/PlayFab/UnitySDK/git/refs/tags", (version) => + { + latestEdExVersion = version ?? "Unknown"; + PlayFabEditorPrefsSO.Instance.EdSet_latestEdExVersion = latestEdExVersion; + }); + } + else + { + latestEdExVersion = PlayFabEditorPrefsSO.Instance.EdSet_latestEdExVersion; + } + } + + private static bool ShowEdExUpgrade() + { + if (string.IsNullOrEmpty(latestEdExVersion) || latestEdExVersion == "Unknown") + return false; + + if (string.IsNullOrEmpty(PlayFabEditorHelper.EDEX_VERSION) || PlayFabEditorHelper.EDEX_VERSION == "Unknown") + return true; + + string[] currrent = PlayFabEditorHelper.EDEX_VERSION.Split('.'); + if (currrent.Length != 3) + return true; + + string[] latest = latestEdExVersion.Split('.'); + return latest.Length != 3 + || int.Parse(latest[0]) > int.Parse(currrent[0]) + || int.Parse(latest[1]) > int.Parse(currrent[1]) + || int.Parse(latest[2]) > int.Parse(currrent[2]); + } + + private static void RemoveEdEx(bool prompt = true) + { + if (prompt && !EditorUtility.DisplayDialog("Confirm Editor Extensions Removal", "This action will remove PlayFab Editor Extensions from the current project.", "Confirm", "Cancel")) + return; + + try + { + window.Close(); + var edExRoot = new DirectoryInfo(PlayFabEditorHelper.EDEX_ROOT); + FileUtil.DeleteFileOrDirectory(edExRoot.Parent.FullName); + AssetDatabase.Refresh(); + } + catch (Exception ex) + { + RaiseStateUpdate(EdExStates.OnError, ex.Message); + } + } + + private static void UpgradeEdEx() + { + if (EditorUtility.DisplayDialog("Confirm EdEx Upgrade", "This action will remove the current PlayFab Editor Extensions and install the lastet version.", "Confirm", "Cancel")) + { + window.Close(); + ImportLatestEdEx(); + } + } + + private static void ImportLatestEdEx() + { + PlayFabEditorHttp.MakeDownloadCall("https://aka.ms/PlayFabUnityEdEx", (fileName) => + { + AssetDatabase.ImportPackage(fileName, false); + Debug.Log("PlayFab EdEx Upgrade: Complete"); + }); + } + #endregion + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta new file mode 100644 index 00000000..998b68ee --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1c7b3fb0903da7c48a812037b700de8b +timeCreated: 1465552796 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef new file mode 100644 index 00000000..310319d9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef @@ -0,0 +1,14 @@ +{ + "name": "PlayFabEditorExtensions", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta new file mode 100644 index 00000000..836b2db4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/PlayFabEditorExtensions.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8f342294dfb958a4694b67859092b749 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources.meta new file mode 100644 index 00000000..581dd5d0 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b5f845e2a28cb46429c8d80455086ca1 +folderAsset: yes +timeCreated: 1558474303 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.Identity.Client.dll b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.Identity.Client.dll new file mode 100644 index 0000000000000000000000000000000000000000..5aa3b8c4caf6822c81e308c241d7a67c3235620f GIT binary patch literal 1524176 zcmb@v37i~7*+1S}-P3dIk)7S0nN2pyEP-q)b8L;=64|9-aTse0ELoqjDz`Co^D zmni%_p>x(zbb#;4DLR6`xjAd+u5h28vswUtw;*R7ABMda*lSsd2wejHLn8kEOU}9M z68JA^3G&6fLhk5aFH-NXj8x77Qe|&dm5!C&Ej!38wuSN6q+EB-nYOe2 zj5R4Iwx$^|TZ?UiOA?oaKN(;87uU_F&l(1CzF9yIe@$AawWv|1len|fDVEaC=&dc5 z;||P(Ydc)F6Vu4JTS^3o0^n^3=ycLfd1qI_68YW*`A}48yWCuXoEt~p4Cgl^8Z6g%Q^2%hln1Hl<vZ7^G#N{z-8+4H;7G^rNjse}l=Tx*e(p^dEd8=dNNrGYsV$P1exw^?x}xP+ zzseS}sbZIMMX9#quGvnUn?o%zG)te!p%#wr3V93jl1(HA1b0mOn3Ar2sPh!6)5NW>}Zi)86gT^hWZ=;)#lPe%m5ka$Wj zj-{%KD(L9@QTT;Dls)nQ96nJ61QjO+5yhYqgFY0-dXTY*Vi45f=nscMA7KztHBCTM zY|v0pma@*;ve<-f71*b;GxbsipnQ53$E*VY(HEzcqc3+XHLD`_-8m2yk2Yto2^X(X%#i%c5(Dzsl@$SG`D!r!Gze~i*%jBw$p zpnKTpJpxQ&`3x(_$;TVLpJ?=cveAnHHX8TSjo!~RdOu6=xoZ6ktI~>ujp9BBq&|@H z+@#h|6~?Y?f6|OOx&C&gKaWV|l+uq9D!brx545*AC3njJb6G*7-&mMo>n|YK4xs)b zJcTn=L*ico&Ln=Fnj)l@H2aIgS#bCZQeGBFQno87<&8bwm%%SHFxRfkiFjw&m0jxI zeu!&V(C9YmuTY|MRleW*D&zGlRZx+TdXapMgmv%N>0Mnbuy4StS5Z5CDnCyjMi*qH zylAK#x6{Zpi`r=Xo1jn4XfmE}!P6Xf<3>Hg;0Q7}c7`>UMNiNq^~}~s6L}`u@?(e) zDw@fyX22fG`!?_anQ)N^eag=2V@Pp}ouAjAvGWW1+bd|t8!K1iXXHDGv{~6XNAH7X z#qrX%p1>dkVbiR-Qk=?r9AtV88=%`gyo#AZ30p7Wfu02}4B)Z=qOu77$N&xp@SFf% z96&#SZw}yX0eo)&QG3dPQdWmtP<8IQ2&>g6J$2?-7ep1e-`%rOTg0Y}UL#xEIdT2BWx_6~} zAG#}V4{KUba9>B!j(nFT-KV;`^coVOVsvQ~N>JvIg&kJfE;;s1WxK1`GV;wP%bjm~ zw*sV8musTY4nSKHTBqbVQCcUYwOzf|q|s%YXi~4x{aVdP!_gzc6J#fmtf0DV$HWji zT9BlR89LYThC#1Fa*PX(h5m}RX}Xt|-N^S?Js-l)$WHvE+>s{~#|Xz;gNWX3w≷ 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

{gmDg4K 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

3%kp-Wo_GF((Z>C=0y5XC-w6wf&H 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.Identity.Client.dll.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.Identity.Client.dll.meta new file mode 100644 index 00000000..bfe37d08 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.Identity.Client.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 628e779ffb5c3884ea0277201ef91d55 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Clients.ActiveDirectory.dll b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Clients.ActiveDirectory.dll new file mode 100644 index 0000000000000000000000000000000000000000..186042628c267ee47077c17639a155733358331c GIT binary patch literal 1080680 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 SlH7JBQwk@2V>v_2i>i7Hq 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≤Ga^n|3*w+rig=e;tw(6`dJ5-xid|0Q3z6c_A%J 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.JsonWebTokens.dll.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.JsonWebTokens.dll.meta new file mode 100644 index 00000000..d795b8cf --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.JsonWebTokens.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: dc635884888d7e045a1dd4e25fd07ff5 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Logging.dll b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Logging.dll new file mode 100644 index 0000000000000000000000000000000000000000..8a1fa09b28b2a42e848978f5658edf37d032f5be GIT binary patch literal 30056 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 BRWSen literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Logging.dll.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Logging.dll.meta new file mode 100644 index 00000000..bfcfec4d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Logging.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1f2465a17c679814dbdaa4e061163d82 +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Tokens.dll b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Tokens.dll new file mode 100644 index 0000000000000000000000000000000000000000..aeebb766364df70c15c8b21fedcf92d31ce9e0fd GIT binary patch literal 926112 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

j8CZ;0 zOc&PDk;-O5v|;=tv-ZhZ>On@9D{h$T zt-Zz%)18NOeB;d=7!M+QUv)4({5upXlLLfc6YS4Qs0OwepRd6%@5b3 z;<6Z~%(7Up^Ap963|-Pb4+)I}pMst?4mAP6c_y>Ks^YaP?-w@04r`HB5BMy@0}c?b zHQG9g`S+Rc7WUjH?G_eRkA|yySm_A2u()~YfwXO_>vHM{4 zD?|qQ-IOQuP&`O-2H}lGCmOSM4xkb?2sL-AXx1)l_^H#W)f!%E^v&9(5q}!~O`*Ti zY1Xa`J!P{WaaT3HIB`|Gw&@*!_k&IEe0V?F^v)~Ru7@um5#Y))$U*jzd1vBVY?iRD zR5)QZS0e3%VvR3$%8NjcC!lvZ@!x|%jfwwme2R4|EuId1ig?+S%iURKi}H9I57cTM zNW$3Tgo0m7FYQ1A;VlKNlQdW;dnHOBB@zgmp^e5ZzilbT@RI4fVK%iMM)snL;63@j zB*1dkX9bY5FYuGU`fI?>NY37j6HzCk&8bp1#`j6&u1?JV6*55h_D+Vs@;h9Wiz^K; zZ(Nm&vhC--jjRUTv>09Y`w8@Qh=;o?7+Csw;$E3Y^TwrelEO^YDJa1wxMCT$yvg3#SF*OJT%vMgE4xIkw!D%UTV~D z(ld0V$Dbi=f3z*Mm0AW9eVl5$8!1!nvRj!$C_+wXvV>0jun8qb@5kW_IK@7agpKnd z@`Gx_z(y%ILX6U-uvK`TE$|`PxZVqNo+Hjb(7C1&S~;c>S~-|b|076{Te@G?QI|3W8m~kS&z_uUW5$BnfA*_nj!CS)BVs0IcKt>9S{nvty zlOuT?pOJ-l3YYx)Jy1}lP1&fBbZ*=`AEqVV>yQ@bI`Os$M6Xw{e9Px9OquhR)G#ls zYJRmxL*|b!(#q#ypGVSY!3suWpJ#Re!BN?Obi9yW1M3c$9pLvN{LaSjP58Yn_)c64 zM`5M+1Ay776;OMtd(Z>H##*nP$k@58>P$WWbCps*j_bY~4cIb_J&!Qvy@*N3u1;#( z%I5pR0Y12uEf?gZumF|JnzYmxB;Z!I9Q#O7UT~cOd4enC^B**hdNQO%%Xl@Q=D+_( z1(vSt6R&Px;soS4yI3Q z`VVRP4@T1ipB(43i98TAYFBXJS@yE=nm`P42c~7+Hf1`?Sc`Nk$PaWDdp#CnwR}>Xb0UlFyw-RR_8}5A@ zf68g6embys6@!abZNJZlQc0vOf&<&A;d>BpP{+wO92+`Wp-j1h)g#^cRo5+aRR>B1 zoCSXt?bb2>5>oox@u%cD{y*_W6(0(#n7x(3Gv1r68ZO1UL|gu%)!tC>KdY@Nl^$#B zTQSE*8YdhYV-nk{n5RgiILT|^Wna9(fJT@}YZ6;Hn1!JFaQuThu@m%V{3(K7#Up$D zF9f}o!3%A_-x2I}p)+l|P-%S?3p&)=%6gh0kwXYH)!KqPAPJuV+;d9fxHte`nEPW~ z1T@C0e{BCuBuP3~mB9v~rM`)|q_QsC(oi3_cR1=S9=et3q&~~PhX{uqa#$zI=b8Dd z@I8b$XpB>P-9za9m=CivXA-J7Gg%)38Q~G#TVapjp9Ki~v+*Zg8jI^o!9PX%P7B8} z6aG1ffPA42AI8RxyrAP+iI^OMh^shp-?nUAUXZ8VXj81P^hG+A$;XWY->7fi@=eHp z2b>`D7JS%S3276b6E&n!R z_YJ5(u$!8|N&?S-ECk2lz{~U>W?KniV3lP~Gi}{BG z&ir^M&aEuX#KcOi>Y@6b_St@jU{LBZ8BEF`}Z~1y)Tvd*#JdFxdw%fP^_|SUZ!|yrnso z14Hpa41$)zy2gK}dxuz18Zb-+ZTf`86atwzmI^Xqe*z3{9#Ohs*SY>B_=}e!22F1s z%I$O$^*1ualAewGHF)BF9e>+eUtXaXfAo*zA`})V?H65g2F9iYQo}V_fk0AhUx%V5 zC~Iq}{wT&td3{htWByYsyR+M?=)|hOH&*J+#DZH(N(gAH=Bc1yoHI&-hW11XFUEXO zO=s{*+g>1KK;j4_r6pQW#TBwFKFjRf7aGvkb8vJVS>XP z(Kf+ZTNlnq^@r#~eJ>bjBK}g6p?iJbWe;0kZ4%V529;^*ZNpA@8j{kZ{ z8|&ty9>uq7xS;gILI3rBh=nlK?4PZe<2f4gNZ`~j1x}_v2BC4s71FNaQvl12U)Ncm zi(H&2yoD$@A@z&-<1|($3?6O-%SfBPUV|4gI48HHXiKhyKroH#9++n!3S%N@Dq)<) z-3d%EZ-)tPL;`1u@MBzEhPJ3y@|yEk90N`$vV~({ooyUJoD2{r5l)}lct1o*y!C@`dgF+PnV;U*r+ZwwsQlwS`QTi#Z)^uCn(Zdf zdJDkGf+KQ-P5hc;K)9(a__(~3h7Rfz%NJ=fL8UFI3?>3eEk!Bjrfx>5BbEM92S}VB zB5|bGnPvozpuhwh$g5mv)qdR=vr_~mA_Jptq9Lezujs7MUrk%JrC$hzRXp~NmDf7z z3)7{3JVwqK>Ik7`;cF)<(nbpy*uM`{f)+9P3NX=xBOp4 zz8KUXAVxC9%WK1YanU_i=UKJ4hN+$QHsZ0e(&9LJl6uSDxMt0`*Yze688;J$!R|%i z4v>?wXyE1yuDYT1iIzNee@I4&&Aqle#Sw$CLQ+a9phVQ z0pAdUzm(nXECidbZ@@^ZPvg%f4n~A7VCYd8p7o>gXA{S)*a^W*!8jUl>j3sjNER8~ z$&EkY;I4ffFzOwyfkUr5w%Qke*@X%|Q#%&6P8n zOz}?K&kz}g2`Nx9)J)6@nOG`r6qm^AG(Qwi^w{3pTxgKE6Dips>%_&#yM*z>WqUAQ zpN&p*1JFn|hoYs!ppvWI!JZ*;TS9iaGC_xPj`=9?b`0?*C=-Opnl#|gT#qI#X}7l* za2gC}VpFjZ8T6o<~rFn$&W33BXqy&b4SWQ%I$D(PStVxtI1L~6a!<-iSJT=HGy|HDkwvR@+<`ptG0m!2#Q6vX%{AlYt!J~ z$g9X#DYqp{duUPV_+Yg^j&(Wj!y%A3v*vFE$>TOK)bEA+Mvd?0|v3FwaVM0Rbq)e8Ol~7>_=Cu z&|E!8%7@vajD*=YYbbP|Ug)mE(nCBePcN(-k7NH}Bh@Xmu?uUjJ)4HHinkm{ z^=`#>f3kEzaEKD+Q6hu!*bd7xy~}|SY?{qp-fdFeVD0I!=WXxppoz!`gMva1I-tL7 z;~kh&kC$;q{ZMmKowqaXREr)-d$`a&e!kl#O_o6>q(jl`R&weQe9604dSzuus*;jY zn`(jkf)|iz7R+;~R}tModHDPu#bWyhOS1QTd8ZT}p)|b2^*`u!=kziph8eIPtmssF z7=oE2J4^dWJHxvIXjhnVRT29x2!CrMe3wPMjY*{?twsD>Bm4++c$0yhj(KEqJoDG(g@^Kt;C(%KFn7g_ucOXS3qKNc@4nu0?s$I$?^1>8)hl~iwPmQhoh4~%xdS&~cRdE0 zwi+af6YH*q%}`;slN;2LJZr3d6x@^w)rugIa|+Lnoys%0{+?j?BRT&{ASaoZPs#)r z=OSe!=YWH|s@dHEW2c5!=Bb#>QzxQdHvSYH7D(xDXR(o4K2U{;Sj-uM!nVx#jVU%} zIT0Zsn9nz%7Jn0F0?DXzv)eW|OU8zr5X{`ojH(}FU#2n6aZ!F#ABKm>MI#Kpdk=dg zP(0IaO()YC=uS%;<35|$2|l=^gL>j1kckH& zP~?0pf}lB}Z1E9l0=c$NmX;tT%W9^KHB-i#DN__dcppoPbXUl^S%e=(9QZ zap8^?D=vgp{kVlvL_dyo>9gp7@{r>_!7na9|23wAtyo}3mettA3zc`LK?+=j@mhZe z@Kb*${%j&m2%Xrn)p#<;Z$xkUOBB`AA}36k?;pVdZ^9D6JCd#;T!do>@2^{OiSyNf z6*raI{<}~?-a8zrpoXvYe-&MbRRgq18r9#3n%5qM>np-+TUUqKoZ4`Ex`9TrMU5!z ztABz#)c*=K)W98e&rtdruSVMAL>?_i9Cw(QJND&2HPyvYzaHz(8L|1NcE297kewU!%&41yv%`X zP{t`THb|eM6F>{!k9OvkPCym)0k~i!Re{}`Y`~`6+|pqu?*^N&4%RZV2`k&K>3IF! z=o-{=ZL=1I^_!??4eH5?dG~vuU6}YVf|?>yS7LDgD-l8|>73GABI5YWrTUYA9qn+;pWfoj4GHv!WUx4m_tiO-Ha*Qfu*Ag=i`1aN?YOi^GBc)ilU^L-^&kb@^4`KT zKOxfS5CGcpye*>H%24=l6u*vlp zS%2VEA1oJXOA_Oq6$ai6Y0eYas}#<-HgM9p?eJ}* z&~??GxFA49kmMXx0CP6{#R7AwAfvWDM3=(ezEn!6O#pVEjdwp_jKW^0la1aNicY&?QBs z@Eefe`v6*H!m7Ol2!!aO`Y)^Y%5O9}fR(o+*UhaRTP+PmtKAE|YuV5!LA8r|nfS(c z10(f+!=FGV4^{}ZtzlJB2tqONHN$tfIAE90<#PEtE*MU3VowxrjZDjvXQFG%oxx0} zOQqUdzZoJHxa2sw1mF9jvN6^a4WeHf!A<@Bs3o~=HS`PLLLq_V%P}F8>xSfKeX9}K zz)(P~q*I-)us6n?2_t9p?qv*-2ElL%?<@=#w^(^^$AH4>7w6M$Tt+#?FJ6xZKy}76 zgFZMj2)87+r~2^BAjoM!s^f#=?U;|tn3MG>R&a77Fzf#ZLoa9OF=43x(MI+LbhtP= zS$}hDGThA^gq;^Q;uB%c5!=6(sn<3Ny}l6@)2J&n%D({-@(h$9LcCg21XZ}UkRqF` zxeEB6Mqaq?8BAJ9bBd9U{|;2Q?lBX-x7`bWJ}bi=!+EjXiy}-{;fei@q9Y!xh?AX3_Sz2Ye8+eK~&5$ zK_HK@Buu691(5vuw+H#e^I3X;555xsCT^S#yqHtlkZ$=Vc!MmTLn_!gZ~P6yrx{r~ z4{8c2;PZ&`@4%n>o%kb>(U>nFFbRP~H?UDt2Xrbd!S${NzWpyEKCmKuWLw6O&0`$U zhatWg6KYy!!}u_bJuKJdnzO2PWEGJTPqo4~H9j)f5k0>ns7BX9=9_kx8}^_LwkU`3jK}fr59>=86Jk z4kzJxk1_32&u-=wz+5y@vHMjNP=b2!YlI%kbQmy8w~^qb_rJ~>K;!h_GFtj{jO~ST zTgDhuIGX93NQN69lvc9SY?;+4@mnkdB>Ol*F(|U$3&1%@S^QnNkOnXPe3_JUHxq`Q z|D-dhe%Rqi|BbU>iJRB(-PD4EQd*beJc~PzTzsm_O$+E2Heen zeJ#8G6Z)Q_?@-J8DLoJIPY0Kake6OBg4fSl!;jFEcKzoJ|2s3E6-^q8L|hRx`xi*6 zPx=Y6=+#O4^Xs5^dMy9(AWF#Zsg~Tp5&8MW_?{>)6h(psmZhR5 zP8wdt3E(Dg`VV|zWPo!P99_cF>h}XeoSyg%0`wt7p+Iwz2*AAI#_KWw%}L@DPhY^G zMyS@Dd>jE{W(L!!`omfbyOCSS<#;Am-=<-|Wf;wu;u%MY)||wyGcHKVxCnD~Oqe>{ z)@oBM|1M(gw`d^v8gXSsX5pvcCrgtrcn!b)?~t~b%oYb^QVl-{U|9Vb#I6rM2nY$8 zunCt53HfiV_V+9bgiH@aOZu=Xm#F`O$A4}{$ny+AH%OXhH#EGhq)BAA@;1{LM&G=F z<8U4H7m%Sm80cdVk{ClYJk4g)w(yHcd%n;igO=Y2ucr53035J=GX1|IpJ$_p26ZxN zX)2&jdV(x}V2l2UKdDl`>;DN3Y^pFmE}bRRsRn5kP^VkQ?4^=~)PXy2#c$KlJuJp|JukJ)R?k|CUk$Vrzx!$!*|IcVfcoFlL*d!eD zPcC~W8*F(=G*42Or*Z+p1OesO&urStplNZx(Sr)9C}tK0!R$sYu{$nQV5#E9%!khz zeL0E(OyF`lL1n3vjiWY);}iFP16q(S5lL!eZ~8Byc+wR;mjB=MfvzO#&+s(psu?15 zbwrTE`wJ8O53_|O{x3Zk39zA6)s8q2@In|M4g^4hp((_HfIo%-;t)N`iNNax=!51W z4?3Pc0Gq7;6&2P0hCeA2XFqZXGrey7t)L-PU_uoO^#ntxmzduY|7j{uIMIOe-ZL$lUAxU*OfUwKiEenP0iJ;FiNXVO1Sk5vT!|=J2rEEuD6!9`Xl`r53m9;(h0q8DuxS&>v zxEv8?G=eRk2YNP6Hjcg7=mNZOA7H%oTk59XnEI`&WerWJ%467iYJeip;pkZ_ycO&Y zNRV&1kT^TC(9&~URq{@4(cOF%h9!6%h?KV|uq1B;=pMV*VHg*)uLR5T4h;@F8Lz}I zhTj(a_Q&t@!LN?*L4o_qNI15|3@E}I={^GY#BKN!Kf(6qO>p8-iDxJZ8QJwMhRi&V(kkvi#q(k8Kr+&O20?`z9@gU%ir985@i%Au|2&# z_b9qd)cXRInqyEtI2Y~0b*I2tgQ}9H9seZEN$_ytG(95L6<9(sYh>&6yw=m>-?TKg69*sb8l&W!#Efdphy-vI`m8f7&@0{TN zXU0iLtCoKjp1Q>bWbFLXWsnWHj_q}Gz46ijZ-XZQxbQ}#bPm@H%=~x*QN|v7JPsQu z-zLfS#&OGi6IKaCW!O8B=%e87N%%1&t)wI2duI}p@5P|w)%%qpVGARf#JcA(sDwB0 zVjTxp>o~}mp*^iYfCKd$^je|dY=sSNe!S8XK~6%E6Zc)@?M;=A?n!xZI@3LAF9C;E zjC*d%eUdHHiHIa3Bx7m51O{mZqA+?MkdDGqNLslSeVy8#`%r^%kUz*;{mhQne62(H z1NSM{0?inR8EhkR;R7~kc423bSoP+jyi!M=(1&3-<4dMogk*-7W#sIDB_@WsB#w9? znIlt{QI?y5ulwyc0>D z@-+}=_&W#5_@n<8{K#wWF!dXTGcHWG2yqjqBLjvy-Db&- z5WF4BY08*P0(Nt}c9veflUZQ@fa5o30T^0C%Y&mCL5#3eNWeNJ^g57*VVWJC8Ln@i z8M^Fpmt_K-9F5X57^P$&UKIhA10%ra$CtDW3Zil@-X3cSl(~q8D-%}$d6C?e#X&N+(#-98u<$4%Mlh28(z=QS)MWlEh+pp_9-$F;ec>&xqc< zpx2UZ^_ZUqVUHHO>}8Lj=TMM92(bhAm$%JZ-30sl)#^Ld}xH=!trm6rg?uP4I_dyTcT+`8A-zkNuwA6 zG_ZF!Q?o(i`nN<&xw}z{Mo1~H|EXx2A4JkHB1rSeXqrbOX&4ctxiy;RxkwsDL?N!F z?=dccsuRJz@t*kXb0An%z^kq|&astOab7$O;WdnXQ|BbgVNl%#^P+U6sp5yoRdz1b zocey%KK14CjJoo}v{BqQl#v`^7E(GklFVK`@VZM<~Z>1b6 zTLQM6<0{wftxttPUJ+&tDG`TyIHiB1M`vpZi3N? z5g|+Ol$+j44j%>LWSfs{N2^2yR6<68Kn0C#jS9Z-?M6GhP{BynpTm02N2j44w`|2L zLssq8-$74?iz*r^h!msvF}*Z+j*bP)9xnD88Q^#e@VC^h79$9UiESAnQA~UrC6)88 ze*-CptM_%p(um&;5Q#s4syo?%jnkLC2<3r zt;RagGYTbVDuaH$h(fiSXnYhP=mp}+^7ceIG*!j}Zm7(I4<_W^dC(%Jx@?>ve+aH} zq07$eDfqZVVebw=$Gc()Zx6zOl#3+gvRf4Gr<@%klc?SQ)uHbM_&#-J=vxinxyjJC zAAC6I9CX57B|J~1m3E`S!q;U@BC{}Y0ArqoTDc~JWmF^?ULqol83e+zU!V+HTgJ*$ z&In0@W;uYI^2Wiy-z0esB$X})I4Kb)v49A=Tu~xG-p+tLQ>F8;Gus0fcbR+f^|JWW z8G49D%7@w$-F5;IeMsPc0%TDdwi5u(_Hzhnn9PPLu1AXA7{%64!-ZP%NL6_sxEj_G z*ENJZB@AlB=C4_uVwbl4PKTe%=b_+BcbKNMM2TFKY{xk`Y|%>YGNnW4>nF%_@drad zw>=wP65Wc9KoOK6Jco;P2z$x84tE`A^P*p>`&R0Plb5O1B_$w zqnx-IKiD-I-EBW;5R8}bn}B_6aB`3vH`$`B;c(RKSFlxo*8XzC~_ZClSqSMr(;3EOCB&sLjx! zW+(t$$a+u|ztpmNg=VxC^$aqR40;^z)69P?aI z8*n{&2M~8D@E#M6ku+m=IGDg#pl?BUjp8&3%SX%maaR9TUzD+aw;zWEtD$h6SwO1bb&C{HNPn*3i>T=p#GR=1&vH~?hV7Bf9n zLK;p=RSKnU>o}Cz->`E?I&;^oo`WD0KRfcHzx@}Dr#p=2MH|8WjW*A`8JD3SvbfuM zVkta|SRNS2!W!-`AZ=K~?a!lM6VKs~nnVbN2lm{{c^h~glGGHTUMK#>7wPxd6Y=dg#1J59({SW9535+YtZEGn0A-f%@-7Z)X6&;_M^^QqDp zepUR6`0Zv*ZY4NEviv_^lH-(+Gi(Ez5o0~*3bQt~Uoya!QK3T_Bb%O}u029aBpg{H zsf;xQ9~VRFE5OHPkNSp7l_(JnHUsE*%hUT(Wd*)SGI>1nzr?#&-VSVPbWFiG=?j zY^+U*By22o$VZ^9aquS<8*x}bW@Q?2@4;aoQ=t|@V@!ri$%Xod0t4AoBtx04goB1`X)iTiqBP|K6-tklxDlF~Tb+lXp)6OSx1{C)v!UqS zhv28;9miY6-(}(fN|~4*yAHr2zvyr8dh9CkMOC<%FB^?0flH9;g*T+|_A=ste`#RQ zxMKp6pELesX%$3T%^*gF{s#bo_H}7bm{VW&y$072W;h$y(NdSc636|~k2+8O#5i_g zQ@?mHAm%?ybX@~}55$S`5=*ST2geh(h>5u4)Ed-9(DHHEkIvKhd3xyNmNqM_ZXc!65Hx%twgYH{JjI>312Tthwn#daM5)#KVG*Lc;*I`@Co zs{I0p(UXM`LU2?MA2_Ua+c9WhoIu!I z{|%_f9|cgZe-WJN(ur|@Pk3R>!~_ZdDkdN}zK38l;lGRS%kW1CGw@HtA6~bQ!M8uW zNXop@z~JVZo3v%lEp)2;|yTKaxHcx9px^G(muGDLAVQEMb#@AFxLwo@m?Vn zfJK;i{#0wjMGoX5yv<=>AiQ!9xCm^g;1%1Mpa?PAdFr zQzWq_Ld(js6+Fcyvda|j$4*;CDklU>9OQ%hzJ z*tC@PK$vf$vypEXS&lJH?@ZJ=?Xn#26jrZe>^&F=Z^0Ndr{ai8xvLWhz_>H0EewBI zxZ8gvT!nQ!%1M^SP475y6ix3~aV#)v_lAs13%=?&GhkfaB1+>(15aXw>d=|ja1ChqQ4*T1Un$L?N0;~`a8!QoF)QzN$lxp1Kw^;nBE$=GqEGxCS|(bi6{W}ODu8v4qU3j;)%48a-eX;lbfzNB)RaM zZ>N@$3o6t5jmeX3!vwFwd)-)P5dhqgRbA-Jm3KQYnYdTmBARn)OMeKhbZS5L@LO5~ zC?sMo9v3KN@O-OxcGyrv)l%PwrN;(hV|$L>7Evuo-)ZK4T(m!+x)`Z*ZcCkW$5C!u zb9SR-ty`KX7BT+@#?oFr@nIQ910Pp3@R5$M?gSFp+Xv&f8ov|p17B)<8O|`!T+43) zQXq~`aDbJqewa5v3{}rSsbj90kS>u9#j_ufGufpXjG;)M%EKufS>DNrBz6<A0PYf{eCogf5vamAVXJRAc+qjxm2@e2278918BU?D$TWURTy4>!G& z5L!-~we!(UI+#rF1cYg=h|#LNvk<0r%*C5nU3e3#Q|xS{LG0%{8wDt#1@|G_4PB-= zCEQ2;`V$ysIB>fR9}SlfyhoLtW^4Jvz|7Rk$-*T1c#XFF{aJvefyZFn5KJA-{sD;M zx`gz82zbz2(Z5!H&1x=4*tIM1dli1`@T0-kxBd@t?*SiIakUR$-@9FsZCUcJBo_%| z$=6$4!Imwsjp?R^Zkyh*16;U^DPFA*kWh`OAtcn8l7vu_5Xegkp#%a1f(eiizyd-F z2_?M|F#qQ{GjsQ@nnm)x@28)=bMBd$GiT16X=fV#KZ*Z13?b`#JELg##{VAtzYPDE z0Dl8q_VYi`|JB=d?%_xk`8WnTl9@Zno*a|+KGYaHfsvKGG%d2v2A))NRMK#}U@E?< z@eS-Tm4aXyEl`lG-6S$^QCh@twhDyT`9guPh;uNws*ShItxFVf1~j#<9SvV@R00oc z*C#bIsH|)?!H24~P|8+3p{9LBIo$0bM-+7{_94kjBF6Jbkay4Hm>KQpuJ~x+rlNR# zT@#MoWN_)9yN=`Ucy0`)H8K>B=U|F$z;n-I>*MR%z>VReMsp!u31&vhP5P~3Emcm^ zjo?0;h7?4G0gRHKZYMLQ#T!hRc8m6%q~x<&-dxcHfMYg7D1Y5F^wTxZSf`G`+7}1N zl@>#dl4(cJK^LGyXg?`(zAeLgw4bwU)7&wtL+2|y;)kurY!B7CG3*o8XQZ7u3^-cJ z)3u4Z93CQ#LhF<5uoKlsZb-KEg8oeOqU@GLk=q+0=~=%>CRQ{=;}{~==pgfBg>BqL ztOG&-cd*%|7~-V8#Voa$jZvVk6N1Lx_BGJQtewoPa1Q|s4e_ez2wp`Xfu2>y=*91% zo#Q*GicG>=0{R`e3M`sgF>@-m55-qxR$xmuv%ztr<|pAEfx9_6n_>3T9FGlH(od=2 zs=p6l;8E@H)M~jxc2c2nLAtvV+=c|wfj$~mFUS*zM)A(8d2H6L2-b0InsB+gahN!tJ7P zRei;-#GzAR=h7~nqqDrso)t(ZM9}eeV@T;!jt0m4YZA8GGp*;`&`U|_?{wRv@Vuct z)Al;uUJ5SodP940;(0?aWfpk-QG5MWyeK$MF6!uVjvxRKqYXlU$@*!IZ`!3X@F=cF zIk!9MVlQ0pQhr3d%Lwld_9M1;0^n?_85{d0ytfSKb+=%lA8EOqx#BQ!aStHNBxk#; ziGqB_;>+>&ga?j2C?YK+LcF&ZiEPkBXzn7By-9@Lng~v*k{EK*03@>}?$NEO;u_$4 z@jh#0q5|;}LIh`yP54F3Ec}xQ#CYTTc05Q=Z1h~MkuFApvETY*F{c#~_ zjK&j0h&IVY6998+dp$aN&T4d^jErw%PTzdn+~&R!{!+f#{3#;9X|4 z>{=7%?;XKJFXU~g&nLZ`p!JV{pzYp-Pusl$Z~^@h3E8D>$;ASOn`iqsqRDJ@QE_5x z@%2{K*X(D*exa{rcq549i>HH%dm~8!b*G@b0L25FUnkBf&u0!WYr``^U}qhEIcp<3 zGHY`&d5y^d&szW>{5*zVhK7%TcRY{^1x1MzsUt1}qAiM8=c1xrz&=^R<{?;bW z$C?X%KEt+KZS~mNQCmIiNsaD5n0qWqxaj%P#q*Jl$_C_w12ZB+ZjiNmSc{Yw#ERQ1 zfnse^s2&98c2nEQC!LJ65xHn6%1ZeESp4NBBU~_aGjn*4(}r&5oOyWo>aUe@MOfU4 z2wLkVz=~(WlEkwL%@^)k$0-sIIa`4Q|AfrFKMB+W;c-VA$xI4`KM3gO6q*}TGKvbZ z8x^*-f;|J+=LL)1&aC*z6Dz&SGa34+ih~<-tN6sVPD~d|aRFNTzo{sP%Q(h!+!qm~ zF*RnC8qwom8+#%pxeEE06df8f!(za_HYC4Q2+a)OQX8U?h{@Jfz~cIf7zUHq!Ew(< zl^Qz=VcHO;HL3E>eBj;(Mx7Eu_c$1D>W4OPs!IZd7335|dxco!;a_0CC8RtT!0%P% zw>jMbqB7tO=k88ik@Emza>TJvYxTKBc zpP!Mke+PtTt~-mkpF*3C3+V@?gwbCqawq;3tq89Zv3U&SE8FEil`cA>g`p<6Xw5<+4ctQTjnxv`}GUO^R51 za|r1*!8nAOIJ2B@j!6iAHIr!az5|;<`CFKMJ=AgeYm(#{dL<3qH>1_c9=;Lh zBy@XFMw!}a??_b^Ja4lfcz}hlUbPPIfR|LP(S3~L3~VX&9|bj+*a{A9tUT~TJu4ms zN*S4Ydq)H8=!Hp|5oysyj z2Kg(KX~nuOQ@g}rk9RC3%KXumuwL@F2zWV@Qfz1bg8CWGUnps0vWl;8W+(Q`?8O+y zN^>xAi3W&P{@zzqyxH9K_x@|en_7Sd*qzVj6y^hW9sw8yaNGhq zipA9Z7-AU^QTHFjjE*Q2mS}Nal_))S{XO`+oaKbLYd{5^(spnpwB2(s$P`atwhshk z_bd;-4+7+@;W(4yQJ&J^II|;)E#U44AfK7r>L2to>s0gjf*B+J5JNWAciAN}iLUJk zjEoAdzu@O18d~BS%L~aTMh+h#o#Kh$uDFUU9zYg>{*dU^z^D|wPl0~%(+sgMLa^gv zX6P~#B8O2HcKlgaP!4Nw9D;em)m49?m~6=;M%dUz@iSym-Cxm^UG2Chfo8tOf8}Mg z4JQL$>$sm|LA-C5$cuLha2>XL4%v0j(%`5{tfcpN-$@;7vQ@nGm6#l4Mh+i z58Lsu^ah&vHgXC3tr75obN@#qS4<*rojuGC$pROQ6h?8#&CD7J>}; z2}V4{Q$a};2Cn^8#7_f?gPGUBTut8`1RqEtVB!p{>StclgB;Ft+BIha9 z!xU#1GsWphN+>nG!Oj*HaF^to6A(AQ$o~Ms>935H@z55$qxn;8_n#0+#493`3m!*K zP;3fwIxySa2aIIKcV4LsK^?T+;b7`9W;GCPiiN(^u#@|qbmegW6{MD5iKNsglbX4Q zO6Sf2=~TjmD7O!r4)n;8LqJy#sz-cxnVNOrtEQCxYt4#yum2aSrFH9ID|3p`t%I#? zE;YKv8$m4V8rEZ}0foIV24_`p^0aT)u+Biz_&XVsn{l3rb_kCHv@4xl?KJ2w> zdXLLDHll0#&-eS@)bIOu{l53wM0%C@-{|)}z7PImkta=mEBSVU?}B_sg6{?W!hgA6 z`0=lko(bP8eaQc%q)f`~zLHesTS=<&tt3_XR+6fGD@j$p|Cc4j-W6tL)VK2?Le-_H zg*w?*=*G}~Lj`5-z>UhEqn;!5r9tS3S$T}4XU_Al2i_QK{115@yPg8;N8#m5wLH&a zpsQLQCp{--uV3Z#k6-sjCB74CU;4*q+{p6&u}7MEr1>zsuO3^mye87Ly!nupm9oNC z+k=JM2<}&jI(S|1NEolK#A-6uB$r=_1^jvhy|N*J&5FtTSkp0A-v}tP9B}gyEl1bK zTaGzWP)$I^TgM#HbaZ`UqQ*4?muOvl#ML*}M_afBGSVzdtnoS5#~UKJ@O>9--aTH@ zgB?rK!(}K)CmBj7De0ub>7*nbQU$#zuKgs(H4?KX6tjjg8LEk!EwNs%mTZr&E>t@W znYvLHz9`28mV}Hq22l>$jjn)>$a-dBtk1y3tAo^scrx2i}Ie08DR& zsTVHpQvA9JWW`$x9EaH_Av&;{@ z%m}Ze=_U2zKyb@Hr{~kax!nkxUm{ju|90?bs)P8hqkY-b2`BV5pf`5Pk^(Nn!>*6D z-?Y1rC-Do>T^E|{(sB5}0+3rqVnsZLkt)+$;jtLzv=?eSlp$J5t<3O>#OCqaVV1|- z9t&Ld14nM2R$Nb4Tz~V;iewd!TD+mbf>W00AhVieC^P|pIEDzwgLATqY)%5UN;a4M zG9(-NhNJ-lZ|G|f*+?2l>tvI-08G=C`ya2B{#c}RY)EwZ14UvOc~V^1Fw_XW-~n=x zYc0o7(1Pwpub4A@Bh=e4)@GKJZ1%VMzMe-+*v9e#nc6gIgZQ^y4Ex^m=n%s$TUyl%{)^4z@PZbNeO{0l$=`y^=5mhn~8I+2BdKXtER)eK8h z!@j~0HEeF;7Y-(omNJg#W5rd(`Rjo)Efb!SKq>=PD~v$E{2DUsqowCGTX7`){8uFnFdPdvZ7)Rd4X6#{@v3n)v6UFn9-`=x8rT7E3tysmASN2jZDzcxCe;z(UPN)@p+T>O4o zI3RWC<(}kxFZ=-BoA5pg=A7T%7eA~)FuthzApj6P1|a|t%%jvG0f1osv%kmI_Q51S zaQG8e1Boi_?az?M&vRad+BEDu*LInYd{MceQ7f z=|ILIm~jPUKl35-ecj0Oz2LJ5ud`_SXHJ~e22U-6V}}VK!f4;JFpeF8Fm9kQlCYZ< zA7{=Wo*RvLo)huh|C>rr8IrZ?7Apn?>=r=2O}$Jj`vwKCv0bFq*td(cXa&6-!>n3ijwAdKMtTLe|46wr;U&hwQ#PJhO%Io| ztW0{}MSMT?t|=B=ohg`c1~UlBsX9zkD9ixbeM=jnej7rB8@u|b8kS%Vi08u0TwL)t zZXkd0!fF2NAThzLbqA@K`OL;6OrA8RX(QzjQdX>hGW%gni&_s4HwP6BvOl@4UK+sB zkt5Xg)9x~~c1|Q79cOt90Ak(1I|Hq22PU>0nKZ<3Zz3+@iMvl>>SzxLUTcCkB>E0W z;0lCD)Gq!FHoH_#TI{ca7B1~QjHK&S^qAL)ua3U06kJ=W{iP32K8*XnGv#0US;mNTc9a9)1fdwN2>*7j(q_d5B5b62S}u9d%5H#2GF zRyEKv=)E4H&3tSpq;v!7qK<=8G3@4@pd#z8kMSaAsU;EfZi8ORdsqr|uO&&YI~@#q zmvOHi*nARfshX4N#y_IARf8>uvrDWiE=R-)Ey?nqXmtlrulS>~3JW_QY zUCdp|aAl5STc@dHU}xZ4QSN$5(zdb9Ts|-7XIl>rA3}}SV_THtUO`md7)xC;bsPl{ zp6$2w-~?O{_{yrl$1^Zygq-{;-BD*gUgCbhLZc+Z%eQbZODa>u%_2CB%%ly@RydSj zbv&kM!kBnrTsR);g2nWZ0Zz~J;{aR*ei$ETkZ_qUa<6gjiC|a^A=&+OhK)B5#s?En z?7o(1h2x&g9Ja{xjRW>xGaMH{?!q_}>EEdPt;)2?DPBz;V(H>FaB=U-A~?m*;ip!> zgm*1qv7XlTO|D#)P`Q#nmdA?$Sfon5mdxUDI9R-AM(syw&w71#``0 z75KSn06)dgBRL#QaZjQIuEU4n=?mm3Axt@9`|@sw)cP6+<;nXZLf3`gwMequ6@LY* zVTs{sD{J~P12$ff-*H0sTN6mz@_i!`fS!C!m{FKjyaJAsESbAm^p8JOAk9|Wv zJdh~I3=1)4xLN1*@1Z*NRW?L5e(n2}YW9>uHHJ_xC{$B`!oA$%|ApK*9tlL;wMYrq zEb+rV8*ptT-`1R1c}mkpZsJwl)AbO@%GJwXlr0u@xyen#`X`&+8xVoIc_Uohvf`03 zF+6go|ti!j>r6}lyFFW zgei$|2Bd`8!=!{qZR4l7Hz9xZk(PvlCZqq1HYCyw$=sxRoTR@JcY5Ol6i#x%Bjw)A zz_|XW0S4^)#QIfpUd0KxaA=${GNEe*360x`p@xq4HDnP5kK@!q`%09`b!~m^2y-p* z2jm*Dhs$+s6~j27W*Dv;gyH%~GM$9+{1#+9>3#{n?gsqe9*@z*TM3NmJF0#(jtP#| zmkd;ezby!l>po2Q+4W-)eyj@LQ16%ifIHCYi?=hZ?0tpO-GPsM9Ke?WyjDL3^=OA< zl{NjxFsbwC`Oo0WpaL+h?ElvI80wnA11)DlAA{dG;2ZI+#v}^Q3u-!mr-hz>OZ~P# zVsP@6fED04pX`Bqi;Od{>yA4Xrv1qjobAsiEYp+ew!dTWfn)Cb1Ru?|e@O6An;X;G zmded&ot4T>Z(W+oP4!QJrx~^2oIKLkHn#5|JtY;@Z$_=JfR`_QLSANudD%A1i@3{Y*RBk`Ivs1Zc8nsO-x0tB8soZ>xnwQGuiQ0C=Tu;CSTa@qF5VI&yM<&J1 zU8z249)q*|sgxB(H!^BQaSfWV-t*XlU4TCOPZ(s{J^VzQdIr4QUi{#^((R})un@a{ zWB_F-dz~_t`KttCPxu+qp*>#!@WFi_yTj$5-F-g1-RYcL&ce145N>T$o6xukw8PHe z_E8v}8LDp#E+Ghgn#f;8KRthEaH;$ybfWG$I9WgF?+5W*Xghx6UvSN`dm+Oj@1JGfd60ry zTX39QjXxOyl!VISi%=H~4AoHyCB6uC5kpaq0swI#5r=ERSB!II!9xZ*41?MMyg8z8zURuMZXS1NSs`7zsOA5?)4&<8DQAh@BHV;y=oOR z#?a8@45(1xi{tVAg+uU&zWfFd3+;!xj9dVH6VYEoAr|k#Px%s!zLDrF@l(E1V{Rtq zbHrQ$j2fS#*^)mJ+CcxiN$4IDx>%yQw*l+k%UJ6*om(01UWWTR!(Fb?w-8;G;FpN0 zB)A{;K7AP|TWEUU1enR*;qUd=aO)z;g_@Yk{1gYQB)a!?lC{-Xo#Pko?cBgNr$mvc zZCSVoMQRFfg)UJf-Z#K&O+3nX9U@)~vHMz4gS@*yj9Z=7Aq=-VF)UuoLEzWerm6X2 z#%h^urC9%MD`QRVQu|SO2iY>H%&kb;PzSa8{+*p%$KOMV78F~)@ET@ z!npS!FDOH{ue@aPcGkiaMZmtR~5pM7Isx+$v{2HsXk# zwtYPYHObEm1qe%#3Tv0xw57$8zlN4J3?sG}+&c)Vs?f2*bid*6!?j}Jff9Nrb|CBm zuc6CsO8_9)!N_t;qxV%2B-gF?RVr?oeV`8@Db-7w{d-Rb7}b#FVV`;sxfb(jXd9?q zVqXB`n0J*>SLKAUkNg?>?+4Td(vRjNQSKOw{KN2oS4MCfJ#nc3w<3l3;vM{PCmD?@i zA0I}IP35*7TE&Oy_A#tr_ZE`|yhb^-?Xh?|ChbllCJiaxQ5z34vW*ANi?<>hW%e%P zoP_$IO0y!f4j!k9))MygGJHNJ>l9hZMFqzdimYU|g5%mm^^#$D{NI1c5NR>Zm2kfT z*;TKLI%4crJFnRf;%pc$w%$@o{Dzd_cdMCcK<_aVQ^kv+?8+(|m~5Vgm5`+tUP6I38GFqBZCX>vPG zvMq$rV4zTBLVo>s?5J|>pDd5l44N!eIY^eFLZm-gvaBclljY=h&}11nNS2}g<7B7) zYhbdyD4s!+W#AxLhWd|_-DZ$vA08@M1`d*CsQ)0OIvTRJ@ffcU&Y2mr)&1|a|tUoZ#(*j+qA zqUwOK+1`V;$ElnXc7KQvTdbj&%-smu=z(vh6D{9B2Xmn(5L*tJ6n}^oqx?lOz_!ht z{lR;(KOhSpmqNT}@Kc!MhxZOBA0vDfS`T9?Q<^XlyTr7MPs3h7DUmI@H__z~K>#4g zD0Ur|u7_J_aq<~-jfCwIne-k9yB;^XONYko4mbl4wfJ79;|U14_#-OD?Lf1b7>e$lbXi;i0Ks^=FXlMwYwWMW#qPcQ zpXyE(m7jwOmf$D&Yd^ptG%GbL`U;pU9OmR#+9hTLx+Jdm zB$enX{NM@_df25q=sixkVjG1Iadzp;+J~<3Aq=%7dCB`ID~Ug5Lyq?3Zwn& zD_{9zpdGDaXXv5npWtJb&4Rkt)(a9LU1@JpjZiQ)9ZZ+xB12`i%K8s&4k!Oi)2Xyyu|rYj_wt6|JsB zs6x5|u^~qVx)n}CG|dMDaEYd>K;l(hfoQIjwjUJ;wr)K9QB{HXHtI=y*%%clzOp{C zJcBBfj3sG0qY)5~hJ>pO6BtlsVz@IjT;WiK5J_vlej7PH=VpCpczoiV%Q2DH%>&N$ z)JIHWtU%4G0!8XkZ2}@e75ZhpoS#s2W`Q;RXjNzKQH@ah#%qIvE3Bbvn>7WcAhtOe z7us^7=3e%1DYGMDMgkD`LvWdzZqHo^>~4hg@=khnHm1J0dxVD_E{D6Cwg=nV8QePyZi=`vQ>X{bY=NXe&N*oFX_rTmGWBz zOGMGDgRwK&q!BteTed~REB01_s{t5yQjwg03tF&8a+_gqr<;2#5$e+U-8jF-qg6g!P?_+ zOKiX7^>*O#;BF`=62910F!mlj?&;dUH zVw~;$8xF>s?uT&2AXk&{J_77*#t$Fc#?7HO_06pF-?T;rJ1PC$M~w<5v`IDZ2xmu) zfm9xB%Rk+k8N(Kn3sm~v$Do{^J&t9IRZ`_rR&6)XsCE`Dof?kiFGGH$xGrVpO2OJ5%E&^RdCd+0nAHtYT;Hyo;$Nx2Lz5{ zmq#-|MZOR##e32rc8LwZ{E4bQ#7hjfIX1?Sky=N~UU4i?<$6+yZ;p*K{!+4<$#{w0 zUITvcdLYYsCzLh+u#nIQtg8G{nVL*x8kJSGE0dPmRmf0r#s}onjF!QV?9IFswC<;T zn}DHwo8b;3U(JxT1%)Jzz){>GVYVQe66QDxZ2~?kLW{&o^e^y!d5IX$;ZAmm!m4vF zX{ql<>{XR~V&kgy0Qs7Th~#S$+@bl3bx(%BFc9Jn=?XeXgsin9V1>0n8zi7qZrEjl z$~`tjL29@>zoE37_rV2PzM5Y_U0cmdG32WasnLrKuD2CFR%ZQ%n2HT-%VTBIv?H~NffXg;QtwqCz6)sn z_q1R=WA)MX9vzGIKj6<<^8+kpz>?l(yKGIN4l$2_u)8_U4#-=K#tkPW4{v*SM!ZY9 zK^55R0Kw&utA85X(g`ryP%;YWz+~H!VC~-wpu`@P+ zuuYXlGWT)x{lY!Y1f*1;9|h2pgizK`aFoNs7XaD$h}k*I&=)|mdp1#`3+f$#2dN7X z$XehXZ$6F&r*d;*-ZTi%pKXJNJaE^BjV=7z*oNLyb~Ab|LfkH&t%w@)x)8PSM0Pca zO^2U~V7rsy>t%r;n@<@w1wiJ`Bs(mc{v5LX;+@um@wc_+@9uy-kVsL8>jQCsp(%BT)fR&u^j- zhN|aPQC~Ju1sEnl=~K6)+aDO=t>{h!#0#%bYiJijP@O&_7XeWI5^E9Guow$X@Tm;QwzwY^=tH%PNU?uk zaS53XWW=wHJDANWs;`hwrV;cNJ*H`Pd`7Tc55DUd?h~lR9J{y(#sT-UFD_}fX%UayhN`+pI-WSGXR!Z@EdYXUcaSS9hBE7?E%Mtb^l!Q zk9)my{rHazHH8Hg3iJu_e-A|)KCr~IWsb)aN})4b?!_#r zzccI$K`{)nu|PddjGf-^1fehyQn4SEd&B)?a#UcywPi;X?<$kiY`AC==dYWw59~;k zsG27%gKWRYv1JvTDEfIQde|;_gB|XAF0nXkaM@gmrGnX;Hw%SasE;ETvjJh_b2mbA zbg#w%M}RJD9YXg%%@ST<&f}pQCLJ3c_2wWQ%s$CL@F_MGA8CDmKpq^A$Gq$roU(2q zJ61df%fwvJuj|WV+uU@>&>Z5#){9KN-Z~dDIi&0QEbg^YHiv~)?Jic9YcgD;UXQ}m zYt&2a(yzcT?oH2>32>vrkDVXmO$E>eGeh)!@Y3!K7>2@sHe-7&rnVLSQ12^~B-Y%5m=*Z}(dlgqf zuu+~K@z@c0*Poag6>M>iLR6z6uO@R-&`A)4GST4ynL;FyIkGker|HPrgzwah3QoC( zBDOcj)%#Df6}Y`6CSQ7`*$?RH{kaiq^f=3*+;O{$H9n_c=IN^=%aeQMfE+EU?Uy5P zH=-QPtm~H}6>+3FLMCMYWp$n!rmH-yw#}shWAI#+Zl{a4vf0>R7acU)<@cdVc5wv; z?&ZH%z>f*48%1f;qg`M*jy{YqPHSk5dSs^0f6|>AOry7BZCkCh|LBe01#9J;Zy)1aF>`u2mr(=gAf1++aLr0 z!Z8Q|Xgj$a`ourmtv*(t$D?Q8XLXfB9%JRWqZ1-;$12ta^0tlb@?2XUY}`#3rlWi5;-vN?bg?b*F}j$nJPwyeHFP2> zhZUCLODf8Dk?npPAKpq-zw~As=2-W~;cxCC;v0WI;GC%-=Zv?5D6QF!Gp)LvqQx?r}`80J)!CC-q`2fcHn z8q3@35R_aHLOx80MLGm!8ibG!6JoIr!O{pq$cG8BM2BEG1tH|agxEocV2K4G4x@+19Er|-m8L_Qu&GDW)#_d!T9Lx zLieNAM?rpri2YfYv)?iV>(6>9f&P&y=c)%r3K;1hsd7ZRf27u=k*5%Mq1-y>GWkdF=cz-1&31K{yAtF zZyFbBb4FUmRgp$o##NDqE@Q{PrhzgRMGR!@_%{faLkc&9o%$VIDX7K?A?$4uRunA2 ziVW@!WDu^`UqSGo-5qJYu8K5ty>|Sg8krqQFJNY<>>MXyrS}cOWw60o_;nh-rM#=IP13yE7U+$+w4mKg@9k=JXhHnAw7PWhx$Xe+yc;0iV|dVY6gB z?*3jO&IJOOug4Sa+eG+pffXYwWlZo+;O(!WmZ7q#8FNX;T4KgH)oH62c3N$5Gu|#> zHPx5tP~U0&jjQbW)=sLp0g1QAN*s+8oJOv75|ra|-b2cd;}Y#hQ2BjR`Ef*|{Rk?* zyObZtBHE9j@_SVIaTKEc2r9oHDnE`tv>!p`caQSp$V2-PRDNGqejIaXKZ45d3HnLj z>V1zOt|3Rhz3(Xab~srz7fM@W+O4rXf66h-i6~dOSEx$1N?Jow`x1IV?F=;ROBQ>5+gnlnb?B<3VM%F_r2Q?BTvH= zfqik;QscfNBs7vh=)*Z!#B<+cz<4IL3H`H$@Avt=6Ta`nw~U0UqSPVC9}pz9=@R;L zWK`vk<4Cg2IMsJ@UuTVf`uIw-Kj7}JjEx#S$o3q|-yvO@I1d(0I?J#!^^-6YD}Xs^w)w$n1DTsXgwRN8pZYQW{3}Uz1Qk;?5t=>f?8=>7Q6m%qZEAmG(6*DA8 z7Xg4^wge#nHf*4d;()64DB7&zGROd9(7!=C-X4H!Ixm1%+}jgyZNlRSKn?TvQy=~= z85sN3qk)V4z42kJ)(H$5RG6yGa(jW0?fwIF7IHZ!mhkolrn3#Ow2g^S+qmF1s9mNm zp{t{ERdt-4@G2v!`h=b?eavj5^N1W%kr(TD^G&=N{-mbL=q53Q zoC#}H5!e$th1EEX`Rw?C1XyF_FS9(M@Ao^$|k zDco+kLo9JQ36%~6q9(qMJA(4Aapa zYf2CjrEub-{C9!sW95GdfTR4Y${#3PqWlj4kpg0*%l`zJ14Mtqc=G}bj!V5! zTmgACrm+@>&)T%RBNM5qugT+on|+J*@C+w6Ejt=xE36!ig@FAmucO4h^{^;L*5}l8Gcd`QcAKJBQNaY|9!U(-X4{K%mRQ4du!H_6pm|_{b@>kL5Q57? zjC8%D>DMTJijq5_UwUY1UuDQ+NZfoJ%MbR~j`bU)^(5uy9tR{FhxdX8!10a;&N~4= znHhLlHu!3--8>3!`TBoj&>v&btI^G3DxF%u6*(R5M8sN%&Ae7|6`-1UYg2hOfVlSl zG~n_{A;if$5)vdLmT=EoW7}Rcq3SQA<~h~ zMLQsJXLCI^%1D^LxCW4Cj!8#ZcUj|Kv{H|NyYtLp;_$j z>ps;ba)L!BXuEw~Wx;Zkb)?_oPcsFeR?df8K5|N8J{d0Z&?`r_Q=(NRpL0sIgygq& zO0;_9CpaZqRPqf@iPjU`#ayDr1IuH%QTm3u*B}Pl?xy4Ng1Ul}fnT|g=uCMN9mk!` zDqnqpUZr}ubLk5in7dk^Vm(w8<-WX6>6`K}%;lrb^1?P+zcF$3(yZu1M-FRP^o@x+ z2KVWauh4yZ@@a+GWx8s9R%h+7x4KV{_xAl7_@~K7iCMskQHeRqnk-3D`6E@5+V&Mw zGMpV#GMpY$GTbVrWY`>2GOUk@46y-6NeLTpG9s=%ufuLqf|JB*`i`?*8qXBnW%@%3 zXnXx3r8G-_NKtLAKcu{Hb&wEXp$$w>=ZVkWY8gzn_Bq+A=e+(WDrV_6-V&`?CcA;!T4PV1uGoKrbMXsj}D(RH396UgcazMDFcXYpV>5 zLnsnFp^b>TytSb*SWeQbFDkIunYg&H29*f*)sWF~u!W^-%>cgCf|G(}{$QJt*r#aY z!XqpA%^s~oxl6dbDuI*-x|Iot;;lulD2$2t5Mc-a1j7aw8CDME2#xF+{*7Q#8Hbhe zP#J;U63L~~*;D-AAwYPnRk72eUEyt6Xl9N8Q(zItTXqDZ*p0}=GJeWr4O4e-G0-Sh zZwXwHPqybO&gxBDje9O*tH>JrQVzi73D~Rn9p28F)$P)lAXn z1DEb)0AcEpA>J^7BP!rQMqaLv&{%&kEY8SWPTJsXCONCVQMB@SZ&`d13cJGkhZ;N4 z3>eDdi%@e+E(HK$HW7o|C@T0lwtE$rka{m`FE`?js9R)gD7L|Hx!UeGVZThp+NN(h z<;105hjPT)`aU;z+ieeswVk=)@oC$3;DPyyj4T-Uu4Dz*D|g|5#^DAMY}xksz>FY?{G$8-CW=4Wo|*sg1TL5;fdnccf? zk%;u|;%k$gm}Y_Is(b4W)-)%a^Tr91oMN@>PhhnZ7lk9#zn}i_>*V(bYA>p;&sS%v(D~%RdPk&uDwZnm3TEhwf|STCJOkAe}46zE<2#r)l1qt%J==RH~fe+ zfBD)~4|Z{k9cw%N?e*X7Iz{-UucA3#LVx(y;-|W<7q8jJG`%vTJ=V7A>^*+lbv_CH z8F*VBaFzYn3m+mcn*>I_yhYUZ`LL`)P9btzK?d)}EUY7vCOTUl zK2;&PzS~(NNWSZ;kZ%!*CIun+_^d*{NaUM>3?8Og2-~dH$+d6W=i{g<~Z-@gp9P)*`H}^J*oM;GEEzoC)hr3GSgpmw$BU3)E6Ee ztcq2+4zYk(mHQI0W)iwk5wYg<%tgy;dp#Vo%<0*t^1(bFHh3O;whe-*46@`3Q&ou- zCaTMRP;xj9*Ka=}=Hh%hyv<5j)@E80kzJ(0w00gMtp)wkVo?+(1!)W>!c6w*o_UpM zTZj2g_skD`@^Qz#nFXANB$oM;(GTgt8cp=+?1rAsAZ($zC&Wo@&%(e5aXHq=qCw=J zJVmMAt@h3VnRcJ8l?K_!Xpn7#23e&w$hs+DFUv*KVy)BukK;Ko4e~KC4e}{44e}u{ z4e}W<0ee}jn%0+|5Bxtj31_1ei}x99FN;rJ)8{XEewPqe0dd0ee}h znienQ(f+)RM}xd4M}xd1N5x|C>sai*v_E?t4YIS)AlrBi@)A!C^5HQ7d#OE8eA*IL zE4AU8_dMvL6Iuu^__v~n%+`~4&}2C_Wb!oPksk?}O=Ys@`P@ku+F#(;O~yzN8;10@ zK{WMPKj6btBC8nR$dNz0XE6wsm*9uS)iokFPNzQcBU-9GvfVoodFK8i0zZ5&XmI(G z3Q~3Z5|8ny_#w0^6<*e&jJy~iUkKWq-rWPY*o!7XU0&~f3I$a>7vJSY6c5D245{`o zW-ZlubtJDd=cub-a*&Ww2=N#$X-6ca_3RYTdq(=Js*)b^Uf7Pf>Z2yBK2o|%>7!u8 zt|;1;?utd3GjrZ~$R_ShbmdVmmXxjGy9m2HiRB%_iLi-qJ|n=y$Jmbd8Gg~;6qPe2 z&oUqSF2%6TP#c(ln&9y+doqE2Ix+9-i1wPY)ySEWQ*o-#n#6rXHg@7p`@98hU*z>XYwT4fujg5Xdn&227ipCHQn22C8l_AyeBqpG;N%$6AO zb(r&vGBFM_F$y@7DQVqnFu3?cmz5JyjI4 zi&{4q_rd}wR&(FPYA(-W+SXCfp`Swj{#%F@ni8nJK@PW)qMfWm-O0~VuD2cnsL73v zdzg@?YOA)Z6n%K7W2jykoxOhCIG;2s1sBjMcacTq(S3DbYQExQyQH4(sP6}Mw4fM+VLHJtY>r|MrgzFVNj&Os58wrnBa0}rH z3Z6)Kl7ia^Z>8Wg;f#W(5Z+qB9fYST*d;t&!CAsN1?LGD6g-3QOa;#(JX^tY2+vjU zHiWlT@I1ov72HX9fr1wj?o#j~!iyEWgzyduUP^dJ1@A<7X9e#;6n)?rr^T~AEDqQ z2_L24qX{3Q;A06NhaVZA+EzDoo`0WA*X)dvcSeaiqe>#Jgql%#PphnER4y|rgK3qw zjLKG8a>R~sA84HPVFCd0DT5FIhF{ z@k%7atnO!oBmfZm8-xHru)PpL3joA{1|a|t2N{F_Kpbok0syhxAOrwng+T}a#7ct@ z0Ej~jLI5BRH3$KKILsgf0D^5@_F7%O741OVbRgAf1+ z-yj44qG%8T0CBoO2mr(ygAf3SGYmoiAkH)h0f0EmAOry7Y=aO0h_wbGz*>Jj3apnk zXKQKb9`={WMX|l?Td@UmbL?zXui{mxLB*?Cjjpmw-S8@m^`AjZJq+Q+p|*PhLVDNe zx`xrGs!0N1t+C8#cByRe0)U}&3_^fPz>>iWfPlS3z&+P^2mr)+1|a|t=Np6ohud<^ zOYw8ytV|+$fQ|+DRnl~*F8^A1yANX!lwI0$5kk4=z|+NATnhWd%ue-Pr(^V}Zo=ug z5P|%A3zz~+$Ox}RTk0Rk5WPXvp24Dq{15V1R7EIG$5@o(y@ZUnUc`9I{X95J>C4D# zVsY;}d>3!V4zXHnsqRRq%UwM7dG^zDvz9D=coU9M9RiQLUP8+wwkP?*D87NP0%** z%YB5Eg%ArzJ5XHiXHndhCqgMpzW6%2*@|M}aMT%gqx%4)B8SMmFQP~u>p9_ZxUSIpsh7xosKl|p6rOzOxM}@F%I^8 ztX~zG6GOt0nRT&-NSwFpuU}P{OW1gIxgi>6 zW+M7+L5L<-AIF`SQy?|zd)Mq1!&b$ zF?qlnrxEd?ZEaXYGB1derl~uPEvD{7<=z~SvA6~N)}RVRWxkQ$LAfvzN4+1R!70r2 zpG6pRKtn&L)gC-!;bK(|hvaxqqnfy6qaFvj`8|~DPQkn?zes(k#?IZEQ>~oel&iD~ z;b*#v18G7wG3!#yz+XY$xn;7#cf{iyD8HR@!MFEgvYqoE50QrvPj+t46mH$~5yLA~ zSdMrc(--RfQ}b2bM%FH5{KEP?L zPTVMpl_smbNl}w53@bUYFZV*1US(a8rZJT}JSI&eo|>n03j5$a6lpT&=q59%@LN0a zqd@gQ@ zY{hLxP2Ov4Iq_CJeKWXLdzuPjcBIeE*x`UlO<+YTHhwObxzjeD$-5ElOCen)0b5G| zd~iXhQSPr|{f}8SurIteNFA6;&c{YPx>9%F;$R`-ah{$Zqg>XF*A<%6*1|Y{*V%z8 ziX|UL6H(}lpPvJzpQq|J?+{gWJL1XQRKm>1mUK{Y+gZP}QL*sg_H0;q42|apr4h}a zu7cs!KDntR?SC-0Qu;dYcGll>o6wDLqNPl{T1$lk)@Cd$DXLmshhTjRX{s#ck5jHz z=N$ue#ugRaVee0vS0%OFl(-?=G-y_8`&Me5y+5q8{(kdAb#aRsR1MgGeDVE1v4^f6 zwaUL1iCbTL_FS!<5 zvwbj_lYKDSTIPNk)KakplW4vzqdlsLc{icTHAG-Dk{#ZGN19G3iWQm ze196Kn?5ihCRVdwJs$c}WkgvizWk+&Mih;eFR7Dlh~fm{)nH7X!%(ji%=hDqD}<7v z6x%byrr)?^MA4YO(iIoF!goRXj}2(!%P)?4bVXNw%fc@BFChUlvNsR)E>^nIMaS{B z52S&S!9gtAdcSvv>T(@3O0M56EQxwF2(RR<5@RM8HVHTATCN&Q$&5>IA}9k!xK z%luz#A?4VBG>@PhHAU~RN>-K3@+WCtbz*#3rJwdJ^Y7XzlwBo>P%`bAfr)Mii9w=h5@ZQy}big718jZe1ZR`Ju0da4EA;E($T7lAhhfd zE&u5~D^f9|c{Qk5hFhh%T}qypb-xG(aTt#Gzg~a_7AvYZ5ChA|rJR^^F;oCGAKFui z3X@rE{Y;fFM-ar&M~`?1NZPvvjhFiYe2ZTq^c4yKuVKUSHW0ykILcQbqS?*Ec^3E1 z@h?nQA6t?w@0GpbilF1&3R<2Vk#PFaRpshf2P%>yrWxKwKXotDdkv8Wc5L6uEZvD# zjKX4ukTBQYD5E}(ze|?^S-`oO+Yk~9-!ZfW>RBxDXfk5C4OuC#qbM_F`p5!TOg)Q* zr?5#`jVbD_Y?m58Go58YI_sHE*C6SL2cF+j;=i3DyMu`lU!4ju;NPU<>bHxLGnO&N zz3v8Nf@furbAq%`WSH|S=}$Eg0E=(DDh3)Q@>%m9XmX2XCc83(k-J>vI0(|@-hnyD z%j=Mt*)z*1F?GX?6!gu|C!LGnTkSUmJEB{s@-AW?kG}{t4bC^n#Zu_CdvOQ>ey=k8 z3V?K(eje@{EVKNyw#RRrcrLdoG}>_w+m=(YquQ>9X=bI`pP(iUbKb)KTXUSCd^bqq z-Kcx$M9cRw0nnp;fV0eqN(OKcVzQjAj*#+$_Uul&dvl_$Vv3*5p*k37x8(R?sS^tdGp)n)9t@oj0Z(%3H)jTWkGNbnGd3A#Xp1 zgS_o;7jZB*Relzq$mTO}LfMo7H}#8p7Sb=$u#@GV(CK~}zvFNZuS@;n7Jj=#k2<@X zPAIF41v=C(WHs%kkXNM1q+Ku(TTsHr5%ukT2&NjM@z#3WO5oNaV12Z3o5A^xY2v-D6H2_W}B<_U%#R_E#d)7vTk&{tOOex-+u&bAVxCGUrtarz#dBLg8Mf z)BO^Dsc>0VtWVn|VxetxLSkeTqivCNZQl&lq|tDlzo0%kVaB*P%kY50+^N&3+)~_Z1uK(xr%XfMZ#|5m~+gFUazjaB5;Z18r@> z|DQtE=VCq_FFj$QMJqjt->d7At<$$%oNTSzwmq3YKG~XFv2zq*-$7U(VaxjeW_)*^ zg^y%wTUQ@G5UmTB)LNa#2y*7Ovz};C5~U zWW0n|qBH|b*n`H?cvX>t|A`3x+o&H>k^hGP)&4;M1=VygZ)`e#O}G0^{IcoDv$zie zZQR5U6q^pZo5%ms^x%vKO5Xvcg&*Mdpm=L-`B1QtuHBR(Pf8w{&+a!teI)F59>g@=xwaMS+yh|JEz%IuP|bAb zED43jb*OfZl+ez-L#O*~{IZ>!K^?e4bbuac=jepmImXiM+yX2FQvD=7toE8>q_To5%&SZ*{B}ICmA?v0a(mF{pDq0sW{TS6LKUxoIpk5oPUf~v~ zb>`e+953GsSE0Hv7*|xTVYs?Tlxxdep?BLe?q64@b)$-%{(2H{jy5|^m67yC{`K*Y z%2d#%%?|6#4>?SSF@3hNf1%s`K7QH8 zLVI$3-FUA7-)vy%h8kE#(hY1KYAIPrE-#CNA#JA2421bh-l`S#T#?Rh}D|1tlx@VJEP#^}s^cCI36%vh#$o-s;5EjQ!-c3zMx=y0!s7$<}Erb_RV5lN<{- z1X+(FQM&wpA7DHmA@FHns`F%tzI)eNAi+b|zmbDZT$_fEm0da||D^-rb}2Qu7M&n>YJ_y>eJ zl75=9rw)M>bmedOr4He^b#4<*JfRPu2i1sfNR1fJ^waCn3q#|#CnHszap&pmpOc0i zbjYSH8>$CY?BJF)kk{;>2c1K9{tOx6^$)Ux9+YmVEfaQB4~lM+C4sspGQcQkxJ21h z4U;IAZbq8uqEMnRNDP-~^YDo#MxH1pl2$x}W?AwY>YS3}l4?qq7?)7<-W}|gAlXFu zgNlF?c!ZGxhG7eNr3X6QZn~lVNd%mbDcu4Ym4y0+%<`)nQuV3U<7RZ@cg+&r^a)FE z3@?cZ0ZW6H`DWDdk(7Do7g#5?6y6*@$%(@!dFcp~%uR=`KOv3fllZ;bZ9?;y&=l-u-sv?h4t zhQ(B4chlWG{?}&sEX7pgJ^@M{NcK*I4U)yh{lg_YdH7_DpCH+}Om<{ixzuh=1_=+U zmLH(i9FbaHKphAb3DmN6cMMug^Yg3W@((^z0Uv|P-4{MaAotvlMdIDhpq)><-^AQhH8Xev z40sHV>LV~n5Uv+XO&x}A`Fyf9)%9~U`!L#c?Ep9TG)IxY7tFM-Uy6HZ*W=(Q_jNUX zQ}i+`=H3#fyh13mZhwr7gvWH8dWr3Y6T*<~h55EIA;f`345B{5*EmcFaZyfg)3Zp{ zF42P%Lb{e4=&Qw&N2hvs+O{_~^PGZf7IZCIQJnm}M!#$kexJ$>fCzo+zHPZQK!mUa50YfW3 zQtAUceeqGNJ|s$Oo%(o4d=6C~-{40=!M6jhDmtw>IE#$V=tpL>@gxDWyCHqZ|)1IFF3x` z_R+_%Q%Y_hlNL`raXWQv!F~Krmy-w`ZyKTIa0oq&=7 z7XGe)usR5&De73mJ#i+Cs(| zhLU(~xrP}~4I*ye?4(-L!e^K0(SVgrx}jO6sCBKf%Z7T0&X4{zfEzJ^h9%PZG6TtQ z)HFR;tCn-gL*eLnH~N_8bj!YvdBmkjExC z$fKt<&n`6sv0M!&R$x#v5ud1;EpTvas{BsCultLb1V2^e2gRxc$jNuz4@vVzuwL8AxXdpeL2 z84Hd79P3YLL*Ek_O@`Gcrt(Podl0ieHL+ zJGN7krDvcArA{{_b;dKsxaklqjBx`OzdFZoNT-*_swWS$6p(S$6Jd4O`Qr|%CRIMuIFeL5 z6SPUH6|0Z9ETtNDv!eL>p%<~9V`$CmZ>9doGSEOv+ajBz6UA$yJhdVrSlSk`{v3dt zcqty3+31E^5)qFwv#|w9u_F*dq7C(_&`ha_;)w_0A|fhsD5pRS|M%yq zuI`>>XJ`F=|MPlHSM^g>Pd)Y2Q%^m0Hu0(%Rp_MJB4THhYK^U2LXB;~moZFtZ zAC|dS)~acy}xolLos z8G?qDhq?N!P*sIY+kB@Z1Y5T>or|qJ)pW0X)s%(U(X+u2i5v?a&(>2$IcXqk>#)*N zv6ZO?@9L>g=@UbppfiwNpn7t9$`qi1tlW%Bw0bI-mDztCI>yyg&y-q(t=cwLUmuV{ zs;ZFwg8?xDLu(i{Mnzjo#nOXHTbvk0x7uctW?ILmh}Yj?v3@K&z9gZWbC$Y+Ey0xSC)KH` zpOj*;`3<)>RQY0r&XH4|%~M9`&f>F1Zed9Q*r9SV%|WTaW3wAa&>U7;{Z_MYp}I&< zNT$k%TI5#KG)iciTY)I`rVo!>bD;U8*@om z-WFf<3o4{q>IxC(12vSKOL$naSiiImQoChTd1@}&;A^eL?S~U`dWHFN%G>Z%udoZ8 zTXh20Q1Xrnkdxt>l7K|pWRlG00gGDPn8Nnf8eT(Kwc|7ed%k#E^0Qw{Y)O%k;YDNc zD7?U)q<`FwAb7C@4!k&+{CC6~AHhWR?ZjKAD;#ozqXtmIBNK0d-17E3W#a9sav#q< zY`n|9lbh)al_(uwxU8ccvZD+`Yv`&B=oFmV2)^8xe=;ez$jI0Qjlt2#h#MpBOc3SX z1xMwkfj#UvYxnK%MkZU7DlwA;ZZ2VYJT^sEL-+RYb!Pq3m z$BL5ef|jopvue9w3Qj5`t9v(w=i2#`X`A9yRlTU+Vy+N*+=C$MWiK4+WnU^}Z@gh? zAD+?ENrluf$&{ML_dYr0J$b6}?XLRZDlj;s0NS6NOnoR-Y?Ae~ljFX;howb4qfzA8 z-BTEt&4H4ztbjEgn}NyB&J~}a#SSdeS(Cdp4P<5L?=|Dkegwgv18}fsnMbzsD&NCB79RIvH|-&tcHr^xe2}(uAkpe`O*rA& zL2}Cb^Ay+i5Z4|sLskKBO-_buN)>Z$?h(o}&MvdFOXESaC?v?SMIiyU3{e)`XX-ub&eZ?rY%2h%$!OU0$-R+Z$1>eWxx%?Zdw%0qCUI3&wzy1Ih?66v!-HYu+F{v z5D2$kef_GysseUzLGozM*ldjM4GIIBO^8P?ZTTUFEYeO~%cUwPDMRO9Jop3Vfh$-! zENPYHtm!zxH_6JOV(!Q!QFGSAu;vGd%t%;MC4JMPJ_cn;v8uv`D4|Tmc!XYvx@Bxk z=9V#vV2X$D)5+h>$mUux%Ig=igN<@)tyOk#3ikRXtBc>Fbv2<&GP+ppJ)>)K0jq(* z>!xcCCkS106b`!hFebc?#9KLrM`78vRyjxG&nTFh=7CVjJUCWv`3Rme5B8=#$vhBL z&0TIr!zfW=9&nEtuPxDDS@Xcq8ajmVS7>8537LYMqhA9}&O%&ubE0EKLoWJ_Lfu)2 zwA{xLM7iIO6PNo0yp@x96qapmba({pz%6$q>T<#Czt(?ZAuxuME_o?_tQf{GAxlfl{ zUcyu5-Zw6{pencAOu3aPQ*Pzk677~Px1lw3Rpm~>waYCUGUaXzo-ncQ&p2|7uha=v~Fzkl5%F0N=P78S3_|9)7@-I>{?Y=2^n||#LYxf@} z2!4DN2O9&G5nRMyebjoysp1QB%NzGKvwd_YE^S$BVg5~w;WN1&Hn-^oBFK89!{w^tO`i4NMrPFL75#C1ZGVN2DyRPOBv9^gNnLdIt| zC54%B3-^m50B>5GSw;|TW;qUXM$5&R*ivS{24=aRj+s~V6+81o~y+yRJbh`8%0J+ z)nai9UW=c9e>35y=+E#oXWu9JkMZ+Tg5c*09Qb)q6~Amw@^TTA83{>gR?SH|0TUkh zb%mVrWjw{N10-O@up}tVl9OSUlElpFogAOMplxQ?L`z z>^Orxc>%M<*>Q&0myy+`;I*Wlt|N$gx*jLCH}<4t-{DVp?`FnsAgq3U2@&;mqnz?5 zc&fe*HdcWsEGdBcl9Q<~rSkQ~K~7C%Sax;#MpcewNafrFia19q=Md$n!vtYT0jeCi znaZ&&UFF0_)JDe#y;f=%lC7U>IiO~HT8*a63ieO}qyBmrn$9Jk2#F{!F9BP)%;UM)fJj&2xHu_OpdXqHR#C)!L9r!6}an@|7FcEIGTYPE|iW$;K#HWnhI!6CCIzp z@831mCcl4Q4XXZ=g^SMTX2^+tmds8LF${L6hef@N+FRt7KgCl-;Z(t^afvc+z}sMi%(=`JZ&*OXutCT>m1%X{*Nj7l!A(+UhX8=M3M7ct7`D z=qhxyyL&IF2gy~TEgzOXLj}d8WKM$(wW6vf>PRV6Zc{2J2FxxVCNVg{NKt@h7v*Nu zhKYe&QKjI@GwMW+N3WbLI&?6_n2}jQkdm;?$r7Jcz{ z@5$QL$U0B#s$x#&;K)$S(UjaU%-PLI8v%2QFEA_`y)v};;?tDA&T8|6T8mFMF{m)E z)gev$Er%iPE<`gdjhwWTE&lMNg$Vu9zQQtYSK`X&Wm~9szLmnjQaLf*>7vMxYDdSy zhNXoe$EJH74j?-3|)qZ)5BOlxtpxcN#WYxK&?z*$}Gf3fCiC&RQe+fIgQe^KUS zn4__!@>!M4wTYH6TC6tlKBG|qYyl|C&72HVIxy*E*yxpQ>*Sm{lQvY&Ivh4k&fHlJ zcSe%)^~9viCQ000;ZH}cE94xU(ZMj6>5wYmSj)7&D4~BgQm(A)Tecb7V90EB4s4ig znF<+^1ly;D3(*u>c>h1?Db{LN)~BxD$3mhy*QtFi&a>g1^$PKsB{3Wpm0% zXVPjDz3QxyD2?{ftL7C3KA2n>5d9wYw&FrQM4Q=l&Z$YZ$5>X@eA-53X2er)JVRQ& zr*16v)%yH1Hkgc)s`*l`1B`93&k=+T_IaF)4fZDN*ZnRHw81j}H~F86mirI?0Tl6T z{EPHcv#~jz^+{MjfA~(Z`anLjF~l&gl1-afjWpu8G)JQNGVjl zs8p_|F|&?PP3r(#SWQ{!Oy174 zso&cBdvqMjnKm2ATfO}7|7O})0Y+ll3{wDS+Kiw8r|1Zl+jM!Xyj2D0-*+8QY~#$E zqmX1s6t}yPm^QVEmT6O;;{U<4v8+suSD7{`I5BOi)^Se6ZW-jCv2E1pSJ^fP)0e+% z^GjbM2;1h%IM_CrL^i*)nvPJn2TY(C(KIwdtUQCd8z2Co+ z(!%`vc;fb-CtRq#uaNynY#C82Tjr~B%XjmXEpwFA{Dq(jOA3%JBR6BqD4n-u#*7cw zOpMqAv2q9HK2nROjRLgr*9{>0-vCQei{>-DeTDx+lu~Z?KNRdYIW9bc$@)u4dVf8) zUpIk}?MY_Q95w$j(&}}7iQ4MF+y$OKefzJYrZZjs2z@iz3$w;y^E|n^tL5@we`pM5QLcCi$j0hicE0WE%-h)!NxGVc;ZGHe1yXJ6#wz) zV{QouE>KTqeKNa#?j!9wOFc&uL(>X!z2CosAem-R*vkO=7Yij_^S8h@lCD{Vt82br zZuy%$)ioa@O?@P&!jb~iHOtL(%}VFHW-awhRle(V%A0PzAN`qI=eY!Od5PC~-hd4+ z@z)?;|1$o5`|uXi4fFrT8*w+D|D;Q_sXNQ3y9WUuvGsJGJ@Z$?Qaqc_KgW5Fn6E>{ z{oi)6j+*~B2R?m1_t7X~X})$s_1{D|%FZ}6f_`-v4$Xt`k#K14?#j~lt8hytr`fZM z)~LwzsO!!sx}&#_ibCZ(@I9_4CJByJJ>3Jcu%rM@63ET;s8&yIl7Jid)j8PrE-T*_ zo|0s4?ib*(=LgqM)}9k~(*?s&(ltU#+(p{c#`JM<%rBb!4lDa$z>3W%OlG=}3*5t! zh;_Y}^N(KnC8~BUt?RC!@&#epez=0DcOIr7$ANxCEbX*r+pj~qYmwt_z4GL+E(tk* zKy}!iFMpIr8uBST+&QNX)REIt`L1flwM6DZj#CZ)3iM$~0h$YuyJjM$kNfC?)o@Gn zG?+%O{J02-r7B|_4JB3T3x{FB(Uxa@sY04{Nv6yqljTegJXEggyN1b?eX1j3eE%B~ zS~mnnsMluxh=#x)Ag`*v*XYmmy+hHjE^HY3-3Yio*ZvQEZ@abK{wrO#YcyxN-F0bZ za$hSswTadUxIV@I!wA^2G6|-~weKp})&D8je^4R2zk-|nf|lz3R=rW?+X{{L9YnVm z`T>IIZy&^=zooSXyYuG@2f<0IRla~iNR(=`b#^_wZFWM#P8=rGX>!ca+fJP0)#N^F zf~Wv?;>gM9RHgD8pG~FC)%CDWyV{AXffHL%YHirxb0>_H9IgG=Ca3*>B1g7ImYfek z&XnSK(R03nM#3Hq<7(4$0ciM^%*fc|cyhVt30pV0b3D=eoolOntPNI(EN`omsx9Lw zc!)hZPr#*B{4+M2DmAl5$9<#azh<*NL=ZCcFb@0fb}OtOmVSgkdMTYdm5HNOV2O_{ z0=wOYO37}+N92@Q;j!I@Cm=Sf4&$3IytCU-PG-hhNkF3Y-`lri79-hKXt)ds+X`0^ z?99^?+#LN0XmU1W>3PYXLgk!`o>8bf8=~`MYpiTPCWx{IR(Psk}h&QoPOF)o{+lub^iY)azGHa}Z7!(~V)+w)1; zQgCzhw;E+r&bjFC)nyBED%&p!qHMp$v9fI#mVSeO1Z7i7%Jy41n##$?7`yD})?e{oVHbyCbz(0br zDJ5n5qnz@SJXN-n>oP|o;o8dAfl=odZk9$lyffnS9RIA zevq;~MG$3MiDPABx6Ug3BWQ0*N!k7+r~EWel?~Ix>P=9}CMQ!iC5g+nbRrWwi7qi* zhJ>=cnv^XCH%G74D4TN5MX#r2qwfrIR<>sdqHNFNP`1T|=&Bq?u$PAAzW}lO2)a+E zOVL|#cY@qkI@alNo$3@adfeyal>f|AdtcdS(Y@+ezP-Ua-L0HVcdI16yS2PKW?xl^ z_%?lVyvUFmwyM4&1+TR?J#)TJBxL%Bd~hcHN28VduLM!f0|Gir(`sEa+S`*SfWQ(w72pZIlh`XWKp*DE;G*B;cD`!>?c0BXpjs|h8f zCSH|Oeu<}Q;uO`y53ME?KuyTW)Pz!bu{4?BYZHL@+62$2t#6iaSAQnq*?%SWgNmBrWn-{m!pqkPf|qaN#Js%6Sn&pcVR@;9@bVow z<=1(Nm#2!C4;umnP%=3gUMiL6CD%Ih#+MK5`8LmpuP4>kDl(jF<|<~^&C)Z|uo%%* z%uKar1s zx@5>2?8{$$CD(TZ-{sG@n1WAgLWJ93iN$Tt;`V;E`$eaNgqS*RmQ&90R2`qLI{pmE zxRe$Ubu1@S$4V8~aabzw(o>4_^>uBz*RAW?xodyJ2y*Xd^h4M9Eb`S;^j+kic^j_s zceKi{o%ikF96{bLyDD}MqkVU@Jx{eWojuY_|JSl=%CUB~u1(dgWmndEZA#OLHM3Hi zs+*5*Q-;Olv8qj_;33=8Dujl6QnPJJBAsbdxnMGUc5SMKAllSuoVc&~iYb^;0BWcW z*JhNEHZxXExs|8dOi^uy&qgCT3ZTu%$+Q`z@_Nx}s3XGC7=Y2ZdVO}y48_yBxp|%% z7NfU{rztq$sqbf2y_odbDrOBnu164j9FJ4Q$2I`N@=*!lW4oO4IG*Ao=Mz026#yUQ zWca95)qE^*=`Xz^j7gP1rNtZ6*I%f#$X)s>f~`ELGZB?2OZCn zMzAOU2l#7c^(Ov>$*kN=Qc(}6r`LrH-cFHI?%*ljen`B%%@mCS;H{htZn zbWxJ!IjnM%HB>v#zW*gpZZn3Akz}g5!rGZS)i%O{PK$=?F}5@1T{A0*Pu+aH_!t(e zk}B~@!A^X#bJXncw2O!{^NXs|j2z{H^@-!;XevR-(S|s2dvu?5+yKC^?NJGlndx%M z>+_V%3`k}kGQFk%WJXR#W|XQ*W|nPb*4{MW^@k%h^Au0(X6SipSd8Q#U?^b9LCzK2 z%A&#+H>llbIrFM^?mhoo?v~xO;j+_qtJ>K~fsUlG@%&0X-fm~#Q>&Ss#I|ldda*Su zCJ9wyn}Xw>B&!SdLsYazn$ZOkr79U_jtYq82R9`M8Qu&hBg1dP5@vjYfAK$(xP@us zxP6v5^<`KHk>MUW<%p+bc&TJqdk4A27Z5TmCnLj370WPlHr>1xq8n%~(MPG*ihKWz z-l42@?q!h2a6;gSW6k*qj3C|Q*K?Gsqm917h#hvSOD&)_vEMQotV?V^%izh(+n?*U zI`v1j^ISNxJmXdZP)l!vK@?pDTHHX?%xaLr|gGjr zu&X`{iwRZLWL*mOhE=vbXw0iS2Q%$KVp-K59wgkghhBnU;^sJ+_V6bJ?m%jXD-8mU z=DPMUTjEz&rwbwNVM{sXKAvh1%;k2k+!sXLZ48L^AScrvl*;S$XdS`dg3ySy!l4A; zsH!XYwW)G~Uze)?2f?qMrxX0Td3wQD@e9V4Sn$7Of^Q|SEBLjkaDqQVD(d&KPVj4H zC&90qmlu4)V$xG3_$hdZe&7Pc>l*$UxtI85#h@l`4i@H1D*z|IDhf^iX=Aiat_%Jo>){2m-v=V@_yz>;>BSR<%b^_jS#tK5pfY&e~7qJgDA`fl$HS1LTw!@f3H@7I*Ig4fmV_g1d4u z+*K;iUF&HF#@j5OTf+z(3PARk>C2G>LH6#~w%!@^lDJ+%~^#JUJM^ zux(Qbk)FkJ$_Me3^pqq$>NvuZ0+1d#8R=0fFFoA0%^TNz^DORGTUuSKteKw}S~oM# zP{U&6RxvaMJBIo;x$>XMT%L*;^N{^(NAcFRahR)^2f)!DU>*R+2!MNR>>lSMn1_HP z;(#M#_i(weZo=%QKy#}4g%OKBtz@IXkPBDM3D@Lz7$4*Z-(X`?REFhIg~zhLwg!ze zdpl<>dk)W<{Ne3HxwbKAow-~g%bu?eK0?87fnnxyg+$9hQ4uY?0NX zC-jIjmn$SXlrIeTjOSZeDrPviv?*wI{xj2LCZ~6cR00iT+U?=V--w+u|rBI#=lW26uuN%a4Z+*lqmkB9BSr(Y_|v zwPCK`JlwAkeU8Gw!ZHA^FXkETFkJC;9kp=4 z$aCbB&*mvco)07Sop3?nqMQsDl_cfjGTx%w$;KDeFdC|=qNd+ zHU>KFoHuz{P7q~14~M>)?G*usQf)qe6*3i4>hnd&eGpRl7{0J{0nfRgHEB?g9Tu9r z(={nTXPewk^PkUTyLp3F1SdtE2!} zC?~^0rHWbDf1^=!5s=ip#d#MBrh4iwojb$p(r);1?+yVs^}laW!!<-QQs z$;V=ihc8;*2|J_RxvIN2*TKhh7O#Qj7ZdjweQd91z$I{W79S;9{GD2Tnd=Lv1H04h zPCUIk*rpDnlrM8#3W}JKe3|P)2_mOF1=VM{$S}SK)K-PB`au$8SSQ=2)Nh+mxw${rD}G3?a3XCDAtt4NF3; zS~Iw-HS_+1ny9WdKKFLIi^s*n!jh>hon}yFX=|?4mD`f5auzPx?;j&ipg=Bs#0= zX&>sb+3M*Uf~coY;KaIRAL>eb?KH0(mOf5ESh|j9hB@Mic%#px8E>3E5H9q=4RXrY z@{~TfSo+{khD!nH134M?C>40bo?fJNy&V&2b-7zDZ_vjFn@%Ap1DikU`{v=Nc z-z5^h`wf8t5I#AX;wqKz&rA6R6vv!$q11$DQs1ESOzHa|tiPFv#bFF4*XPtGLamZ( zHR}?=&8ozS^V>P8t(1a?&~4Ab#aH=fa5yN%)Na9=UKA#DK=Ntr{?=yeSVQ3>ho@#s`Y z_+ntbaxXERLhPI)g?JC|#eIiUP#R(>8#whVin~b2@zaY0!eY9hiS%chknicR()tBnVGDGrEiiWr+eG5Wh?UQl+Y6Q zQC+hQEf?cym2H@UhtQu|bNL?sjQ&)m#4^%1c(|rK?gNrcdE}W0S&eD7{J%UB=maK( zTjAY8&X|r5)=cc-&|toc2Xjn(a3*Lq8T&4Xkg@OKFb2>*Wu`iABzwf?L4cgBw&xFc zMxFFJg%V#AYwXzJ4x(1aDO;Q=#OZ0W1)oA`A4Q#9DD5RTY6>w&xmCj6_%6#s!ntA6 zlgX~K%eT~#J|I)mnXDoabN)wi%D~N>zg+UkX;4H%0a)~MGV-ZZ;GtmpxNoK?j?Bqq ziv^k%?y$-aNfAz)TX`6_|7Rw3E?59g!6|%;2_&+JmUOX2u0mf@>}-iAH2EU8HI1Om zZdRvenOB`Tf&wQ6Gs-Kj6z(b7cbwr4ve~C2EGJ_t*ASwmTUSlc=raX--IcW+UxD%e zt(H+$Oe~{*D(>j8^cc|g&dZVIhM66?+loKQA)$+M1IM-V@zz%uoio3=MpC4798*x||aHu&LZL%%I#fCU>h`Ztq-7!+C zg69N(6Zl}Ge3t)~aU8zAC(2xce!cV!HW6z%`+m}fb~ZDJBJFmyF#ICr_6zV2-lJ%X z!dx*=qFk}SGg>YVOc}g|ptC)r7IB!Jci6?#=15cQCvkY%!uT2kF}N9>7%gB*8ak<; zvaqKutaYuhKU>(d7B(sy24-$21?S)F`FD#kS}_=UC?v=EOPu!Nn6;Ae32TzQYR}gc zvB*W%DM29SE;eHDNhF?p6o?q>trdf9NQ7~?pXYlPV_Y@{h04JxPA2ip72C35;Adb= z7~LdK6d5tbXJahm^n!)0XU}o=ih7F|nd=W=21nlL*b43O6t+Qh(&EDW>`JilM;9hDESSQ2q(RqN=E zG2Of62WHF;&X{!h2G(W^x6SN)Vxlrsk!~yQDH=Wo2~!(NFB}8Q2-qkiV@siEPI- z4~#yr;fyImQ#Nzb6QbCWIdgK0BXvS!#6iYM3(EzK zUB8R2hR4fj^_E@?bv~6a43kP#m`&9;c)e+;F+dwnt`*YQD?HvFr1cjGVt(W0ZNe^XXn>q2~7S_Yb~G1q7+n?rxR z430y{6RcXRT1dUp#M*KlH!Uro@s>>mzpX=Yt9|R5{02M+Hxz8SLZU0^wP~@_@cT}I z%6$@gXmHbkE?2rFiv!T6-=^kqzJoKkkpc(&!dP@CObHvKyW})QcjJ( zbqGZ%#)M9tT?oEGe~gN2W~R<{VTfC`cUjmd?jgl3BeVVV`Bi*Fq@o)&`}n_5a4 z7AjO5rWTsAaePAKr38%8(c*TQbH~3SGA%CtnQX>#28#lJ+44#<-azijvbyqV}F|%%tF*6N` zk(^~_3U$nMW9&lk>_39en13o|hJW-&9J(2AZDl4wv=tq~xtsritlX{Qe`q6Z1|SC= zh|t3+2Dv(<65(z>2@88OJnnV<;*Z%=T~Q1Nn9J8;N!kT~<1K>YC}EN7>}Vt17Bd59 zFFT<6S8Rw{hU#0$DbM1mp*jciyH~D;;IO0shU#)Mb*EJEP@QWzH|LEHs?3(-sH$v< zzn{g~m}WK@1JEaK>D6^8qLPiIZu0)Dy*KRONt3Ku5bPg3O$fUk8;lTDjS@$BsHm(X=n1nH&aI&=i<{C^&jMnc+B}lm`JbD~` z$R-P`E~^k%Sv$CGtg0agU=>YqY?*WY!$xJ_SUZUGDkOOos-#sS>d?5DZB2!?rp4=s zsRNHhO4ZnFOX(r7Z6s3aB#>|5s?o$H`mk>|Cb_P`)ZPA7o0P{SS@j!C_cEWYHCL`w ztKU*}PNsIo2aGIZ-%_pW`O0Hk9(K4|cTZJa@#D179d}!;<;vte7K>4ZxpzsL*Oh>b zw7Fzi3Fs)SQ~MoEpwuh1JGD@=)T@pe0k8Rtw5@y_mRLiXmh)>`Q`Dud6FNj6dI_rg zD*n@9K->pNTdp-f;l^{CXW;t+Z8;S493th5bZo6%^TN_rytU_Sbdwlg+i-4^;6@jT zQ7WBRYi@;x{*Bc!v8^FBYi;kv2|gh0mev{I-lhW)@)aX$FLLi}Y6X*wW)O!J&&Uoc zNrwJN^6$weV-Sx>_^|e3Z#EDmw7ul#_gNs=b`Y03Y&hfQYCM6*vsYbV-fWM@C$q4T zeUM3uK;0x#&XNnZ1p(+Pj;K z%9*`|Sw5@XMcP9&$Bd=E#^c?SKsQ+E^6~c)sEeYAS`NLo#w;-S53BJo7^D3$jG!Zi z3v@WGQ*Ap?*AO9YqYxpsAFg_;jgA7z?ifUcw$2P?M_47GP&C;2hbr6nI){g_|*``q36goO?a&G5MqtjUptG1r@<|i0Oxa=Jy?CctNcO;qa zm3v~GPugje+q_3Zps%~GkEM_+=9q=h9Of&~-y2Ts!uuChvKMjm$`NorS8Qy~jIn*F z=1@KiF801KzB`VHr6Vmi_cSvF)r+nOsOD8PQ1yRzfIs*c5D;&~gF^s%Z(^yTa1(fW4}SNBB!y z(2)rm%KLt0TwPwEC$0-c_nahXMlanygNdgE*uRmiP1=i!4hSZyo%EcMTUH^t&8w7!INuJ+LAodARTL6ki=vHg zqrp*yX9LJ<)vt9_p*`A&YVB#a>8nEVG(;e0(=DS{Eg87`;6zlE#!WF=BVx}cfZnMC zQx6$FipkLERU3>MC=C&_WpIU>B$I${Ocn&6`&_Vr`s2RA31W&0lQ89wT<@rXJ3!;6 zIdjGPv+ZMJ?4f1Z=+yZ+yf+r{i zS8U3eJuO2t4*c`t*vpE9BD3S#;-*zwoC?kC8zj(mPknG#aX^>R`j-XMo00Bt>o4>*sln4 zhl+5Qi!e_S<_{I&OWGsdH@KZ5U=*Z$^jX~PB5W(_uE|nIVLOC9?rY#2_CsqJVJWm$ zun2UGFYAqAa1<`)7`jUl(E0B!rrLsFL;je<_K$G=-@_E%738O_ri+-=7p|HbteO-? z3&8Po80{=4SjATZ7Rsl*8bA;RI|tz|fu>UMZxc-1+xrg;!h@Y(G-6e8NkO87!^yUQkYQcnFq=1{~4jHs`> zdX4k#XjMgHN3}l9BDU5dneedR7h#qDR^dQSPby3F_Anr};$T{6?l`U$S9%2+*DP?j zglG^|kYBjNeAerV3)H2Nr)Z@-%JDoJnCxZNOT?oKfg6YaFfJg^odtJX!&V z(r_!1Dg67$PpfFvEOxXn9vbB$oaOJ6-)ocI;&v}tSaAyLmYLSK9}(l$x4+U@+nWkq zuI(w9w)fw@#(d|TR%^ARJB<4#6i; zFxn*x*InmmS2a4?6j@bl8Cw-ojmj=lje2#}s5;yhJlu^Km)X^!IGNU=VYWIv6u9c` zFx-mRVD+{bkNDmgXdm1Z!*x44lg{W)oXq~+RpiATNa%(;2;h^CJd69++pHs8%mCgc zr~G-IngL`xUH3}PID<<8%mB*C%m6A?Is=HpZ|v9cghGkyzQ|gDBK9FfrnK-CL4mJD z&T4Ml(riy{ivCI#BcaIhciU(VtB4jyk)y7NZQr`%0k$JMC9b$vZAQ82`@qS6X1V-~1C#o?V{&%6I=*8e6S`tE zq%8A+op6xBN51lP$mcU__7vr3jwKqOm&03}I!dNj8s@+;cRxXDC-8O#M5|=h=h`xv z+qG?_;~P`=2)ko2-0 z23uE6)qK}Fp@oRCUu&0_IrV#Q!&DS_Fdaws^)`;GT*UBCMws-`3&deN12y|iGN-BE zCmP%`;Q^$3j{irja=t}Cp~O-M47?wI@sQe$&27;VMg;CVa?1Del)$lz%xfhDAaHUr z98s!ND}9%@SSxXSnXCnfwUQ`uwD7$of$M6e+7vmhRG%Wt-)kk&;wUPVL|s-ZrNkBY zuFWW?m1>eDtyGsLuayjo@wrMXrQmov>CDLnCL<3J6t5wB zz4TKPjt9m5j9$_^`{)F%tCxfnG5MjK^7nX3Ot^otd*$y8w*n9oIT^jAR2jXb3KjrAFi)iV7HbVebnLOO63To z4nHjdnX7?71*jV3W~$LB^wpR!h%JUh+rpFl((ojsZ>)nd8Z7UsJ)$XiD19S)l=G2U zeIxc}^i3`ph2cKU>iXvdQP;o3VIT7OIqR&S;LX}Y<&HnDx?s81Ykj z*<-mbz5QDWXEWrxCHNt+vaQX~A|8fU1xWE;H6&hL5fPS*8PY^{z}Pg=geL7z9y*_< zIG-k$50*|QpJ>Q@mR9F8SjOhkBtWe!@|H#a_LfZCo4aM=Eq)9>bndiKHA*8rx?p5@ z)$2zWjVvy$H;67CSzNctshXV=3T=hKBUN?HZESNNlBG+z1}AJQ6gw5IrLCoRJy&sU z&BljrKzQ#XG;C`&u6NHI*!!lWn@Oa3MbgcyUKX@kxO3#K#}- za+gDBYZSC>>|KR2@3DGu=Qd0uF7DiVgLq1DGE<6e!K$%*ca*tJrWB8nqd5iUm%?D9 zAe`am6vAL)FtID08_^(!-M=wzrWl?ki_z&6VmI`b_&?5{8Iw*4?!<~wS^6VUd)BAR z`8^&cJ_KdP?=_K$ z)Ht1saOT&6Fy(ku*ivMa9pnF#Ffb=5{M}Jl(z}~Qw9n`ok&|Pj7^!j0IG)YUJm%QP z?2O@RcSJcN6=B|9Hi;EyFb}r9xP02KuV@1b=jpy=Q zpz>9q(QbiE^oVjl(c@qJJRMuMnL;c2DRSJQ5N$$D``4=z;$!`BjNF z-}8QAbnV>4KG|igxD?l?!S3J59?)Dco$_#is;%ivEi1A}S71MQ8Jg1PMpswv+n*ukdP?rL%o`eIPvfYiGdqj@2-ILH%sm6p_Ph9ycr3p*! zskpJN{v6)8uTR7H_?N{t?vB7#x6;v(|4peJgHdU>N)I!qAgGKyxfvtR*z1iv<(=5- zhOXUFY}l~ePDFIvoWeSxh3F*7mDjy$e?!>ns`gxTvSRiPo`&Qv|2vRmYMSLB*?4SpT|M>|vGBB4%+tkzDq?dB*OlSG!MCLSdWM3!{d#Q*+?-rp z3h37p4op$MZsgn{a$LWjgsw;iOL4y*r%dPMG;FIhQ5?=c*;8rbe!dZJ+|Q?BoKUoQ z#_dlGH=pCy4y?5F^97}H45y#xqaW7K3#xuzZbqz)-M*h!-bp`i=-M5{hK+uHNz%`+ z6IzHqID&p&VvvhYQB1XG_id|9O$M2fKn6JwVXPf|f@4yZ(ZHC3X=5NF?;z(@^OZ3U zi1Lw-V_Ehb#j|)+ZH?@f6O;)uIaW@&g{Nfl^ODJHt?erSnUs@Zl2XNO-x1>GHZGt> zN3Gg3-@z7mqeWe@Xez2Je%irBx8QOe+_hw*#7LkepC-QAm)}!xAv)c$Dc*ZBJGksS z!6c|;{5UnZ@7K<+5zTYyeUd6tE-EVFA&ITD9zb;NI2^M9I2a#9#`88n@fnrtKztd> zwH4$468@ZnrQ@7Hgsh#fcc%~TGJdu5-ZO^tUxI%Oe)PZ!MdDzVKvELjnCBVLZvn+u zqOEhwma8OD#e^0cfT*PLJax;~9jc_0jVJ|hEMHDWaVS-M(Uz{0Gs+vkkSY!VthsU2 zLVhcTrlvX<@7hLT7|{n8@Xx`7^Z0K969)M=to7fMch1vVn8LGh`cDVoODmo@HbgXa z%KRa!WkO+mAsUcJ7dH*!>2U_@X+t?XYnIak006ocF~6W6cGesr|lvcK12nrKPu+mL)Fvvk%rG+{d`Rx(MH zbe^#~-m24WLUAqNVw*W!3%E-x>HA62U7wT)_u75Zgt0OqtgP0o+QvrbLb+2sDYy_( zVbagpG21_AdH>>{u_x6sbJ6*Vo6eU_6$jlmJtiR`9+m0@VS(cJ-fC2AqE<~DN?`|kmHsZazmkvOl3bP;@NGWb-CXvG2jJ$j70$xWpg%HVIynKMx)JC!2?z(sI z*rc#x65YKUD->X?P{Ir=?A7Sf9;I&Mg>X4ui0+gZmWT1;hL{&3y`qPe|K{rQZwfpv z|7Li7`OiqouLzXC3nwoB7FK>s=onD^x{BUS3@f@km52vLS1c>KMdvgX@2=?bx%a}H zpCSf&x3Vi`rtJ2bl)cBwE@ZCkqB$+QWnyK&B`&+juIOQ9|9o}XFQ8q-Wxr5OB(J*9 z1^=e(y_Sz6Q1**(;_)}i+wN2N39hk0Q3|C~8G%X+oR8^+Gto3tD;E=JJAYeyifjS= z7_Z$2IRH0-@^+KmN4kGow7!W&ly;$2z?MxfQfrNGq| z#lDIjRtJ~i$+W*MshhYCw!-V{;J@Uzx#gn>ly6&{OdXs<_-}k27>?4`#E37@7&V~1 z-GkVRt!J-YIitg7S2_K}=d&j~drqKo=Hltz!vVsQ-fm*Le0RQXgSVx~c@qxnVDil2 zl?qXwRv|8P#rIPa@;eL;8x`^eWW^9UY7CoG8zwpq>7;6;Rv*gE*9SV$UcF94RMCmb z-_?Wom)3*PW%cmYxGji<6+NhvZRA(UtWNG#yP$p>gX7>S1|e&UE2yU@zK>ZEJpdbR z&wFoY4Az`>3hrrY$}#PoD_%wi%2fAyP3`-;h|v}7uJ3BfTdx;`j%Bn!Z1PcloLvaE zpd3xMC3;k$H`mmiFE~t%#mk{#bn~ZHgWcL&2x7odh@i=i+61$z4ikv!rcOQ z1+L6p`Tbw(FE8@%*IIt_v?=o&%$?D9ME?}??Kpd4^R%w{FA%4B+K%&|RouWr7R<*4 z2Ds~dA!(kr=lmZj@Gm^Za%|-@=sQ>3e6*ZGbJSzS49=ubuAzf-!v}}M2RGKm-#9#i zFoVExHKu-SV{{($_lz0aIJR*=Gl#4U?fXmmqARM~>OABnZmZkjRUKBZwJAcf*4CL> zYt#09x7PL`qQ+X=_vCt+Op8DmID{ z$pJ^=xiz$%@o6ep0sU_hmk-`3P@Cn)G)G^g{I~)tk85~oIrFPPdYfC${2Ff0;Y>K&g5E+UV;N1vXu(bIMu};2 zhjmhnb=6WIGmf_nlwc=B;vqez(h7&@?U_E%a%g;9r^OD>q&raD*|@mW!ZGh1T}5qm z02(pF&1HXAl~TPXcLGe+Kf5Mp95x~xvrE7fI&)O6W*AW?ma#Gs-F{vG63edAvszZhbA?T5t9^fkKxkL7nayk351 zlRqO%bg3f5@~d6)ex?#~&)(GQN0pU(e_Q5B4Qb7OJio_8Cg-U2Etg|pf5`7t&EM7?y ztt_(Wt1Wu>j(pRF_vk7@81`G_5(BKp7AM8J0evdB7FJNA5@F@RipL=mHY3C(znbK| z_k@v(>@cpGxSukBQSUw!|x@5GXR8I6WdR(XVKpQ)?q{zUg?QJ^GfBp^%tZ z(M(J}=t~`E*`X|LPDUdHQJj$=dv$h+WN7Pz*G`61$EgfijwVAtf-cFBs-vO@{ypRu z|MBlFzZhmR^f<9IGW0&+u?+2x*UM14zNH9jt#AEGj2LQtt0~Y`8rvA%N(Ur< zGX==VE<}N23U7|?rOwB6ps#Xvg0zhTZg{1-j_DaSustduZta}KAc2#nL-C2PLec-Y z%|8g_^p1`TnX;-Jrf4NS=YB+y;@o2Vy}8crLY!@7F_D_1uZtKT%+-2=cFblki*OWK zk<524?r!Z!lA+_8qkFQ6Ci_IWiQVm)bV-uR;b~4)#TEx#vALcl$*(Pc*o1tXM~&#Z zy(NhsmW2N>%SF4BTnP%(k*4L{4ITQlIkP}%$XaEiz7kZLq9iWZg>s@LHM}uo?WjJ? zvRo5Zj!;3Blag~Dm}hi9yy{uPxv9#Lyms#tlOC4zs=2CsWk1F4w5rXV98*mbSW% zwJJGH;_H6hBvE>Z+fmW8(ZG*932jY7_h{|0$eJ*lCYteIb!=*HXd;1~CVD~*5KZLf zOQehRW7*LD*}lyfS5ivpB}44HFL64feC*Z6MAALmCT-a19_fZu_ZU{wJ->hw=^i!n ziXQk6l3%SA{~_|L7EJg2j@TL9a}@Ac_Z)-Q>z*yi-}PULP{;myTC518r{sWOc>Aj{ z;QFti-^wQ3u;h50jQz!l$KVD2=&6&O{bfXQmYjG_`<#eR+D8HX+BL~BZv~qD)pDk` z!f6ydS2k30^c{)(k!@%f`D{y#?5>^}GP;fys!qd%u)jfq1o8LvQaXVMW}*!g4vVcJ zhbVi#nZXSspM2#cVWZO%VLGCw_u`+N^lUzGL^TyNd-Job{bWtFtmGSGOp>286HV0wR)L))|3USJBx~N!%kf34)xzlTQ2xJ0F*2ma&a zmrUS)zx=8xlksPW&4!Y{;4D8GpvD~!QVCtV4SX8zVEl4_Rw}gmsOE^VoY#fr> zaS9&Rj{Aq$7)F1WQ^$_W2kdhS=2_W=7ml5d6Zg?yKq8R+b0pRiD@ImWI+buI`yaw5 z5mi9H+tMnKlYM51B>a^DMJnkz_e&D6=IB9*{x!1f1{H>k3PJZ7VOSO*x>i9;6=cb{ zaR9$-E3)o3ly&z(1$SCP+KL&PF`lqgB&=s@+D06LY#V8J=v{UnmnnFD7>R3+f;AKQ zIKze#?B#*yKrjY1M%-u&%(reae4ec>! zjAPa)zGsa>wML^5*fomhRgKl-7VWLjKiej(c1lVnu{W%#&1r#F+%+94TVivHkC_%> zuc^&BKamU9CM1n%n=qu-CjJVEY7-KjiXQk+lV7re{|xz6E!HMpB6ddF&jcPz`-ky* zy`RdvA`C0_~d$62c zV$;C)hLOsMSXc%wW0RQ=+u%ecCs6b_nfaGkk?z}i>Zx>W;&3afdrJ{1se5U zcZ$r6q}Z$1o!ck;baJA4Oy$Ionw-1>S&|d6yrKvGvixES{*THpew&=UMeK~6oC7?T zlXLNUIZ5pUMHtdPNJqH;6<@+=wVb;4LC)sdcCfMuHypVDCu1L6hoI=rI&@^S(~(9b z-%2B%lZcD)NoEw#&&(p-xIo@M(7t7xB|j6bR=gXV*CqRyC0lLDx)CJ3J3(q{j@~dq zx)2byqZg#6%5tUYv?K`9*%Blp$0hcHBo-hmLfGAx#ns|aO<@+;FirB9W_$W$(oOKT zHo+4kL8cNp!FxxX&8u#*eRu?O^v~)mN19Sf)Ql&o9Hw+D&@TUv;X_y!-N)&ZWz z329bFPlT!ZXJynlY%G)*8Y{gRigOt;v{xH1Erf|&%f@`0Qad@6oTPGSSWOOd5F$BL zbyxJjf4TgsQq&PgclZE zj}!Nm5*B1}ZzqdJ7$0gQ+{xk%_*6>@=wIVxQ7|WqH!75mfZyWJJn@x4+j(rBU5pvBH+D@Ftb7npCO=h%c~{ z$}y^vYCCVJ`Dx>{VUtW6R+CAaTeLtc=vsE3%99aSdv$i6ZmSuX+5SXKi3ubFQF)t#L*sm=u2tS9AzH$Bc{tAqu2?V8|T`K<#7n_Fdk3PNdtdjK-k_9jUmBIPWFN*8mq)RaA*Ia z;ue=niV1v5+uplog*iUeONcW3l!CSir&Eg!$3|^RsCsP)v=+jIcw6p@C9P}L|7aM5 z`NKvPE}zcg>*(g06WFZO#_jsO`Hp8MG zG?<&Ogt+Y!^0{V*vG{3n50@PcI|lwqF~;Z2-_cy?h<1T3W{r+PEAGTgbO0ou-O|+u z`BR#r-PO9cbcv(A^`bS>LhxhgX3?^3x=tpxI)u^9(QN>_+6sOxV=(ByOT-7kS=~*!&c)*zau5^ZyLQ_2EnW^ga)W1rHq$+?L=fWc z`A-tA>a#%#HM@{&DCandKt>%v5Rhn>%!>EdO7dhD|j zHJjH<*VY7!<-^}$_Bn~@Q1X!r?x3uDSXq@07HxrpZKkWtPCzy;ak8O6&W>%4Q+$Xk zM0KZ?U0tSt?w$EOr9wW>V@$}RlRimeTcYsmyCimh*x(%mSH8dlxluag#%kG+I}BFK zU*mX%VzpZ?u9oivpj!6pq&MH3)^VC%b!?RQI#zDJj_FtQx}sNS$od9P7V}@uGN03V z8e?Sm`!5BXY-wz`3%uCVcqKS(<5iq^zuzp|=q7l~Ka<3iQW2kymrIP@03(frTas&97R zoY`}>m@7zAa4OFaOm7TkEMp%S?hV&81Tzj?IXcI6x_EM*ue(|n~W(0 zT$w$KDBtfBJ&FwIUf3_dv|Qvke7EF<^&zIIlLUaweP&IH!28< z?LqL?#2}arj5-T0Mc@1zeWQ4yk#cE#YYI`@hQ7-CO8|854(qAGbRHzLdx4ck{{Qg* zGJobmIdQJv{VN?twkHQ`*gR5X+BhHl>>J)U1C!pt*83{=oI}inVEsA5rxagey2OR{ z;oF}fZa!#Be19h^2RodZ=ZpTL&~w1DpXE^|x6L6uAG}Jai+4tncE<#EWdfU=z^(<0 zOHp{8i_G>B%?A!71o`u*(Zb+z*8Li`0kX^T&SgL$^iYIlgT6NgsMXX%+9?;34gaGZ}gk z3S8RflahB)4hLI^&tch>#k}43Rlc(>L+THfuQmB5xIut|yU zs>Iiw`1VXvG$pXlB)<8H@5ChDMo6~H_opuf!Ns)hDZze;@316AR{}c)xloFH@W_{Z zd4J2Dx~@L{^g9px#@RveQ&x_NccSq2D+r* z`Q9#j-zyh--!=?6oYp&?o>;U@3GM{5(*mn!IQpgpH_)dz*o4T_eC0H+*UmoI!>)rq z*9Y7R52O>|v|6VV-=#%4-+{=z^WFJRhh=Q=Jt&Yqcq&Zw!9-fJ@Qn@5rPYcD zV}qkN_r81IaC{+c5_%#fa`CQv(}#}RCkXD{PiY4_eCPyt;NmR;=0e|D;9-BjC)kvr zJ=SnzgEh#SOVNrO>+^0Tp7U)<@8x`70iW~j|CSGZA3SxiZ=(~P zZ}TMHJxG&arm=p-Tl!z`J8Y{UIEa>uwq@|- zWcMfYJ?xi%^}f%5#l<^-8g%XLsyK9P@JA%+AT$QnSDeS#;A{9C?Do;VfBR)(WvoVu zWlK#7n$Gu_cX-F;Ha0komi)jxQ8kV@F5g4{=4p9Qn2qMGpYthZB|Yao)Vb3FyP|1a zZ@(FwRBt~vm=d>&d@%Q2UykK}41z!IsoWmj-{&^zQg7>Z9_V48zM{e6jSoIaiJVRI zV@f37tl&H3u`m432mg59kfm0EQ?{p}Mz-qF;NgI(R? zLqElbG92vMZtpuQ@hwS0cc0}$TN2+>l*pxh1KvB|BZ*~sec~JQo)5kA@7^~%Nqb~c zmxseEr_Gv@&{@o3ILtf6Z6+U_goHWRihaG!wF?sKVBh(*5B+;wUfL?{SDJre!$h=z ze)-_q!+c#1Cf3N|Nju*@rg>~|b8It=4Vn^N@*uXOG)O*paiz~~E`5)q;1h`)w8xmI z1Q#W}^Noq`dF0#m=ig6!J0!i|?8Gi^pX2-A^=P%OC%%Jz-}PJL&{y(J2|ku!`ACw- zy9w-V!E@BF!*@l}1}{}w)9srjzO57A zq0r}KX!4W31w2L#I@nif(=P2VM|s~x*rGA)F4w1w4gSeEMZJrD)90AO!{$(!SXvK> zy%_m8DuJxJ$JuRygf`{y{YRNEQaw*O(#97ZEpZkV`92IO5vVOPnVz8W4oyd|>ofypKE*{01O>1|Me!jjW z$St%RLH6O4Sj8}x6FmLF`A{`3xPUgJIQd{+fXIS*)Hgjn^8!@+^l`yX^qPwE0CDJK zNcA{Yk03_@xzbYo1-;@R+XWxD+{2+MLgmWRvG3o(SHD zAdU-;BuhcQ6g(ve=>}f#asI~QiQ+7w$5x!>!8<^flh>wksuP2T26iMt;nx!i*K5c% z3eR1yc|7A9xP2DLlAn1f8sH38bh95 z6Ys1B-H^8vl?%Khv%V}6(r!{JGSilUF@_LkA z=ckbh`AJfJvEi&nQMl+b7boBgKG$3B4@~p9f1}|BgDga6JDR`Ma6fsC3to>)@!N)P zHT>A(ELq|3e5B#NhG&ez^^?5rZ}_*x*|ycid7$C`hF1-;D26=V@a=}z4f0p47v;54 z_??C~4RSX6+U5S;hPMs#VF~8%H@stU?oM+5VMAk+c-Zikr}^QAaZRezTa#3eG>kXM zhxYN9pKRzg$o)y2CmZG%F)2g5dcKWUj?IK7qW}u)F1cX+qCy4SQLfMM<33 z8xCqxeU)QAztr%0!{G+`Nz7G2j!Si0j zBbMr|xD=1FaPg$&esm%~`S2-Ab$o)SIb3Ow4<&e-!&eOQRm#3Q+T_HbIsBL5S$z?+ zbU^kCTf$cjGIbLNxu>BeeA6I1$B+|)(cwD=*&M6DrJ5AZ%S#frp5Y)T29v_=4D#FY z4suC2Io#PG2QfZ#xlaxEG|2wzdC2_9&V76l2n_9 zN9EPNt{>~-U}1;H8stwgJ%Su>kUwvn#yP<{6yT_2;4CHc)bK^!1v*KKB zkgYS2>++J!H;;C4P7HPrZ?xS1Kjz*9-o~f@YhBm1ZzuKiJpcdue%|x> zJUz?zUTa;`y2g9h7j(Dz>FU2CWa5pM^z~N@nTu6{*6MBkMj@X#oq_%yA;n!O2KoDi z3~?nL+CbV;E1=<$I~nD^T;cj!y9R(e^!ihc+^Bx7DzrJ_qeEg*Dok!PHCI^ zD!+)3FI;b0?H3bL0V@YCdxBQ`c&Y`S%VEZ6vWRm1S}`ugUFf-U8gj4P;P(-o^Ba*P z_#Hl2t;HFu>U`&~5UZZoS#sRp9OIS45v-b6r#lr5wun_4>PM~433dwUvfFw-FTg!) zc#fkNs7{^W{5X@9SmP_H7gQ1Q0%lky_2{zTVj&-(H>u8L!6k97)wMHKrw26-8i|gF zwosjxOrUf7YO8Z~aE0hxf!@tJPy20|K<7*B%9$MT+6B$kGgcSvQhBY_F1R{wYm7-2 zT?@h^z_nOoGl3Lz70-w7@r11RuMKV#vKh6(I_v!oK_Z?&Nt@xEh{?Bpr{J+TkJufI zpAB?FfNvi{$M0dS@aA0_lVcBA(k*B%?rctr?0kD|ud^X=3lxLwGIk*Y(% zEx~<43S*tgI$3l}@PLqVj${QB(>RAWf31G9s84{0`#`2)XRlVngIZ@Xc{!hw1Pu@B zoW*t6YL2b3QNb0WlZL2ct3~vXA@rK+eCtmM`is@&>#fz)0N)pY9}nwHw(3ET8?q$V zl9^19dJFV|KR@K}zCC3~4M%1Nc-tE~Gm*OLJRRWmTaZbP%nR_!9LQov<_CC_2xKL^ zvQ-v66RbWf0dmObWYKfMCz8WnXj9hd0kTJQ)*i7|%Rt!AqHmSd3f>4l7xK2zsTC{_ z4hre)^88kS_c>s7wj(P7JeUts-jTP1Uxk!#)&yteOF(A~MkGrLicWK9wI(Pgq;Q#}RY|c*eJ*KrzUUCfdFv-#NH0g$ z2UUdp$@$qC z^bm5M^Rp|+5>g!T%z2(2>20HR-FiJ=%M|KCF9OQXamXLI<#M&AFN1vfxp#l`4B?laxp#jb)D@lKh+ZaH^s6E5Td7VK{Sh=3 zowG5cu}*?c1y|)iVPI82%{+bIT7GHQbOK( zUHzO0ibh5Vx$}^cNThgVl#qOzEh!PXTgbcP)lVdHZX{dC;=8TqQjyU@KE*0U%T+ou zUdn#ST=mm~&W}7SI_H?OFQU3kP(QCNBD&{lobzH=xm?IIA@a76ULmqd$j%VS70-90 zzq6k#svmhTe>Q5YFxCl7?n-GBIhNl;TF-Y@(u3MWPN0Sh(O38{>r6_?0LjMObOgI& z^>ckBQh@!`_+E3EMcpH337L-5eAT%*QV?sHLR9unOKy*pEx>-7)wN`Bfw(UKvNYT|j${Wh&TBK5?oKwGPGN90nmN_)_f;gKeiR(_oFYkm@uo?=zGkkv^< z`WE1NuIFkjJ2I#M$7(-UW7+t!CYPec{c2S|k`uXG$f;)5&;5}x;%AKWGcGb&$dC|u zRIEn3)W=1p3#s47`gtt!ij=e-)>@k98IiX{=ZLYI8krGUD};>B)X40}W-00Y(``u? zMfOT5nqrTpeilbQ7c$O~cO!ok@X8jVQNO9q%E+2Xv>=nYA(AHK{SYZ2owDx|K-A(H_@))}%gvNtlkAos!V7igY) z(B87&*JC4Lsz861> zds>}z5Ke2Z)2Wp5yO5raR0iQve2BwPjozvt1hNBbVvxkn`Gx$}+NQN5rI3)dn9bGCjubpdkF+*NlcWfao(fU>@#?2f z%8rz?3nid4)sTvj9Vx{{XMRYhB-*YJ-8NbMyc&FzQd&s18(Vg#R4v5yv(Al&pQqF- zlntxL%!r*u=SJ&^RlVnJDN0A1iO!{mljJJVDO%I!xpcIR=rq9YhRd}urE0X7kRcdP zw4_y|cZk(1Ze*(&9V@l*T1%@_C;F)9oHTj9E2U9%j*v}mzPK#9P)JiV^0$vPjlL#n zH8rVcQPb!$snv_?TF+NSR~F)4aIuNiBVNmBu8{GSRENoXLLS745a*f62SSFJnTW|Y zA-h9Rxw)hz zo1@Ex6sc&*_UKzePT^#j|FURT^lc%V%PZMHpF~#**;Cn)ebH4y>bkVPimnlIaZRgp zB$_K^O)X1KMAr);Q+Ax4M&A>XgHee8Hc-CQO+sqBJQq&=K*-4oR;PIC79oqPSW+f+ zn~)Y4T2e7}yO4F&EvcFMk&t^`4lhpKDWqm?t8;1UCqi(%A%7d_iqzdgUU4~WnYu^F z2QKyYsr!U{;!?jM^>ZQLxYT>3ej(%wmwKPngF*(l)CZ&<5^_FzH2-a&;i=yUsd}y@ z_oRL+MueT zXka2gi&B3Rveo5hY3fNKuekiINIfN_bXDtlRVo$X=6jms>#Id*xG6vRbxjOrU}A%3R1F>0tGN1f+8 zW35D|2Q2w-10`bD2>HX+^MqI%Au(5DQ)2CeJl?`u&4^_PS?9={SO+0LI`UkslaR6) z)%kA&y%f7HPbrqgt{0Mq6%qes(ehYVu}X2V@m8#xlyo-c3;ydtxv?Ii(;_YaRvSUi zLiFy#zJUKW(5BcedD416)(=)VJH`D1{yXArj@>4HR$!OJe=9%+3CWKWc>c?x&9Nau zwmPykc88Dwsa9uuY`73UyXL9 zp|z1k$77T8Sp5-uOo->&>(AJ9iPavsd&_^g{~n(yp6_#>Bk@^6wz>97iO&{t#LS*q zlp3ESo{O0l#GSSHydo*+1kcuwCTgCTDAH3SFh^~o$t~xHy?LoM`UU4mWZT!nT z`RNcpBvyE3Oa8K`OZy*d7qkS@+o&-gDw_P9J}#eWlW z$VFYR_(>t_UH|GGKP6;=>!*FK9Kvo6AnPH^F~dbUO(9ne03djmOSDeGI=No+dimTq#Dz3+2(dD_%r&esy`iCtgg* z0%vt^{2U?KZUjigOG=)9Xs9{NqU?C7JUTh?GI`P(9WN_7$&u}Wc!fMVW8;;DtaI%? zK7N6aEsji#R~K^Bk%!{7g#6;jq<9@6$r)`*yq=_<;^Jp&yn*PP@5ropGtsH)$W!qa zLe6&c*Zg>UA#>fzd~y8RJUXw&JLb_@5ziFzTLG=H4YW4iS;!(cpMDU(LC9rh#?PXU z<6Whmub-^#-i!9dd*$)GFWxUtNe{*Qi_XJlb&*Bi#0Ll&;AYS7;={!AzF{_^evXe2 zopmlhzr-I9@xENz1L`5F5`{>!3*X%C9d{_;vTP~o(Pgj{J>DOpr1 zZIY1kW<``m<oh3s-|S}kp%kd3Zf7o{zc)SH|7d59XOEfbwzOrEnq z-poUqrL7f`W7d#a)Glpv9-SN0cIK(o-f5rb(dnD^Wgc=z+R;4Z-n3uyka1~2QSQ0P z98O8gSCo5qzHhb0vS?OXaUso~v*f9?l46yd-{+;BDoYJ=N_~?t#VOb zBXzq$$p(5CgvYU|?X?s~ywxC_`de=FTb*{HkTPehP8O|At05#ghObMjCFGDBkv61V zRP^+*Zev>AqWR(Z0o)bhzYVk{t)W;YN4BjXJ}%$dM0I-5wzNw{=aSzv^&`O!5MHIs z7@|5^v?HyFkgLsll}RfhzvIM=|FY=Qv^L^ru-Px;-j*TB721Kc%%W$*;B2>N{35Nh zkS>}y@@&aLx9_&(nZM{<>GmmBXI)KIO8PnMc1czz)$JxM8Lx#1rT+3?JpbX=>elM< z)6zP0Ow86trKs!g*h;+<6F3U5*&zEn!V$=(v! zdh{T?FbjMBG6(m!#PcHytW*j8TUlu%g)R7PnB`(ocdwONzM)cBkKbr{TlDx%WtPHM zx#X+l>J9Bw^5|lmZoZhoxgXvU@5f`!=TZI6RvLVZm0}3!S{S1}8afE0QE!&c&m_u) zzkp^Wh&GBe&Pm(W6KxY#Z4KVOgM?N=$g7uYI(p)zFx_<<-c!QWdenZordE#zVvOXx z)T3>CtaNr;D_w;XKD}DiNnH?6%+hJ_JWV5=+PR#b>OiKHUpVQV-|$uGVZO~} z8V~47lUhLYAmtN_v<aAJ{-5jqOfA^fwdyQaSB3|pj+k!S8b9^Ld2 zNlp=0kT})?dUvh%ynrsr)j0KN+h&{YbnLbpikEVC*mheuRHbzK2r0^f_Uj&z&cO~K2a-o^%X>6dr1@L% zWgn3iBY%&I#C1ALB(A^tBIQFl7K_9+`Km~*adm}A$@WOL!swp1$G<$#lU^IH`vLB1 zSDeS^!b^w55!3)RK2dJc9D_*aQi-e4fxD@urEP4vB>(UOFU7n|SGv_#S#ZCU!{F!qqL3 zZg117b?EwMH4-}{rlOP_bsZARO@swxYd0WUy8+qS)#&8f#Y04 z_V@u9;nKy+!F%yusYuUY_PbD|{nz1FejtTM>OHM6V}NBQ9>dy3rKXjvRQxi`F>2amjM$Dy%!dZm%%Y7Z8JO+?BtHH7;6!Is>P zogOWlY)ctw;?Y%NQ6J^y`NN}RDMy<63zw2-aUPX36VosssnikkkxJt+AF0GMj!Hja z{cNs|w9;>QRz=ys8?D5v3}yVrt4cios>JiJO0V~@7O{J+RIj>~Ry}X^8luM8LL;IT zN|{bPwzrk?4r@fzS)>F5YJ3^%T?~@JgRuq*v%ySG3V)uhxMauLM~N>oMb5C^NxhF-zgAyo%)c zC^Nx&EQPP$5%FX!&P-g3_TW)DGqG%xN?|>YCZ7E=6XP@S-nK~ZceYZa&-7~8g7d<& zfu^fc^LKQH2jms-s>y{Wt?}&>}DClpIS^(R-$0P43aA z!B%hQo%pR*?5@(O9Ad48NTWyFwNGy+eTP2tTrt)ga01VFL&CeE*q!hiE?nMk9`b0a zl$T4X62E1y()nYt&zGw_9;kHc0W0yF^2+u(#&6>*%W;g~%U5=vWBmTUvMk5=9eic` z9pg9omGyLt-|1I2)G>a$U)d1H_&tARD;?wgk+PQ@<6WS#&5rSYP+4nN2fU+F_MOw? zuRtlA=NNwvN?8GC%U_UER>Lv=T9h&#cU9sMQzd>wpCymJy58=Y5}5Otg|0x9f|cev}oG84S(RjGrMni(ldqf#{{ zqqJg&&Tmm#e2-;E@$8N4dTAh9Ri&edU6qO>CRIA@^!hu!H7F6M>(RR-?2LGxv8_!b za7eI8azB2Grcs+7Zm9lhQ{DPj8sgXm*I2f#ft8-DXQkVm-fssj8{^o|cyfeuTALns zY_dr=BXQ|<9&JHh>d?X~J>t5~NbuPM??W>Zf0)%xMj}6EarTmtDD9-7rv5S#^HFPT zTbr`0+OloIi4K=Cojg1X+O#D1Epu#g(Y-9V_t<=#;@Ak9orW>$#7Td2oTWS1_R;qZb>SZQAn55%mX5uF& zt$bKnMq<)KRx0hJW=^`*NpY;)w0*q?t+dbh%Se1N(X#KHMK8xLcBzeaY=*O)^K`Ap5uQ|^dE-x)zUTQjazG1cLO=DY!R-vVNwONN2IO#JZWhCy|p*{za@9{fmqU$@6gE5X=w4x~(y>|<={-o? z9v;2jQPW75{o81N+}CA*HrHwaBm)9GWUH{}kZabo*Vsio6m6B}5+472GL zpKIf#z&tCJMJsTWU`<@bqld)vOU~knEL$%Zp#O3WrPDdsS1hW)7X4wNw$C}KB%)4h za>q@0!$L~F%1L*lu4V}9hMAMkC$TT>rsr!OU2+rZ04zNF@of4eEcC2TC0_NZG<>yNRHrGT1Z-shYKR2o-Rs)kWir9WqD4dLu?mhLnII&Z#u z38?;CR&Qn-D|JHrX~_@cExx%@%8r2w(PxMGkzy26ZH_+AZq z1@F~7YK6YQC&GBs22sK%!r|1uN4?}1+oh0-i1bNst&M;>d~I9iri<VZFw0#RQZ*->v+H_1p;(k6a$@SZ3MuX*yyCR1~{tjg5;ISkI4| z_VDO(*G4y?zwsF|zMp`ZlgC&@D`wd8Qle3is)&?~h~8$5z?nBJG>tM&YVSt4WHjAq z>d&JEkob(-qaPvhodJ*Dhs0;xnA;%fJ%WSqQeDzb#VDZCM~FI=euAVU+?jf}?bFGA zo=(k79i$WQiY^w1rpv;-uD(+pEVh zOX@s$16GVG-DYO{+VmP`h;B%?Hm!y<5K>`Uf3rvY{kwEpgEfCbq$WFU7#gN~g05>WVQPZwcy*Q;GQ7ki1h(rzR-5p6uL;e?KT}_b891h;$kL`?yGd zy?W+5PBjr>I#TZ#ZlyoFTj`FWR!ZKP;{6f7;wt5Enu06WK5QIk+{rBcRA@S7qKNB`{gmsL1y9- z$J#q~o0D2Nsi%{sIg6K^w8C8tobr+-PQT->U+-L5hr=hqN|gpIExmJ zec@QL|MqlV7Q57H8ohed@qMBlQqTW%XUd~B80+>)E7-e6UZ{=u)bz_dZNxoABZqsy zQMvlR#l3prxL4^+alZs>))SHj_kjM`LtyubNIWTw<5?w+aXriBUZGO5rzE5OOg-iF zxYrUb!pN0cnp4|<6;`<-?ajd{7^HM}&pMrsU=}YUjB`~*B+iveoaZ`X%lTtltmDB{ zih^;k$h#8c9N-xOto2mllX8{#^jsxA8B>W*&{X0Tqe^^wuF@lTB!eYA;nOkE_QAaA zavWqPK7U9fA~W&c1eH)qjI5U-_hAb@{k;M#GjRfapQUu_ggqU98vwJeiQOa%=(g54 zi@?=@4vd7INL9hQh=n~T#2c~?>Ip$T;yu`fjd=uFFcx3lyOgEl^*rh>79YVjOQiQ# zVV?pioxaCiw*eyA9Mq=oFsBX`JwDaAOQaneHP0TkUyl=4VMR9)O%!QeF41I>wxcYM zK`Kmq2lWYI5A?&cA0pk>8Rr`^I=(r=N)_7Zyj7bfHt=XZ^lH-zCv9-j%}%Q6r0Gt& z-AN0a)WAuHjFe7OhuCxvd}zmA&Y$M$(*Y`l+l}`c&m&j5*HDQgMO zvhMlWfF;6gDY5&+idHS`lLO(BbHs8>Ys9h?zS^X#C#{cXd%o2;&^s3#5t)ffSlzG` zwqSo8C3;okrO+@tch|?R{8e1_=&U;|TaB?(*9Qx+W>BeJXWMSY`{VvOENasm8G3G! zPCJh1)pS}n2;W-~e=Y9Toq9Mg+^U;#H8b%E#w(RxaZ*#nsj}6mQSC=|=yJO2n zSiM2mORB|scXhUt78?ocGK_?*=g~-v+1o{`iPeMd7p`*BK&%<|$W<%VlM{yn!v0zt z8HuuHwV9EaJymO?Fr{JC<27bRqKldRG7?+O>{pwvMr$2{zuMHvtV%Nytshp~jKokg zHf6X~Mn=M}e8ZlfMnvdJrq(6+W`X4Ib;s;Ixs1fiCRfOTTNlrsi}OENWF$6EvFSE{ zL?xV#4kvT!QWR0bvtJ#0aU0Pe=kN$u1N}Fp43B0HqvxfG^v+SDf+FpokG+dXG9N+0 zXoT6Sj7ZNkQYoFhn=uPHi|VK8rPC8wqhEBIMID-CyksQqbR`O$)Cscz*G5L7ivvoaYPz`kwK;2 zPP*Ai(=M=AcePQewtR*Aa@gve*9;O)AB)<%T1Tgat%S1L zbW2$)1r@AxZWWc%IG}04w6QuOQQgrBRUdSvA(HM?BiHlrDE~INfyj z43+LkndzOv`$ghs-&n#O1*E2F494C?b2Ye&)~W7s#*5zL=-n!DUsZ`~lGD|;d>B$@ zVmqF#;M8;_qY|%GRN@&&C2n(-IQJ^OgC3z0&nYVL{Gk%hE-LZ&;8l7qVOgpBti;bO z>eW^=t;92!v5i`(*EW0gwH(X3jaErxXo{4a=UQzKo`qDhryqr>^OL$$FHGmowvuNg zjEN)h#X9lwkdyX6nlCKhD59kzJvPPmtzvGxs%RvP1*>e!%cM-TU?`fe)? zn_;CQ-{Xu&^qzedX-KZt8jE`Ly3wmg#hvZB@XYzENAsQDpDv9uH`|t(gHdJ)+R39= z%y{q7EJzngYFA@KY6vMaQ4C`Q`zuWIdgCbpxw@h!o;47u02uesdh|yxl~j*wyfAG; z{k4H!VcLxmN$-BWy+Zr6M~976m|isFu17Pj!+j3%d>968?} zu>OJqSZRm_NBb1Dh4eV2jKl;p!(tzR-0R%a1*nbzxbe65P)#wq- zl6??QBg2;aTRN4*_{Sq0VhVjr>v_NFmv|}>t*q=q^g)%bb<#$6^#>=tH^80>6~}C) z7Ael61^T|88I^GCawqL^UN)iD)OMu1+5kCK+uB3y)$vISm*)qKMP}m8YO0r+=uyc^ zA7hST&zXt&1+Da{867hdL$UwWt8*{5S7+3>(kdras%Ke+ORTgP?WVS)Fp8@5rm6eP z#6#%u%5HRCUjNYAzUtUcCpE_?r51af6m_Ys!aS%~@4L)OPq}m-awWgXm8e!jt9PrB zk`WP(gGPgK4-FAfoa*0TS27u3JhEmcl4Z+vwKmzzDVd2zu1-BHEi`{Gm9SE7Su0&w z!AcddZdbhp*e|Fwqq>z^)wI$lwX9Ubd9LfcRCivMI4^UZmusCDzqa+#&E=HuC2P97 zN?NI1x|JGMw9;Ca#(wAdRp+_6^IQN$SAQE_8lOAQ!<^^t&hugC`Ns>bZ4nexz2tKx zU+>buk(RmIppcd3oNJ}0T^i52G|sAOuXb>;(a?GR(Rp6&JYV5FA9kL1InSG&=Z?;E zmh(Kp<^DRC##hdBFX#E(QZ`rRu};+T?suNgb}ik;)#PRuLzlUBtLN(P4cGczT+5v0 z%7)Hk(&*#-t#;A*jr07f^E}0Q-tIi_bb5JPrIxn-Fm%Yi{JAcnR zf8RTQ>z%*BF841x&*!;_*k9J>w7HAj%U!Ikaxm&1NPyRQ`R)Ej3?S9l3hz>CeC*=?0051#eFO2u|-CrWdrq+ zk=Tc;oJK~Xl97@tGW=3dBfEnPF2$*-q>Lk6quI8GMqHqD%zv`~u@2>vtuJUSK%lnwq>*e%zJH3_e>LhnH>Po)I zUA@a){lVG(w%4X{&`HOP)FCnBpkD2exXwr(C3od~fB%p~(*&%LIj6YOXLd?Bcj#`} ziQ9;diC%KwV^3o6^zab77fSArw%%ZEiw&^5gz8S(0)Ib>zv4sj1u2p2lZxIMcKP8` zjpQzWbAQ`Y_PDY&FmdJ4U(YD&P--ijk0Z4@l;NadPWqvxz1qOBhn%#?No94F_CP%mhOKapBJ`X$rugiE7W@W_Dkd~<4m`-(=w#=x< zC1Irt_So7zKF3PKN8$G%5f%6acE=7qtyk;OF2m|kFQb>4c*~_$0i#O1Ebrv{^~JB6 zh_t^C-s2PLjx78RhDdhb=+PI55lA72q#Z zyo^H{T|{az+~#jM^4DG1mo8VA^u)=Suy?M*9cYnWgqHy#y#+l@tuok9VRQOfw#wzN zAM&DlrIDISYh9k3p@x*5z|3@~cYy9*w`+)Een> zu4>c!=4$xKYCg%=JV!CtP7u#WF_%peslJ=ve#DYdS&^N3ZkA5T{dv;XN_D&ku-6l0Klt|Bl@d;HOZ#j10^MqYo&R(sF^~ zrB~m%h-jIxc37*ZUJLkJA*^m?D^-KVDq$lq4{8q1s*ATxge|RV*&z5+FVirhYp$ka zC9P6RLZr^n9~=v98#O{EfTR4dTBbM`09y!1-M%T0> z@GR`N)PnPOrW)7${k6@LHJ-PIF3eNU|9xz9`&CO6rDPi=y;LZyw<@%* z&g3O;U2)&%88L5P;26qVL;okXd29Et>Eah^59=HCQJVj{&bogeb$R{SdP!RF({r|` z-0Aw!UFb);06Qg(GJlYE8$8 z(_{SKL{qX}wm2`fQTJNo9OGy5@^`rkkA${=0S zT3IDalhnQAw$MatK9RdCGQ^Z)l=c>Tg(q0li~bMV(0 z=kI4p&C8j*G{AiMl+;EiNF0CvXSrH9?acGa0a-Xb&WDa7Uo)n#_*QU#t0Qq@-Jnf3N z#rW+Xy!T!gZ)PLU9$kOEomUSJ)v+m^`kK?SblP^ieVgr1oJzh5i+c1XPFR*hDo#^< zqIX0(i8C3MzQH+-O7$XmIzg`9T^LVIiq!l(+(m(u_vD1X_@w70D)D)VN_<|T5}%i- z#OEa{@!5z0U-^}+4ji0pO$Ifl61 zG~KcJ?di;f=kt!cQF_swDMTp?sp+cVI;;sb3zrRWbKYLXIlSVuTXzUFGmqOM211^}Y0zj8vkZASr8kHs0K#6JUIQ_3vAnzh8&-b1{8R zKT0!kUd-_lrSf?0TBT&`pF(fcXzJ!G-x@;ma9nRo$b%_ko?8!WA1p3=tVQg{gAFq}}jfB%U-IhnM@YScbh4a@p&s9!sTpo7E<>9<6{@bgk zm;Cd;(bL*3h&U=vM^L*yq$u6;hMqHICYDdtu{|S^Hpxo!AGT6S#~K)^Fx{5W_wEYQ zxTIuSwJ=R{QYAb^%_EZLfXeY~us#JpkO)ax@3Ne$u?W?hAVuXIy%4SLp57Ezqa^lQ9&fX=5~+qBMPxexF7?KY{y7#c3txl=~pzEy>Py2Fr5N7$YUuVQPD> zv+m?BcCHF+;zN#>xn%i zS12mmG&raH%wCkrjlvp9q%*N(>mLjBi!o9Bx~xYZipA@`NBi49M8IYp%G;+XS=84k4hiwj)%(l__U!$fxyAOaUeGH} zoYPxHI)R8)X*)&*l^#dW8zxr|pjRlHm1@h|6QT8hq;}N<_$qJ-PB#T#zTvM9Md{l# zTi&u@{B@2feTBD)v`&v9SNuhF#Rml+FCP7vW3D1MZ)Y2VfZPFkluU3c=S%%o{}_p^bX4N3dNo>;k^XB z4XtkvOloOY59i>{D8E-8r6NYcJ33=@Cc!-*BVjF$7^>5g$LuMHoMw=@f{y0}vC5>cG|C{{P_!s#rjQnvLTHb$?zcZDWbINa%V?ET?mb@Q4 z>w5CvmOSY>>Ce_=cz$~Wp6g4VS7GGQx7d?u*f!GW)VKDN(V4r__RDvjWK+|a>Gu7}J{Q~UW{c|6Z1=ZSQBOaI$ARlSRmhD!hBMRzBv$C3Dd$0EHr z_Yd2n!fE`0H1zjG2BGBI_fOBCe!0NfVx5c`k-uLTr6x||XxE(nXMd`f^!FR)qZd%S zcml#n>~ERW_{MFv@8=pR+~e&mly}DYw`r{S7ila%ZB$wHALBr4_dU`3YuWI==s%XI zI8xKO=k3b2J&L(!D+c1(3Oz@vj;ANi)LQ?xp7Lr+J&FCgiDkk>T-YmI;X zFVf|4T*pox$G;PcAMtz`ub}?dbbk^rj}9?kf}u%9`o9@XzyE)b236p?w{r@wHS8EM z1@WS-e|rD@w-J%@FFaR7BhYPcN~@g3Ba`he;es^m^4TJ^!zi;$zaNpA_!KS3Uy{g7^u?+`rTJLVs`QP! zS|!`E?lY~ly@$2kG(uS=`Q0G?CPI|P?XbDGzaWIMDQfqU*W)bX0x8FtSn}#uR!?$Y z6BhVleqFrnF496L^>tDdPfhC8b&icS5_U?X@zqpGcW<_pc$^%8-AI%Q93aXO>E!2D z;vL^KVQ13&E7N{{DbgrTr?6jbDpK9Et#l<;JjxCfQYnyAA)Z~L^yq!2-9oK(PCcU5 z@PalnQbuBA1FhYR#P29Ck6{^!NPR0^)X+*lIabVA;OTs{Dvtsk68zh7XBrRm&GzK% z;&<@mNp0*Bu2o5UPlnXw(Svxx8IqQ~yOfttIeCODPA?b1bIroCvA@)NA~Dpb;Qij!2FAa&2(!E<%6M)XoFbG$x5H@82FhgDv+}wH<(!Ilh_nmez(x7vPMRV<@2G z39O$*It+>HFQ6B(|57#&lCtm7D~ui_Wk2D$S7l#AQr6V8LO|7F`&2rov7iaQ$BHzf z^!{a&`BYFFAmRy)7DX%dMfc(Iq)?sT5%P= z_6wa<{wMx&Q;zn*-Ug|kr2yno56>WjP`{}4vXp-4SRYW|96=!NW& zw8q2=;w=odI%r5akW%93s1jE{1?cAxVVwdLEzikm9ikDbAQcP|uGKoV^76? ziqk|xYJjkx;xto8PHf%X`1&cxIoJzuS~;=LLADB6Y^@SR-Epl1@v4#Y(>Q@AZiTEj zqz6cMkdm~+kUKzFrz9OP+*j@>uMardSifsx)R7_VZY5ILJvMmn)$*oAC<)I0r3*(Oh(d z6aYD2&WB+oc)gR}YbLu&PY_KDhN<1*8hK z3X$p{RjG4`Tm*6f^$w9sKrWou;%lLfvTFHb~oc| zFCZOha)`VN(urn<$Xg)S(fSZs19Cm_4uQ+Xem(%{ie*}od<1e6ofjheKzdM>5cvkA zC$$zbnXdQ*_isV^&?2ML4W6kIzUV=(g-8lWe_9zL`9W@{_d=v7$UyqgkU!_4zk>{- zPeY^v$PoG>WK|1f7@Z7}h9D!T=!IG?&QCLtk<=ta+Jf9ovkhqioz5T$S`;ETf!s&u zRZ~9|a)^3^+)q_P)|*2$8WM6KQ;iOagg`riI9KkjcdF zjdOd=zK>`w$fLyXc3bis$YXROL|y@zM(1M(%sMZ^Y6Zv>R3${#fXt+eLSz%jlhhf_r21srbo_FKeZv`eNE+ z$kRBF>JE#=#NV*MJ7#V)UQFK#Ify9Hv=*}h{xtQ0@Vtat)?jiFzlE%+zrz2-Uv3JM z`=IkWJ#Tbue%_)LLXv5%ptVBA#Olt|d2j{2Z%9Qmd#<1zN+gFoGp?XtLgZ(Z{cVcj z#KEo;cvY~H3jKwY2oauTR#JM1u+_U%HAGnFUAiblW}{rI=+Y2b2(pHn3wea9EW$gY z$WJbHR-M>btXjLn&j#vl$YUTppKhSOhSW7W@6jMbni`$=XrvO?IvZ)yUkIGxFE_=m z4>!^@(Mi_x2Q=Gw9()|%UaO2Th!z?$9;ASfmkimPi`56nX5w#2@Z9|?NGTzk44Kvz zb1BFc+GWVIAXS8XrNrfVD;*6HPHQWj3K6d7ZIoI|(h{qh(D{(63CW?!+jUjBorW4R z0;|)Dp|hRNt<6@C(C)i%-x%a$s$$6I5AlsgkezhWkj0~kZUFg&p1z2!lKty5S}tTv z%&zM`qg963b=_yQ(Ga_?+e053V%K$hXtyDDUALFMFvPCw_RLeky55<~p1bpj@9*B|`>)^cGUrkekh#?Ep13G$ zH*~@fyI%c&9xt9HG5m`nbTCQ*D0z>TD_*<&4#Krs(Y7!!xpCi;x zNUpcFF@C29wfY_PQ60MUO5_3LC@mF|LtUCHIYxgPtB&9EZ| z`GIN)$)U$##pF1RGCI|pU>*QDK~oHQ;wt>AGRTkgtRYye(H4-OXr&?hFUNC~AV1Ul zhRj5se*pP~zA$7(Q#=t=1;6G+CxzrtRiw`4`i)v*2aG)k)iUIF8Ym>2VuqZgH-(Ij zeSqnu0Q~$xtA&h--GS$Jy2Jht+GxmV5FRuCpzVf~9H=^{XtyDCL0IP$eJLb2{z43U zFL?fwjtE&Be+y()fH9hWGFJW9U_S&M@=h6YKS*gI=VIN+v2pWS+{*#+ymE$&0I4FR zu_4<*YJm7&b3+b;)Dd#CA;ULotOi~`LneZ7Yy{pAL&|)FRXMC8-d%=V2+~x@n?iEq z9p~UpdXN-vwIKyw!xI|tlj3bOm`Vm_=X)iil%sFadyQd_e0H3iuZt! zF|pdu615l4(+s%`BvZ)KLUQOi?D1~|iF%uaBxjja?-wE2G!3443{UlzHsG|fX>}Ce zC4^PX>xGjQCe3%^v{nfJo98e7jo$8%V%|{E$@TczJ+6(IH=+^iv3-?W=-xF{A<3?MVaixSrA)wzSoixh+|HD<{Q&sN{zc)JLGpV&(eqiSB6Qvoavpj$`{CajUI$XZTQ4Msen&~S3h8r|TD>(?&vpuW zcN+4+??k(yQ_vf0$TvN#&Uxs2h-X@gw&2xHLGLCZqiNnZ=y$Qth>5Kg^>_r8!^Z-vn*>3tz2hgO;TDe3)Y z$QBU4D$e@7qKG!G`RsZ4{cDg?UjD0<>^5UdX|Jpy2OMcHBpXwn_QBHLNFifl_B5=t zcb_5lG_15Y-Vod4N_$h3xcQ>AHzP!NOepQm4G~^>mhl#c2(LWLdas8_5tO2ww^N9& zMN5NJ_C61h${xkRPYU_i5WCiDr0C`@>`G%x##ApL@jaS)_W+2OiTxrPH8*mQ+q_uaAA+h)HTLwaU z8)DaxZM*@7*fnGuZ-OD|@Usb4ZM{bfX#}!O$cu*9HElcZbwli$ww?E(A$CpM-uu)L zyQXdL{cMO`uV#3E8e-S08D6QjS{vh#`Yxn?tykWVr$P1zx!jN{n~1&u>EN|6*T<2{y6YEj3NGY_YXm`z1u_NQ;;0*&Jg($WQ;d1M2>=t^QH>PrZVvS zGspyQnUK}N%g7J=ndrUPh11HRvgmORHA$C5U?e#On&Zo1zA%@ub z{b_HkA$ER$+Iz>4=7sT#G^o`%-a12if;1Ac#SlBc&-Hd1V(0g{-hM;uI$@sowIOz$ zFwgtJkb_u(G>7N;-fxB+Gi#FhUgRdNXFG#D@edPD3iv)Joxh@Guo@P-;0 zhS-_tMQ@fNc9vP!N*Q(=I_%C}Wh2)Yw z|9ROf(Vgojhc-9Xlap7xEkd$|WFR({dKG%GPBvZM6#He6*Sryi{A{e2d8-Y17i1uG z-te}B$lV}sdev@LKTDfvT5o$J3>kqv=mhAz<83meD9EEA?|MaVQ7a}-fvonr8}i!a z_#H2hHQw`v+|UfC{vd0;-G*Fa$a=4SPxaFcyHY+Q+USioWIYI{waMFQ$Xs~l)36V` z3R!CP9Ll~HI-9+OApyuXkZs;}L)IaOOtyPfdZ`uffcJuYkQ9`H$!A`P-s*WV>iGyf@A3K@a=5vYecnn#-ZSKLuV^2&>Wv(p zgw+>bZ$t8%k{uA|;pLUPHSI`WN0{N>ONc;<7+AG~XX z0I`vUwd=7cSTOuTznxHK>^&h?8ja7A|&L@*Uc}4rH=L-$_+3O}Gm+V>P zFWv~FGaY{T^zv74wb8Msm%n+tjm{~Qg3mL5_bT7Uo^#2bXP)$$2+5(nsCho&{KK1I zbnFS|DQ}+9nSmPPGtWQ0qejP`d6FNyUGw}V(&AH4&+i~aSBx<{&Exx1l*EpW!C4DP z;Lk85`T(9q6f)P4@q6+6Hy{!Jc|)dwloPT_NH%SGNKZ~u{I3it{)C=^r1<9y;QVA$ zK9CehQNM;Etv|pL34T)jj)p9LUrF5GHIS_)(*y1B6-MZs<$o&#Cpp*Xc}pRG)F9T$ zrkgIsZ^t3d3i)FVX$#UAR)zhggOfVVK+g6n4pDMBJYNk`%x`AM#fF^YPZW|%_S~j?O&SB zB$w<7UK#&tL+sgL8Nah3_SCVA-$zI`9sf+zD&uc4B-X}~%kR^)cEog_QpO)>NXeoa z8)f{NhU^C6v+gqf?EBT~Ban(E@YJeb0ujk=x&-7V_6i!GYxD*mO0y!r;_Cg@c0zZj=FC2;q@ zJH)E~mhnoaJZwqviAwUvJ-P!{RsCv)G=vVPet|#Jkn0iiocaZR>_N499V9iOq9EBI zHT+G}ROd?UIL3q2_VDHCIj{Sk&7 zH8IxMf5MP%$TQb-V}FeyWibA5gg5qghRCxZm;0?|X<7}9PE)^oh_KET{#HY-uCINk znSUrmSm!Fg>yzv!m+VB&e<&oEIy6x~ z?fh?zPKF`v{Yz#eapZ^n@I08|w->U8UNrI=A|j z5+ZCh&JUhpKe<%8nU-RLUsgyCl``Z(e~8g3Z`$i&f1=SzH)N8(UPv}EVb7EOQVZ1c zLm=FykNEY3!r_+vsOUIS0p z`16bvw*`}3{?8$uVj!RTMHX>dT6QL%`E`V7Jy!(T>$eM$njriAejzI+2mFa49UdjV z^cRH4WzhM`Ulp=q^0j}!5U!1DKo0vSLsr*;9P!&P<{WB%dVn1D`-jM_Am95B2+>k7 zIqp9j(zz4lM}KXIb#irJPRZmv=ySBnZ$wtA)Un_X~BdLc^xEQ@Jz^xNr7N}NQXz`LcxI$ zSqq&a!KsiHlcK@-OOpBd5Ttm}T1XC!Mek-(A{ZSadqK_(_J*v!11TN+9wNVhoF5c_ zi9Kt%n4|~wh2+vt7-_i<%Lg5e&Iv;*1`CYN=;k`AR}S7a9A|*u7qzpsgX#{h&{4)D1EXSq_o{k9C9F4YAL+TpSED#6I70aWKP>I&pml zrd}||kSjoVUr;Z2(~y~yb+vp+u-cI4KzMC@Nw7(YoMN4gQq&LXEah_L()@99CiK`_?nJaUUAPZ`oK+mhD|xgRZDNUXjUvWAY2KwDrB(lF@! zs-`~fQGIfzQE*p?Og$ef;oyjn)jmJr&Z##JeiV{TlW{{>Ng?bI_{q%^eJmL&B%5w+ zr%$Fe4o(=I1NfSTS_N2&))^iad+4L0dR-B9aX&jUll1p#Hx+k=o1l z2Ez;~(AJU%4Y_}$mc424bjT0a#udRDA=$Lzee5Ps(kp|XLpmHAR|Tod@PB9>PQ8C| zqUJ$~5a|ulBB&A~gFspa4ML;~NUNZ0h?GOQt_~gzk?w^twg$^Ww+e4Cape&Rp(%-5Vg7rI@bsJ-eMgk ztwC-GZVZtQAYFpdh8*mxZQ31$&J}(%=!fv8DgI(>la*Zhjt{1X4X2+<0K^LQApJ%%@ z=wpa|dhOQW4k7wP*`3JYt-*Lh_=&OvNdI7&l34dzxW_1Dy&?4+8M{hrBZ|HGWYIZh zNXj7mW-Z9=LGjhBqbGQ?K?Vekl*Doy;t4L0fx(rAYz0{?q?aL|;~Zcq$e`eMA;~@L zpkR`aY?|F3-?kK;Lxwy%6VI4~3=W2_;nb67UxR}O46)~0gM%4{*mI=8!D2(~Inv-@ zr6KkdYjE(PA@;;+p4T8`5v_B_=NKX%)%!t;FLV*ZAk41 zz9JbA-4)y=B%AtUPGKvYr)*b0ceWw=804PdE<+0ANy5D#iD0536>y5hBs-XCNK@?0 z4uael>=v@$JL2oP*64tCu;=~pTM#Y$rsU|Lf+3M#b;chZv=oxOmoz%)C1%h$2ulhASBo8V8{c(8bjeuHy&S(khWeQjYPP2H|D=LQ!G$)QiK(sIoYE;l-M#rRBcgcwm# zT0o@NfPfU~{r=yXcXRgh@;vu`_~V_~+1)v_Gqbz1EbbV8P53w#cdp>;@C8ERmFqY@ z0kl(V!&i7DJ7j(ME|1Xc)5h@q9w~&F&EaLvPzm>iQ$FP(Tf-L#iB(27kU4)Ben$xA z@Ns--Tf4&>;kQRe^(=($zWos1!y`1tPY$2t5gOy~4PWdL8queO@A3$Z-&4c?@(7LA z_lH072#w8u4bOfqv~?PZ9|*7P5gK>@5&o7(Xq0^@{C$tmnEFWg#~z^(bXxdYkI;De zc=#_Kq4DyG@T(r7(ecS}-}z8^Xmor!ys$@TEPOV+fk$ZMdp`VKkI*>xV)z7)&^Y&U z_~#y>QEhtoPLI&2_FDL#9-%Sp_3#HCp%LrN@T?aU{E_F2My$8OD|&>+r+30zdxXZP z|Ar6o2#rSXhtKo~{R$q2f8`MxS3VB^*&{THd>VemBQ%P99v*%%R2~{Lz6>wu5gIcp zYCVt82r-k|%_B4(RMl}Fq0ygTUFZ=S>*?xt7I!wxP}5l4nJ!cPS4gaqQeU=^wwmn{ zl`u|;gU~M}LVYeIQOtPMg=A63<9b8Slomj%{w5@cs{c(AYI}32M})-dTksA-4E`;L zdXgmtLcQD^>Lr#$%)3xbPW1-MS_sADRPPI!s{f3B3$^@FY7tyD(T3>ntVcf-TaQu~ z2#M88;krT3v`49F9OL$^qSRV9WGeS*jVQGti~F=jl-ixeeOe=z+Ly(BS|gV_g~feZ zBeyz(#eG^Mx4MeOeS#v7`VEWw1VtY8kdS@h?r1BodW2)#=Qr}ICt2L*H}a|vS=?t= z@~JOb+-FzvsoG7sr|z>E`PC>E_t}j6YC$2PcMuAwErrBpJd0jH9V8_5Rzd-F9gF)` zLbRIyAKF&vt%PWm{u{qIpF7TtR!fVR&~xU|YHb#GR2!`}VcCrS4}JqmwE8BCJI;+( zJF$eL*2$P2EbhoRS{=kv5x*pgDX5NMaYw!d)d?P<@n9h}o`uHCl&Xk2Pe{Dzp;4c< zh`PihT~X_bsyjSF&-@oxZ{9{?Jl#kAIvRJER38i37f#X}sYQr#G7|YzQV+2N zzm};gt939NLR%k(S+NO-siLlAIk#TsQ&n~DQA|phJ9|)7jbw30{ngYgEbbV;nwpKp z9phJ1qlCmNGqEi?8r9TmLQ=!r5q)*_Ulw;nUtN99;*RL6tLl9!Pik1oPC5Fkq2^(s z(Rw8Qt)^PkBQ%byrIzyujp%Eu)jdKZ#5!tykI;zzHT89m(1^aS+SVg9ey^u?@d&k1 z_0>Keq0xE+^*xW!XuY92+9NbtZ=?o2LZkJ@>I{$2XuXM==n)#NH&qvTghuPl)Kwm# zk$7`;qep1m{kr;{M`+yrhMM9LdQYl_ddVZPs2eTSOb@VoIP!FyXF*!21wAq!@}^qf zBQ)dDT7B0eG{4bCo#>GzNcEPw*dwbUZPnc#*$8Q;p7O{}NPG3ENA^NGsJR}7O86V( zZMB9+(jXnxjvhG&>7U@tpfOJ;3c!XBD>Y^U?2+e_XRj+!4<}SLaVUI%P z>5ad3SIe`wvl;KI)mhxxj2N}PkkH#YJ=E4hLT~HzQ2Pr>6f;yN%F|O#en#6$P~x`X zS_Q@0RFcyq`z84NSx9iziw)y2CC`{iiuTja7!{+wONAm<*#XoT8L!=X4R-| zc~33E^7I4T!$;2VskK-!}2hLnuw1}CZaJVLF+ zB=xyR=nb05s{a*jOU_-;8#GhYNRPC`*5lNILgX7XT_GQ-6+AKkGDB_5Ql$|_qmYl) z_Ck`B>h%<5B4oDO&m$i}=BV_QT6)U;Kr0zDSN*~x6qBItXZfl=MjVh&)C(S24wg`B@uceBunFBc)}RUIRFx-z=Gf{kh`Awi`@Yi!5D z+6Zb4$Lz0%*Tj(OTQ!Aa1~pcc$B^yn368nf0J-5hxJ#`PE^^K|@4MBe9yyy8?+2=# zJ#q)~gE~u!vb{H+c}LCLt5#KI2`i#^`bGqQJ!Ovzt!_Xl9X47 zISaX=7Q|f>B`is~f+KbvatpsP`jcuGMO!`!f4imDpcwuQ-W4(Ld*m_XwmMx%Y8b8D zH3H#x)Xgjtu}w;US3Sx?dy0k&@{DCEYRzQGziPBWv8jO{hsn{zeYF8gof&eRa$oH! zCG4MFnD;{XeRUbjpBR_p;-EZG4+yysMkDn%kmCdO4$DdWXB#1wN!z**cDV(uc7t_i z)FLbelV!{!^&OVXUFBQ+kJYg(i?ExWk?M)MPD)_OZaGSNrvA<`{ZYc+h>0U_xD_ne0N&I*awKV2l>rw;d}vn+#DLC)d6+bq?C_^-+s z)%qT>G=>C(C^qedY?0`1KA$cmNg0ipNW}Pj(H@C{_5JdN_VOc+2{wf2$ z?^teOEL$2ehHt-+1f_R0`pyv3SKpy+CMq{DciIGE`I<+NBq^sMEg`nAN~DxxBXO1? z5xx{52})teyO1nCB{Rh&C_^v{H3*W!w^bU{(Vj5YVF`uv4R;*}!Ec^6Vu^)(g}R60TS zL2CFOu=E%&rKZm+OsRs(p9}CT7Gi4oXf;WaJ)g^%+P+Rjr7Y`<))6sve3x0~vDEcd zD<)$;Lkn;WG4*}4N|JXLqM>h=kR+vKA3R}!n1()Dr-=6bgDH4>5z@#Jt$Eqo0< zLaAE$T6iQ2gq` z!AEa+QLW35RCOU8eItY1vj7)Puhq^Iw(M@B*V`Yxjn zMmev-S&oGa^bJLCfn+CAQF-3;U1r%GgY7_u`J$=mM9fjdPzgu*#;}}64COq=w}zz} zV&*}{`)X8_<*9-D7|S4&e6u{V5fbN{hie3txhKk#3Yp=fUl48U+GNatLO%8_5R#~L zLC$|c5_~HDKc&ic2y3(8@AG}Vg(N5|>f$LC{QWZ;O5#tdy>O;%5105}t4gV4iXM*{f!GT%%g>EilD{f#et`&lZ+$*a{0pI(h}P7hpv2lW|$UFqv2 zCF4r8(zlUiF0Q%MOZn25x4KN#1!X>mzpnNTW~q*r-;Y*ewQncOF$isajqkA(QJx$q z$=ANdHAFsP?)7x7Zv+cnPYWYvtuKXzuBR0s>wGaa<<{Nn={LUlEbjI68(*>%u@{uj zH@-Ht*-eC+bqA~$fF5Tw)*A^Nf%|NE9_R^0gkDI z<4iHzeCBH+pN#A2HeVwt0rz^k!`GRm^9Qp2?C^~jk{)nt)DGWrA*o?O9NiB2@rJqY zE0z!LV7>uIY^QG{3tdxMK)&~FV|jf7WQ3Pp?O*Qk6R>VY56K>-ze$Tp58@1ajTCpXEEmdtA1{Du81co)@jZ z?=;Ih*!SX)+rBmpWK1*cMGMGX-vJgA@*d=#uS`Q3a}P&;Hsro<8B4wixYq=E=qrM2 z0G04H#9W0u@y!#Gpr<0gHQ0-1zR#s7haoyj_{^8WvSt$AV1qpO-S@~|U7cBgWRj3XJqwQEuQ24@D6(?3Q?P@y$`o#F{L2U{-`%YF;yUi{A+{+l^Td?1S#x)%rSkCPb)}Ke{YOS>FV$n zV!A?#`BQ|XDiqTfQo>)Mjf_b_%t%N{{{$hS8eZBzRY<5GRob5*BuN~@Nk~=NztWRx zCZvo%SxBl9iyD5vhoY4AKlQ|Xf|&CDsJG;PZA6UH6HgfXI|@lrTK{)B`s1Z!^hMwDFA*Z^VFa#jZ~4~(ow z9%e_XcK*3tWQ<$uI{NEif4p_9lmC!Ms7AfxZ`n=8xb>&AKdO63sJ3+R-xLy5di{fU zfUvEu{;ls)Oz7;q>;GOz=a(^S9!d!OJi{ zh4lBg=a|`$fkL`+Ogd@{#SHNG;+R(uiW%S^#4%NWlraPS!#SoEgklEz$8yZi6=Zn^ z`GXvD5kln|{V_rkm4m29M77}XfPWqRzxL4Ry{^u-i%XZq|eK>7BboD&r|HvcM zvYqvBWN}-zbN;_PLM_{QeQb6SI!~JR>Mol5%+* zMp2jnzUZ&O@;Ub1K+Gk749j`MkX-T4^+;aGRev%|8hSM4Abbd}WdMv47 z)MlP9gzHL%Oo3EEs@oaT8qyGQk43i6l+XQ)7|Q2gY~^8wP(E)URY)kG_K?SZb)?+W zjws=_T1YETuc4HA1Rz?X-|YWia|Uqac2*&S-JIM6YQAMAO!=&{>`Z(KR}Ts2e`F z{sc0_y`CBw;?^iLL)`wD^*=&2%FYnCMmhf@RHGuaTcSLn=My5ehq8qFjumo7F;aWU z@-u{H6eBfljMy(dydcJC*o(|s1d9XtQb-g_KgdQ%7A=}(IOIDaC8cECQ^=}S)xd9teqR$FqosvJYhzi8 z)s-;?we2h=vGpj#6w*>yX3xbt(2&B~9U%!y{Kx1~LyBn?FovOa>>t!;s&yr_okEh7 zrsXiVgP4-q8J4b)T9DG(HIFoel+j9KbVMa=fH_aPS5i)E&QffNl=9jLma32^n9Zo5 z#k1VPj5J9_Z5hj@NBB05ieG}ZgC#TeourC($RjPV^=jI9{EBGnk2qCLZJtLcrnYuP zNP_YlJ!+D=TGS+&YR(sO>kYJ(EX{Cc-bPGAt-@p(lM69DAx*S3EN$kXuK{VQ9q|aA zuV&g!mcO=RjZH{%ZEjHJa|7}rm;PDRwa&7 zB`9A6aIX#0URy0BNvX62&tpU0);4-%3#6lVf@MK%+yjEVqeV`YTPOJm(nX7om$D3X z;~=EFHeN`AvKMFjB;;K!jblnJ$2U|VF1y4)W!?J%p2q-q_=jSW3Etp zfbI3urcaZp`uvDlP{;snfsh0xZ&lPU$RO?7bQx0&*V8(X_p~B2q-Z;FH@*aptkwZ@ zdAM5Xt57%SiL&8ZH&ucdTizA=KpQ4S{JNVU=MS{WLgep#C2}6A&6P1q zsSg#UHDX3-hdlBQWQ>+?me{&N^K6C6U~WQdEF`EzqenzJPtfKFNfqCupy$~pX-ha2 zT^({2C0Q>;r@I6RXhDP8Ru-D~8-x7{YI|5pqm81NDca909q?CWsF?Us;Gd8TUm$MUE)O;(h?DDzaU4$Bv~z7K^=*JiOSV411iU|9zlgP4!C zmmUd1=4#n-#OYT_F*70aw2B@{f-Kb93P}(#%OOj({v3039L^rD$;-73ET87VJSAdQ zXml4Wq29b}a@m!-zn@_PD}R$wm0Bq-HzO+JK}ueAz7l9YTL zvsSB@AoF>+4x=#~v2|KA7XNxF>$TP_bbO8>pKr9jEOdNGHfnJ!57M!Q8)UO)e?mFS z9th3cZq=fNq$*E?@_cRA#;}}3Yuo|R+qI=a(!)qjqh{{VPI>bAEhk0`nvy7T7GFoA zS>o@sY(kQhJUE6IvGrYAUY6fhpbrJvtrcOZ))vpiRl+=^R)%FFQjz?iRbeT+Sjrx) z4oge?z9=SHYs|8gTlF8cmMq)wyT6ZZ?bX_|l({BT?bEul_}`XWPtkg_ENUfVe$ocB zY>JUFsoDsZdDCUg&)RsF3Aln#dG>2@EF-^@@{2Z$W$qlzx}iM3YWF>&)xlL?v*yY3 zJ_GwsSDC}wG?pc2am_`{QEeUzwX`Fv;!JB_2nk)gk83-H$g`Xssg7$0J(34Xl;E&;eVHzycUlT^M%yJMRGu^1 zVIguZrM!qaAq1=E-NpzSIiAtZv6Qcm`+g$kDoZO!Z6SA9E}{LQRA;rvEP*!i8Q`;8 zSdyrRdMzA7iaDnRSUN-U2+6`yc%zItujOWG1fiJoT49#2cv}~=(k!VEin*XwVQGr3 z$3QM>by)gwc`j;ASbo4&i@pqXNo&P&7(!o$x}?1=C8K|MS(_^)HOxKEm$h|5Qm|?! zdIUHcSG1G`w5M334D)rZA?cdFkR&CnJ4V@b58|p;`*V^6C37)cOCi^^PC|mp@|9?5 zA=kAn9CHKL$@d^PwB*Gy=l9Cu3Iq8^8?!`86Ub!9E$uPOvobQ~j+S?+-1_Ern9D`X zU2U3>pz=Ff!9|dJ+76D1%Z)i|$V08o7c$kE0{Gw37~N={gkV;-B<2PY^F-^<(i*ky z2gp;c`EpsFTNTlBfIQQ-uq0!@{(!vDR<5L&1m)Cy`5O$^17AwXh4~ixovL~rmQqKg z`1GMdg33wc6ZRTLH~J1CDPc65WkWPQay8|X686=*SWyY0>*rZAqlEb&0sT2kIAV%I z3_WU%Otq{Vo_T|q`ZShNkg5<%x4x1wJ(16A5L++7avw4Di*xjrUsFt?@(Z^%5&B@3 zCEOxK>d7ocaDAse&8#bHDHZzI$I&Z5&RO(t*2#QYVXW5)l2gAdBqhwOirNB+(hsbs zn0?{yuRFJ%CL|>+DFU?xF}d~UEX#0~M?>=HTfU)GL8S=VxmZX(UEM6@$Vl`dA%*oZ zEEQYfdJ8F{m;aVxQo`K!r?}pn<=vUGMJl1ku#AqwUDt4|S)@-C60byat5r&$CM4AU zl-3Ju5jkhHY^C)=LP9g8W%M#ag31B3HeaJWW%T|+(!;h)lB2D%`ZSi+lX2xlOnLnf zOMAr7_^YCRo~0G$$Fk!(SVey>B($w+y1JFh>g#i5s<0>HamNhOKySa}fA^xX-qj;_5z|;7BP2bH z#;0^gwTXU{g~qTL5-QE~n4Of5yl3|qshaCkrRddh3}f(bE%lFC8bYY;ZK)>-iPvfM z&P;VNa?zKteArXo8*QbpVo3_P@(qjooM$V28_Sot;?uTT=|8Y+g3z{F=|8j7#cU`& z#q_3rkY(V9`1ND!Z|Z+a5pB35cR1coz3)w9^rQKdC+%6XifY z?f*v#LONuKdv)lTA#Ppmlp$_i?VKTQ&Fq>XZtd-!A#RQ8ks)r4>g9^<)}Owv_}sb? z68F3h$cSnobOs0O1vw^D2|3>~L~kY}UZ0X7tyz*FG~Y5rf0u=xyNN+Q@9F(m=<6Jm z^LzSGA+dUX%#%>e`}$lNBWgkwA+z>~y-@0)%;j(fhw8nPrQCa^h)Q`}EEcDf$mPj>HpUy&G?Ri_sCoJ^Uo*s}<`e!Wk)t*5@Rtk~7 zZrZQWq9%A}Q^&B#+0;=;H8w+N7IY$He1_00DBZ80{QvR^X2j5JY9eA{GlcS40*TKM zH=mjRFP~W%F_aIr>a#P1^4WlV5;DZiC+Yv?^Jzv5<+B^97G?O$z8F4YIJ{E<)A zjb-|9meUZb8_V=@LSpqr`DM%(dMwLk2*rG%&*D@E8)9}GvRq%yQoWHYds&ub#GGMK zGh!aIya%~2^2xeS?t4S@{ay*l!_onw)uU|{VLAVr{Kc)%%dk9$(64fZUPDNz)~(d{ zOHp+6^r((~spn0RzrkZ|q^#D5vef68uk;j_2OP6jkN!!fDvKU9)v@*Z7$J$u3-qia zQNoRS0!#5falRm%^sj})>z9k57YEs_Z)SN3DI;VTOQ%)xEPt!-V_CJ-mEVNK>UZCj zZNj(uQI@b6*(Q9epJs7e$SwM17Ps}=q8q95IJ>Ri7Cj4#+xl(M^RT$B-&Vaai`)8b z)yoJ8wSL?5mNF)z_1mUz*)NY6wSLvHr`z>9zeu@?*{r&d9r`vQ@j5-(*I398EQ<@v zBep|NW!VOyBep|7C?r97y&&c?Av^UuEbAfNAm8cPeieI~QJ!7;P$97jJ)txVF}w9G zEcC3=ILIFTt`ONni-YXdi~L6U1eH%QFG}mz{G@jhf@kp1r(FO^)mM6CDP+HXl4apF z+!IIoU-e5YDO>R*9b$gdZ?gCUm|21x&>yh$T!^RAAiwJ`Su*{F*%!zkx^{rdlOC3i zKK~xbK|PWsp)`8YkVASdmf5-G^Wlf}LM%0l;me1JIii>=k$jx?yu>b{z^!! z?*0bP>)P+)SD@$NeLt^93W?Vzp!R0Q)-UK$Eb}2bg%o7T1<4P&sF!4^2q_|@63cVU zhSBxnl3t4?Ct4D^UR=`qu=L>H*JXVO%Ow7NUDn44iPfuBmHnS9dhb8}_t$hqpDH9) znchS8jnnllQuOLU`5b<_zMG{nBv2VM75e`FiSMjCr6}W+?)pmNN*wCg~TeiIp&eRgk#*VRX)KGI|TR~GtW2(<}M^dl_v#Sm%}p6I7o=!+puAW!v6EcC^YH-+3} zp|6}!|M{7IpM}11LjC7w`U@8Nf=MT&danD9$Rkf*FzG48VL8No>=$|t7W!fc^|4>* z1z1X8yfXx;Uh2hJ>Oe*bsld{PV_xYsSo(6zE4=|rL5zGUA0_ZQOBD#^qXgQrG=tFn z?yx{-md=pxg!B>;y1$btFoAXx$_95W6=>2n0mvwV-U za{@6r0;i9Q5{f;g-17#mNm1y_NAy*re1VZCC?=?c$KkCYw6p~R^Mu4JNvJJXkt#Yc z_b(aKtteU%Na4UbmZpCz$|E6dPRf|)F?e#M0cJu2k6C7-Cu2d11ty=Sm;|LV?r{`? zlnopb603aq3eRFeDg;WLk@?h&#`6G>ih*@3m3v~|6jC+N^@5BUe;vbOw+BnFYff84x%zqdCc}R!ATo!urK%JXX!keOp0vQ-6aZ3u#w>*c83?#E`{SkMHF;W^6*w2y& z`Ph)LfyTFGsv{^*6l6kR#2qPnX5#okCI`CSmC_U=mnx9hKnlwVcFklQ264nH}i;NXm_87|}x#16x>DVCxj~X<+aZ8Pga&&moXSf#%OhVwEWT zF2+HY1(pd3Ds}5(-Vd@epuUu;2DC+Q8L}oY-iKS!sAGQQvktO8P{A*SJ{Y(IvMDf2 zCy7@!_d=f+vNbRwAYM-a-=}N zrjvo*Qp7j8=*wBB0@*UlRPHb3Y@h-Q{l3~DpR<8BEZuS5J3`I{cCZ{o2?s&01o~%{ z`MinpOoH49B(p3v4s^;UV>Y1uSqZrxSi_PHsWw0!1*+tbF<&ATegEr4U?a2`ZESP_T+4?w%NNEDmbjIf!OlV>yLdM`9Q)qvW<) z<9uC**hY=qQeMMZehJBH?9U^m#0Wfd0m*H&$44LN3=YkWJ1mXElxSlzOLpv60Z1X^ zCd*_}L4^ZOaM7bTX9UGG;1%xi=u)j5{TyocR=YshZ&FYol%{&IdKqf%G%_v((4$ zA_ruEah|0It_386jSi(LRjTfOm-Bt27t3GBr%y@DRT{%s-0yY`GbXaQ-|ZS^%wloB z$u-vq$4zjpkXB%OhW^upHHo~~hazX5CmYc$-$UpNt&@#%EQiOSSAg~>Xw+tLzp55AUT1OF z*P3Fy&El@FHO1)7;;ye1YYby?*Vl?QCb78dYsDF}Slsos;*8H&+^?ZcHCD5@UqhQ} zY-Mp*(~39tvbd{h#T$oM(teU(A^*rY!{UAo?IYs`i@TQBG~+RgyO!59!(UDwRd-dc z=|)x-cU7+GMnM*LRjwIEITm+St{Fxh7Wb=jGmY0-+^^2fG&-`lUsaoB^k#9tsy53Q zE+kf=>sLXv8y_3fg~+R3aUmN#QVufPI3{FYCijb$bBt#!?$=0MgM11rm|zmF>j zy`le=F^VO~^0g7i;y!!1*4QmYJY936EUrC9<0>K_Juj}yQl_!An1#_sb<8{(i-d$` zVAdJG3JKjQUS}K;61r2o&Nw9{W8AdfP^!|l(lhQ9uQyVJ#4F!cmT&oOG!6&}jSx2) zgR4=hc)eN|IoGt&7{Ss8LNfy!jR`D0P~I5GCSxkgBnZW9GG?=E=a|h#63Y>e*=#Ho zk{U)=&jmQn-x^z4#>|vY8f-Q8v&@QV zZ;Rfp`i^5#!^Ax)Y<*XT&^@59AwL+GM9%V8K>g-D#to0q9LOHSS6v=w_fB!LkaI`R6m}V>%60h94jvg9HmS%h_V{~`D?ldEr#eEtf&G?HhU6b&N z@tnn7xA2OQyKZP(v`*j^qqawA9lUg7xJPIezNM%d4$#yyk$K12(6WO+o)VWlrybcc*kh(5n7k; zt})Xik;wU9W1UB6Ex~)n?;fGG^6ndIgHX=2`r-qls7GjZ!G}gykI?FikBkW(nU9#q z#uksz3VTnCD;}Yh6`vaZhM{fI%7M>}*I3*Y_MRKvS=?3lUKo>D-1S9Y8jD%n^+jJA zyI9=yMPC}HS={wSUl~tX-1S9Y8F?DX@{rK_qKa9U#a-_-li8KUUGFrLIhMs;K?8>O13Slo5hRP(-&BqeiO+gz)K48&tU8a}_^Cb(-^V6y|k*2>1 zl?QjtAk=O|nh`9o&_kn`%w|p&YZ`iah{}GEkI}CFq*r6Qe zV3u4E$|r|8lI4#ytWk>n%4tquIS-*8kXT#F{g)^+~!7>i4cm(ZSG{*!ZCTwA6b$)CXe|m%M1vei@fF$mZcCn zhI!3XEC)CypLvPp0>|VtZ?ZILF7MFgH}A8&4Wa$YZ@ysZ$1w#=UsG8(#&Apl(_v}Z z3~Tb>$VZzwSl)&xn5&I83$X0CC3_bI&EhP_A#}AWXjWjEiB$AWib7@$mZcE-CPg8$ z0m~Uk3{n*~UuSs;p?nIPZCM6!OcAp)%Q%iHV)kO8d(ak2SkxTELMtjo2^qmMzp5-x zF>^f2HxMdMF>@-*z-ls|;^xOJlOdE(aWjeK8B$T1OPEVoav_GwT*6$ z=0%nkkcL8TuxPke&^aw@-ebuMp>tZ+e9qFWt1NRlQ*9>eMq3D#xtwVWiPe|jEYokW zyqTS4ErepqoB3Jpb30bSEXLAfl1x>>EXOh$La8d4)mh$bBWqMevmQ$y2p!dmW^*B- zK7S=MC?rYra$m<@R5E9Kq%EYfxtWF5OzRG*Y9@Q652TuDH5YrTj6q96eYP5AZjZc= zn3`sNA)ygjZF8865u<<)5mVbt5)xDv9F<>Psbl`ZLMwRFui!QFl@$H;+VWd1ubKMm zv~_&p4t@2>$mcb)rV!k>!ttS}xa*oREVnD+z64_GnI&3Ms-TiyOHn?7)HkhGQfOtb z&mj%W)9s}cz*(l6(9n$OAf?tdymJj{WIkp&hx$y?*evn3j7i1si=>I!iDflv_;N^7 zGpeJEnTK|RVw#!PSnjRFC==4$yw-_g5|ueCumULLbu;ffA^8dNhS^?7XiVM0JSZey zcfXq2!u*rP{c36p^BjviE@)w1m69>aZeiZ`2-UF`=3|d6Q*qbX%+#66BWo0`M*F5| z36amm9Y6`&m}O;*-f|zFKZJBJtFjD)oDou&#hqV$+icI`&ab|0b`uiJIPV?JK2k(& zxr}@|nhRK{w%mYpG9Sx)lm@u-cvpzlMU+{{6UaMe7LTYnXI;#K9D+~1#C}y15n}zxb6f@2o!s7N5#+xHq+PyfUuO^vmSg0@Yn~+T`bnTuFoow!8 zp=ldXT4R ztoeY&?c2neFIe2ZO`PfPBkP9S2bgL)EN&lQs+p6;?c2ng1z6m^O}trx#qHaCWL98t z`!*k$HQiJ=gVax$W;S4P`w7#`H(02jKy`k)*_MU+2~_8&n_Z-2w2(8*$wK712Wt>B z!#pG;K`Hn-*4u;3H2>-+_EgzC2G3MLJ~plXQcmN#^9y9Q88bl2mpEU?Aal*#Eam2) z9fN#gUS>Ia5qI_>^UeALWvZWXb~Ic?7MLAazQwy7A#%j-yMP}Z?B2~s- zEH-ON$rv{+HXE||(Ra>`REy0wSg4K_71EZ4YLt}DEL2x3ikO}(RHNz$8OTC4s-ch% zSg1x(%o1}P3)Lu!Sz^XX5oM-+=2G*#5cwuM?ddXe#1MHj=*YhgS#C}ilB9G)ub?et zg?UAYe7dGPWTp9!OqFpozBC_5(X(LRsi*g)`9esXUIaoty)RAwd;fb3SDAT*;BCs< zSos7wuQCUEVyOSK+MFdMsOX5Hz4*$!FJqLfEMJ?8KA@a~O8>KXrv&+|H6uqziNVpJ zRNt7FSyFKKb^>BHm}^GLn2(TZ8f3G%ONhJ*(>L$7n#Y91>xZAC!Byvtte(r$1K+GPq+$bt@ zk}@S3M+1^<_F?JNQO5jeE@DaKn7!svmTRbW$w;-&G)BvO-o(BBqmUFc$|F}Hsb)cs zJcayhmhy=6I@UfiE3=fr(-8$BznZl@QXcY~*+WPozH5fM3OQho;h2FpfvPWK_^g4y092Ot;C{VX&FIRUwBrg`KXuwQ%bopJ(PdDFJuo+ZX0Vj-i$0 zDb)+}hLC-k76;|(4KL06LPE9frP+D{9Uocinjq&etE)%ehJ;%igoJ9H-`XxDbj1AD zeirwLY1VTg@p_|~vPBA5>O|UByxtN*qmqDS3rWqWy@nMjV=`KG!z%2Nfhdn*HS)+X z2nK&1sZ|Nvv$}bNwiRJ56B4S=k=9Wbw?1dKP74XuvCLM9NmS<4j5?Op8o}b$v20ed zkkE0?VWkO?zl$*_VGirOM}m-?R?K9|IaXQUP*FaHm*_dT0L1(SqfR>IMwf{bzdWn`YAz%t>`#jB_&lztkMB74@Arv zmexb%(^;i0Uz|J|+vvVt3(QCHQQfDxZA&?;j)>V8J{+x$iJ0=1I+arG3$M)WMkVV6 zO9jNxZ@IGdjHM@p+OaB@6)#f_gi!la)ynpfl3YiOH~N%Y4eQZ?6yD6t+O0cY^qH4hIP{;)T+0z9t(+8N@09a2it08^`9a4 zq6SNAYt1Yv>$w$u%X%*4LRiarcy9}vf6EI0m|`x3RY%_j!+fQ!m51ezJ@R_d&MLz4 z2464QTjg24?;@`kZ(B8_1eRZrXSt)*fTjLLd6qj_EjZQGH{@~dY_(@`ba~#pSY26W zV4tY|bg}xdl;A5!SL=N#fqm2E@2k5toMR&S3ew#gFC?fe+9t2C?^-K4<|MX`$w?)~ z+Qrg`x8B3r$KrmAq=$8crC_p5)ziAb;(mFgm-Vldj4zM$u^zA#o*_%v$9l}E+;5Te zvGm#U$h+S(>1$<{5_pJXH~=N=XXR#@hhx|o(%&k@sobxV4792UNzeFJ%V4Vkr*hX< zA8a*dao1NLZ1v@QeB&`T#d#lW^=Fxlwr&)*HN-l_se1L5dojd1%aR-8(-;wRfn__6 zyp+qFPam{nbCB~8>jukfA1ca1$otm6oN7*MnQEBzfMdpSd4^e!SgIo*BvOW3FF94r zLwp$kG~5cCBaUI<#axVags3cCF|$qO8E$DTS@*eOuv9(lN~DlPB@=$jO;PiPTX*JC z&azjTI|6GGS!x1FdKmSHDqvfqtO7zptMQMripv<$XQSToD61`}qBW+PqJKQv>MtY} zU-*@6?-=W2mZw44+xgI1DI_$%`k}RhW87Z%hgQi?s64X&(+*`GZ&mR~Z^%UJBO#&w zPtckxBt0+|E#w%)1g-rnvstECN}|})z>vLo9vd;SRt=UZEOFKlA)&tdRBN(FXdZj2 zHP0i|SC6+AdxYB6kE|U+LVcTQ)D&f9NZma&WwT8uQMdw)a z=2J|9LSG(^$6h2@DMIl61@`n~$R}3zB#MbuKEr;IBwB@q?91f#tmavzg@k%~^Q>}0 z;uRVX&O@qsR&ACl3797k(%d7fAoHyaEKPCkrmOj<)_EbJ9@?i?kx!{Ssrs>taul$@ z8X!cD0yZL_&#Y-I6tf-jxwTJ-?6d8GEVd4KWItqy)nWnVoTSiLCJnO8YVVO#kT0x7 zEHsw60$E|L^TU-oN4Wy-8*3~Jed&X~Xt2>r6oRjrzk~aFNVUmY#xXQfpqNco3Jc|&9Wk4&>zwKco(szl z*<#(567~dRy^=z#ā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

rUGCOOJSw85M$Tcu*#(Fuu|wXl zWfp`Rju|lKo1o7mMWl-PuT`3BAz)2kqV-K_G=?L3THIf8!$a?WBXez{u~>GLMv!;$ zrM-h>d}YQSrIX{`7DSLGmmo>s2Ut@dK(8vvw$TN3KkoRR%lBzrkBG$)fh+wyZ4T~a z{2b!I@3(v!MW20T+I~K4Usdg0Io!hJA@K`F;sD4;B$T!xV&|n6YT;8X($?Ftj7wpf zCVqU_$&C+*R)`o)i^!P{^*`|#lQeQbQbKX&uO6jxEJVl?9l3ODy~@GmwtT7>aUHoA zPUYz8m_oQiwL+w2T!{0HlS10z>MZ-jOeA|{B?EP}7D+jk z0ZX2S#`R5OqROTbQqweuIquGvW8Sf~i@6-vtWyElH z5e6*8IVmrl6!TD#N|f19#irVP3(7Lsf*mczt|gZs^P)&dy>BX)91u6RGGvVF7ytMp zN-`jeF^t2`DaNu9w`1+Q&;?&@;<+AAVT)76N1}`3uqY3C2#2?CL}QYwe=)}LDMpUu zNH3Qf^MS6!DS1=56u~WzA`~sGa_KPrN01}&G-G&Q3NH!a0=;7nx1cSzTPR=_vo&$% zO=brREF2o7@+<&bUIiH8b(ut%wlJs++;h7O+)^)!qD(DA&-C5e=2XWS5@z)r63g{D zRDQ|ak`c=SH8gEnQ;nE~@fn;H5hDuc6lGf~ZUI=CX_{11(6dt~k!8}^g0!l;!>L?k z-{tF@9HDw-hoYjhuFL~1RcMmi6ipW zCXE`N!AQ&F)tbwW1n$|<7fS;f_ucVI5}^_(Tu?xHu1G)~D`eVgMdb=S#PY!tGdGaUyR3GoT0uo=qAMY*p;aa@09CX%QkOX^=BvyB0uGnU78FdQhM2 zF@y}OLX5AoH)XRZJ=!52CVX)#PQ=D$xDjVacY$b{!>H~=X(2y##=2=Epzn%2r= zsj@jaJYbQtS~?_%rGF(p)kWwnKzU$8%%#M zmA+VB&!>FdKZd$^L9azx9Hdehm{DQH@ZJ*6YCVR{acK&E#$T_EWB_W4B~E%TaIAY? zI;E12p1tXqgz{K1+1Z4z;60Pul6+qbHoLlOhZPgvY?PI`M0>iuZy^ zqzf>lJq%g}Ce`6lQZQW{z0kt&406;(iTC83mTI|+yVV-PXGTSA<}b>9QF;^ilocf& zdE`TU!i>d-hg@Mof(L|2iA$bHpH>|b+@`UK&N09gg_I*2^G)p<1aid$F~cg#u%)=> z)mO43co<@81V&o zjgf-vVH75+i?)315;hr>vLZVxrHUHIy~)bxFeuCi0`txIB?0qeICI_QTL=aj&E>PO zd`M4*C@l_G8}%y7V0EEgy;U&rZ7XFZwCWWac{HN15$#>*+d!kN4g ztE^8I{|w{p+R~%V%B{K`++&ALFRl%qehP-FPx;f~rCl_LTo3_65V6FEO)4=)CFU|7 zN4W+MELzM0N-@&$1ZGs}!{~WPytt3T?m~qhU7zCc*u8{Unz)4BV~C}ZGpjRgrU(gHMjBaDN<0$P10?ovP98a-~72Y~`hX4YHe$ zFJ>@;Wvq?!3EPp;AZI$TLdH`8T#6#tXwEo~lH{@UCOYRaEk|rnIx0 zN+_~T(eNc{Hgs?Sn)^wZ4z1CLb~>Yt_~z5crBC6HubDo$kNdjgxw0NUN`pN<4nz2H zECwDz0d|338}e?g&lua7c!@maaXhsHm(V`fU`?H;jW~djobXjo@k6$TjF-3|&C>Xk zs(V?2*Z-UryW~uWJ-{tB9-w1Plsq0LQ#cKBt1px>Y7WN(6C1(-<|c(FikX4M8!m7| zWwudMiP;2lhqM!{C0)uK7+A(I^e_(*3*6Ry2hh{_@~BS9!@0l7fP&QQspNhkZH*Ur z^w&4_9`-6LggUE4R_oI8YIJ|a$H`X57vsgj%0u_Cn8hH@0*soq60rPyO>spF9O=3s zD?P%cO02?C5-c*p_qSuCp_+}zOl;XsC6!c4C--5LN`LPY0-tk}5@lU52Pugi5k;s-XaO zsX+syS&SFBCx+%Rn$EYg4I>O?xRP_ z5a-220y#R$DW0*MmsE6luz~mJ=JIqoFP&bWL1Fv|mLVmY2_!hPTVLo9R^V8^_K<@3 zrK~f>M;wz?gcSC`Paa8R;Ril68hbCM9Pg%}0fP_%2icFmHi$S0y%0Px|L#;<+jkRr9h7H9q zde`@Z*dyRL!1ZULu^8=w{y#|1j2pJ(HVlLJ9*-clPQ(A#_2qDo918g4S8CI7Tbf$$ zTPdQt-$wV9mX1SyTaC4Jw^Br<^K=xz*h|LCwa0i;C_bl;5s6tKA~1_jSzzk%W`Qf~ z7q1z;i2r`Ffyoefo<@ccLYr5IlHVg-hhkaqBnOz6cxMc=DYcKq>vfnSkc1HJe6IL> zP%_2E)k64Sf_F;;24&*4*8mt@q=He3;AoKVpbQDb+5iOzBwGOO1kUDEIoQJFlZ`SB zd9ewoQH07k0HqVNKvJTi-NXEWnh5G*gn0)r3frHZL$5+;3 z2M7z5hC~%gBkT$+N~qZApZIg{I*m9x_40qyY!GbBYBiP|*Cz`cgI;CF~7n zmk=M}?0x3JgV7~<10JBj=#bu)@gN~AZBUb8K;bT&07xgol@HloL&D*VKx6B|?03v1 zY|VA=EZLaY9c!lqo_$79Hzk?36*UFbP-zP0XZMB_B7z)HC~-!i>C=NP9${hQsIZh;zSrpKzr%&LZF``%8@hp=J8cA4v z7%F}&QAMCo;eHV8EXcMt?|u0wp;9FdC{Ma640!5)u=s?>QzScN z1hoKaN7NAs<9E9DiI7&w9V=JItSxG zSI!fHd*jQ~={UkeSEM{C&@iWbhP z5NHULMwMU@#@46^g8ZSlUEq?9FQN`syp$0Gp`VUO5E6}P1UljIRutwG*E6pOXiV{K zUfPMkc%shd4joR;wpd`Zt98Z3+bqZTp9Jzf(lVeSp%TPg04Q*3b)Y@78l362=Q zbJ-qSCYH*z>w*-BrY4u1MMjJd5Q7^~@*>xGPH9?o`+;;jRxS7gALn;8h>>gdcz&cYEp3tIX@ut?iq zb=5I|ne^6T`E+rAxtwCYg-2h7$DFL8klaeaR=%C0=%F3Er(U9gPCm!%*P#y+JSG6q zL$oPra%Hq@%vW-HFn$QNw~(_nNGQ7+ThW%=(tRO9rl{q8UUJW;3TcJPyjZF)MnB2* zEw|j*T6=a7hjGjuka)?}e@|D*FEvnZTm!2)nK9d4E(=T`I zp~zd+UTIRcnre2_a1MyCGE(?!- zMugTLCeKBPAdE#oJ+*+El8;M9a7x5r6W|!o2uE-^jf#z(e7Rlw6e5}T;qqye5SlRx zX`zqte$f&SBgPmO#3da?n1ud&fhC<^O6p_hr^Dj~BCvJSk*LZ|L#94KOb7RG{miWu_C(Be$9@D2+<2J8V3@mX~rFtY?7migyuBb&zKrAML_ zz27|;8UR-=8cPUu49smf8o8*15Yt!o8DKj6R9$rrPJA(&1SDSPk^`n3;$1AZ%ctut z*wj{8bniD9mwbgX!BZlxY$>W}r+6zJ=4Uv@eI6ytj#jvpET|rDClhT}RC+zRvxf#F zc&b)f_dZM~U=$V+VTJbMNestJo*Nq20PnT^TN(@`@5_rAvnXBdOjwRTyV4vN5t8pu zJ>7y!mD&rEST~T(?h-FtZz)A+z30<94ZnQ^KBTCnc4xf@*BgAwoDWF`id69|9e02m zs9f#W?x2M1CZLNFc|L`2j4cUaBLofcu_{5JT?=H`{JA>uOgbQ-**iGXW7+^LDxFtk zZz0`Q2H-q%z)LLXBWw0SP3+H_Tc=i?L{PK~SSCZAAC)eS z3CtE?_#x=J&<$X3P#H*=iZIzIS}I?ws_tJxJXj1uMGE7a06OAhD6S+?cLm^aTJqoc9jLv}LAWlAT$RB2;o%N>yIP#AG zh#rN+fcgmU|3R)|F>c+|P@!w@QqgxCtsJqi+mv2>Py(P<5LM-H1;UC-P|KBISL3Jh z%Z7mf1ns~^KKjK~LSI`~DWDkTUufnDMid284m<7$z@@~J`xJ{O+2QFf*x6|M=7*uP zz)TkF!5U+RXA||IcYZw=U;KVdjfA8i)9-lc)L+>CFc)$O(T7554Wx`<{PN*6(O%IX z-7|5qgBboV=v^EZFjVGw#kp-5q~FEao^G^XM1x806aA6TnsD1*!h5@O*jBBi@wMck3X%mmO)*^OVS1^E7`@d) z-jBV*QtatUY#^#BaY?0weGcd9RICFLCMEI2>5@Pn>+ehn?c<)_|&WzQP z9vcW=_x&JIa5-0Q2c%A&x269=<Mayc5ag1Ntn&Ow^mJ0bj?8s>Q zNI3#8=3iyBU;QN|ZNi=4fpw1q5BJm`Utg8F$)^o-1m9?R#vfB@V9W|fb78QEPv6dA zgyLW&mp2|ItM_qb&P5J<<6jh;=LNnOEzJku^4pSCgD$x?Sh``>)ZRXW`itNHU~lQs zr}$(iEI!USxwk4IZf-+JzlbXcvJZ;f60n3J`7R`E-Ip;o5R|Ok(SzK4fC0fQXd}2W_s!+F#0U5;KemCaW|U3uX$8MMsw_ zBO?+~GbIQR6%Hd}B$y!%5DsNc#unVY-pt?vk5;3EGs6&Ufitk zAuXq0hrQ0i6Lh@1l*a`#%{)%$lNiY6k!FRMM_6&(!KE*S&g(q=I!8J5$1*-LyD|@D zhv%U~{n~aO5g1t>HyXP~n|+=`jM(eY%q&70!tB$KzMizFf!MvTU~B>5A`K74NyD`P zm2agn6z-P%va=2Yz2YH@rWg1!NG^PNoa{=iOg@5U%l&E=15p~PNnrw66dOgGyC@A1Sgh^Xp=zZ(HTA!Ey31GI1{C(UW4kTlP*=_)Y*cPq$sH?jdd&C5 zgy*}uEp}k#$Sx#zBwZk+A@{Ew`1Ln7qtWR#4Azh;?ql*t+rXW|=}HgDo1%yXcxUMd zhFTU(8;ckaKj42Dooaq!&|q;-6_f$lyl$Bg{iDIzutjj&_!Xi2HQP9ySVFR-WAVp8 z_ni=8;iF7gmjV}G*+A$ugJVDb1llY|C6d^XqOU=aNgPBTaZp|@!d~(b4F0f=&>WB* za;iUUCVfH%lL$NORcUmJR+nmYhv;P$F?t@DkR0#K_pz4Z!y3$9W#l|n=WoL^bK^2uml#>K|Ga+%+eoN5tGnIT_lc{pA` zQMi)*DY`zGDmes)a3O+yRfxE>B+)MN!VVjdS*V&3Qw}C)3ZW%>6h!L;96t@KR5SZs zf(gs6OSMPf0Bp@}CEfidi~)3%YiR8j-sH2cfdz56)%wZ=Jk3Td+hO*32^SUgDP zXfrTm-U5^znL%L83!9piDAvFU)Wl|0nn29N5fyd@;JQ#qJ9z42lOCA=!*0^~)PgIIOZp7Ya@6A-XR5-~ewBqvw41a-M}?uB0g3cQm6Y zIS@s6hgYs*Gj3HHiorE@njXSN$^kjo3xF6J(;QfD4dlRHj1Y|8a*y*BbwV!IDETz* zzsGbFIg`Kuar#^6kk<%KO`Yq4OFUbV=(2%Ffypsp2?jb{S5hEW*;{~kl{7w!i86;E z^y(r$;0Y$Dr#5-Q4RLZU%o{8eu&9a2u6zV$1y&+&muJvWPwxwIkI-QhHb)#5YkDSY_`@Y^ zAfghv+(a;o5ivj#F(kB5sErt+b@bY|4f(Juckt2JZ`2*AK#FxJ407d-4j}#QED1$> zj@dzZ6Zx~rl~E39HEmD|D`HCN0AL8tlG1^2g5%gkh!`Gc%j2LVdX|TBRSWUCkqsf# zI23H>v!xq0uIM2+_DD% zO35)D0L)c)=>f*_Wnrp^#I7-mxD+LCh-{ld^jCl}OWh-;z(@^p4YU*ESwsvia)^1T zhUfs0(YSXLI2NDb+S_!g!y(XbG1lBBl!S;JG)Hoi$_+Mo2*(0C18F4@V#qsvA;>zu zo1CIf0jB&Rgs+@{=m+n_`=BR#^j7bvj09j|AyTJrGH!4N{tFB4VU7pabU2^BFo zLd9W;rMImk3T%uiBWKgVT#1MznE;xtdA&i7aCt*gwmygWxT0LZB@e(B4_gVMP~y=R z6w4##8@#ZakF^EGVWb9*HuNEzd6CJ3n06j2g~{r0C`aT;O}~&wgg2y9nWg%YMfX@{ zx*f}cIVV%;F&TslCD6gq-G9aYT|q>IJ#dr#NOqFcPEiQqTH=CK9lQ zoGve6<*+JUU{AM%m^5F)MfyD8hB0onBG1vu7dF&qTVD;Z1=J@4ZnZ*W-PkJha6H59 zZvmT?s2Vl;aw$&rWcGbZJn|XEIF$1X1wa6uK0>)Plt{AE*^}8Cxw0hgIZR_5fU;D1 zC~2LQXPPz-B`w)Rnl23?jX!)y6BdA_q|S&UP3_g`0Svumbp1ELnTihU01HDsz@+?o zaD`{5xUy59VNGKvUTH)~In1VXwCr>WSjLsb#CpW<#i9q^q*DqJjE$jLh-2Nh;YL?( z2N!3<)a)ufK6VTJgjG5V8*%2X@EW)yk_K=il;hPQqE^xiO;abXw5 zcK!~0AHt56mBny8Fe-iqG$AUHhbHhEWCn@UG7y)oFKOUXF5i(PiN+Ga8GU;#FQH<) zrmxDn=ci#o;O!TnsZiYy8`-xIHSIL;igE7Zue)*-nWY5v(d)-=P&xI%fol-6N!J18Xj2_j5j5~ zSyE}py@?>6aG2}c5LRTB4dsqIArM2H=E&)lQcNd8qyA|Y7U43iD#D1q0v7ynMr_Go z0U8P*jgTSq=gu*l?U*q}h|y$dx1ddi3iC2jz(*x#CUPgzHxSAlXQOZFxwmQ^M~YGq z*2C*sG^>nbg5wuJk$eGknvX7RD(`N@iB6)NKj6-EfU9p94R{|}e$84bI)&#;tspQv z0gj=dZ%-d>MDPvQ=P0b3`3N8f22t4GV~t?04JV?r=eEslPQ6rNLN3au#C9Z(Z~<{Z zLe#`-$b67n4g?`zbF9hida%4+$>*oV!|D##*r8owN!>dT;sNqPK7 zytk4?FVt?OF;2nb`Cv1@W(%vG0Qw|h1MpLLvUA}rPr*kaK1~nKh7%UZ<~AA>rgeX{yvE&is!&lm zw~I?b&tnqSMh3ISU=X}Bg2=O~QCJ@fQtHt{vO#Y_$eX}`bG;tpt_}_*Q$d^ydX#Lw zd4s=$xoEmV= zTMX>I0t{1i8{{M045X=sKG-K&Z$V*6k{xs=hA~Bpzfu-yp`m{pSjM)07m#ZP1Hx?_KZ+#wEY9J)$I;kIb zPz|X2YYv2aN1vW6&|dS>fZT7vDUF7B^8Wv@_dYOwUDti*`*B3gkQ6Bm8Li@)v}sE& z<;0@?(vob;@rb0Pkwj9`jQ&;DGNa*;8k3x%IUI?!${0a9#=Hb4ucXp3!88)$(Rn*v#2zn^p7dH3G;d%xezkVD%kYMJx9 z@4oxz+;h)8|L(c>dCK)IPdo8>I>q+*^QAC*>eqZz$CLGRH0tJx;Pp2qd^`z(x%%Sh zi1dQr>S!#g=4@V|d7$R2a+o?hZ5(S}s`CZMg9b{|jIi2hbY8#Asd<1DCA)d=u*bpJ zWd+v`zjow-$N3_UmWD16(vjIh$lzS z^kMI6*oVF5<1?LY>cE#i5F%ebY_bOGLh;B*bmgc)pt)@lS}C4BABnfDOf$0`?y|%e zJ{9z8F_0e{scaR_EN8M|D;EZmf5qcTP*XEwd{-aEsfAP(Q>pz zcUr{>6h6EjkFulYSBZ;{>UFWx@1O_zQuVzc=U$PPv81zZ{@&U%q3x-cFP%|?@cZMs zH&@rX(qHADV{8t)<*)QzG=1i=^A%q!XtyM6wzDj@HE)uj61D1Gzm-3Lj#zdUx**>& z#$p=9@VD~+4IV`BiaOOS6#7|E8?U~$W50{_@0oY~IqSc%;Y1C5VAIXmNOR)VbDL`x zToA8RZp6iuMXuZ?)(FxOXGd^)(-ux}XMB;<*m|;ET_kWr>jfP}ixWUieg<=sx03Lf z=b3CV*(xK>X~q&Xaa13SP!M+WB7f%n$z|O(Vo0#xQK7h2pdE*6nSm9NNE5g__(F&> zzlFUK&F7)FmUo;zzf=SRBSq9&i8)~X)TbXgZJ(RU&dp+aPs!@JwzB98fv%Bb#;8kxe7DBNTkM+Ub5nQ{8VyN%MAWZOGBsGqU%!3R$O*=}3E>9Q=lr^dnh# z*%z$px+`@J*wg%#;z29BekQoGPFg%wofadyynMBOFsG3n=|MrmD_OgMbi!9b>q7N_ z6pI(NU4~Ofl*ox9PX;0RlQU3HYb)|?PhlH+3WjQGoj)da;m=~@_5H;DoU|K%_WSuf z?NPa&&Nf^crOV&wv+H&p`I6kIE1s1I-k<9gQ9p=2<2W>{Qa-`uOD5L&_KkmYPAA9A z!0dW=e7=6gdcf&X)3~KfMfOZyYo&dDbs-hXpLw5LF{w;DPtWZvvF*~$lX^5Ys9he~ z?|fk}_=(~Reyg&nCRUac_1>;Nt6+zY0OKiBmTgoh;p#kI2w{TrM%Yv6^2%NG}IF-q*&25fz^ zrN<`NNNOS3TnsH;GhGd>Cgs>(X&k78GT873;$>@P5O;(+TJ@C{0}GT!+HoTOYo?eT`;S)&H{y_4=Q|WT;~Hu( z$~!^KT+)_NWZ7W#dG>fdyrVx9}eY5`aSr&_ee$6F$Ae-chf1 zISea8-|G}Py&~}<%K<54*Fy)HYno(9=}c?)%lweEPZ3r%;ZY)zRhcpu7yLk`zm!y$ zb!)RXXO0;ya*6`suy+eX>ex|msHJX$6A;Vf!iP@FU2$3yW_T$u6Q#F& zb-7l4y`arhEjVh&V%D_2<9lKCj2vPXtC79%KHW_64hg1Tp95WrnZ~OS+ns0S-A|p?3)(xk~vA zkDRd$p$>g{TDxoA)h?wLDx1w7eIrq1cd4v2iE?wcIb#vjc={OCt zy>9jh%Ckp8c{RK&r#OP7r9B_>&}a$~x6&{Exd>YbTAcZ9G8vN88fT) z5g}_M;x=R-puXACYv;|?@4_mo*eG%XsdCmJM?-7@_}#lgL%w08OCG&9H#ZxDNrFCI z)98JVED>(%k%i*s#UZ_D<0(Frp^r=g*%|*4ZO8#QFGAOspnSjCLtSjzEbk?Dm|~>$ z@$?njK{FMw$&o;k$QQoY#9pbtBoULpuMZUhH`s^Nzv?(VDYThhws|Dm~N}E*U z;M&;b1LnvzGJBC@Ulkdz@SzZ`(N%$C)1zqBcNXP-v6*Nd6nRl+JJCI} zd~x|4x{_CtdUr)hw8=WTq{|sCkMgxlVWv~2K6GJTQdBoTFsz>o@AA})vhfcohFYR| zi#EapM`s_o;WVtwR>A>lhV_%f(v*WuS_N{rOY`L=Em*!-bOr|Nkr6&~!{65HXLtb@ zQ^nOzsZ-as?D=T~zBp*P^8;wRhYtvW-VX)(q6fpLW^Ijh^sstK)? z+k|1&73(AF^;6>`p;nZr58~NAVx8yeyJ^yO4lv=cVEZ}zq4QK`?k~A&hwJ#RxFM=MS0^Q8e#Wa)^hioMuYTj z-@%F1H0m##sMsc-<_2@+ynt~urKX#3u_ntKbaz0LNo%bvBXd`n9WD@FYuBDZ3Ek{8 zXI|*0snha^w6mn2p_F^I`R4OQO%~lZ4-O!%rzVT{MaD(5l8g5|=>9D^KvPHU9BXe^Ps2`f(#JGMhIAr}oK{f5G-ZUihpK)Xh4Y+Ozm9I{s zBcD3^0#`vrmda|Iqgg(Y9ehJ4j_SJRW=fBo=nWa-KILoMeuniXX&mX948Q=GAs^{g!f>d>(BiE8EYe4WymUcM3! z;xV?G&z_}xaGa9I_*I3iJZep?v@*}E=!-|zl3gcQre)OOI33R zq>U{AtL!t>^`TC&??}zZ(&sKI;{jGpu+SC=tdnBob;|9=`XOX}{m6N1Dt7Sa##d6G zZx)}9-S(TfEAL|bCc)z}`D689{pr&R1=w7tx_n`iHFWL5CTlcO<8X&3zKBuZWW(jy zw+bxdRjo@FMgW$J{t?A~AQT9@xVbP5p~CCvSd@4jwM32AQETHAc^!?nsPZ~m7zSP! zWvzI@NrcM0Z+o(mwJ1Qo$W|y0nJa>)L1hE?&|BEgdg>TOVP$ zq>}};ijf{uDQ(GR#ZvyW@1F0>mqn1}8;bRXRw=16VEqdO_L)kP$DCI3Cq#1gWTzd{ z^V5FF$&2bihGTm9R?`Tb*&yx4g4B(a?({&2c=kkWki&PSNz#sM*XF1Ldf;niQHraW zthRvCej5P~scqStguO1;S*MFbTwd%<6QbtNHPzRFIMy=VNR*xTlgnPr3^7lNV1SQO znDL1;(za6m#ljgh?+uiry{4@0^{8vv!o5s=Kc-Uu)cX?kQ>|}v)yG5TC@|jx;c zPC{IDQo#vU)Ha7IJ2~uo+zj5P!4l=-!hqmL@wD8kX{O5V42a9>t)AO4mW*h8duT>v zPr1hdE0C_erp$MHYOdh1Cq)se#Ifat6%J9bb1f&rqDZ}(HJjV8=qcGPp3sGi^Sbe6 zR`G|bYU&RQOWoL5R@OQrwu3Dyv1WT_>9A^>b6dehzV0S=R@SyHCBgsCM@F9D9-DqeXu&xRaieLWDZBTLWggKzWka4CO~BT_e}D{?8` za=}fcS#OcHF>?o0WH2mK>>@*?8cBYe?V$k7&w14l*@=fD=V_f#CpIYB2z9Q=T*yn< z>LJ$T@}fe7nu?)8)jdT!(XL#^k+jvKTlTX}7sKj&T@~6l{25+tdJ<~WqfcB@@UR|(A!O2vVHw4+y_VcP;ugUrIGd#t7G_Q34fiV$^dfxzYG+mF z0=1sn=3r`e1UqAV0aq9=6 ztWMQV%lhe(*KC5+6|jE==$>4@s_&$~rN7|k7#9MwY5C-}nt;=@-Jhj=`!tn)?a-+L z^%dl$FO*!~eQ02dMkqMQuMU4s^S?M3++Pw8vaP<6#s z^+%<3UcRKUSX3hS^wsag#fH6em2OBy2IF6-!8nW#+c^x|_+To;7?~!lHO=~}0)D)< zAnAS~3%jGZ$HZBj1jA~*RB$Vr=`c9ppAk5=#6#}uk(F3!zIGk%hlr_-0DgfH3)@pa3o zZ~Bir^T>Nz6T(+U>onXHT=NTeA^S>})-J_6gwpfgnv{O|;AHJ33&M&bBfxFW6;nS&`M1IBP%!+7rjm-g5(6{&*?1?!tv?9;art zQ&ga#JbR?=c95aVQ2XFPt7Nc|&Kg5szHQLh-3vrM84hA*;#35gI$O&RAQ|T?!WIpv zj%)%ysO6tp&)aq&$(c=?EIjHqNGqp39^JNQX%t84wU&O{ZB>f6w<0}D#UxwmM|vwg z^~&XCuE&ynXmMjHP>9T@TbF1loI1NwOKOZF0z_e7Sg=K77YEcgKT%tNVK76Y?N^f2 z_1oFy_PeXxKhWKbj@0CDz;^zew`yxSf7t?7Yc+pMRq+yqEiJd+wCee}ox zm&?Zt3r*B|yJtt#>~d#;sg<~oHm}Cm>!x)tYz7Z}sq;k+NLD^aTHa1;Nn|xvvb1@} z&TFz?u|rw50K|*3Qzu6Jt*n_P+2UB9t^CGDZRLv&1-)Butyi@o-^yJoL8ukm7+!HL znSmVosy+Ax2S>#xn{1HUk$rXr(OHz7t0Pafps;{^oz@r5N?}^mM;xWtUARVAjdpBN z)z9eAhMcBnb(-Hf2r}^0k{&|t*+Zk9CpTx~&P)5QH-9GY zwQzY^hkW&gSVOt?9O~O#F#5S&@hQdR^0tnW9bVvhwlvZAh8GcglNQ2-1H;R}=ITNb zhZ`V(((;6Ryn*v|ziAzNj|!*H*2ALB}r`J{{ zOWigaB+a;t=G0|>0vppSp7!PD7X{(tzj#TYnl0wZWw9Ro-$Z+%W(&tx~B~zPRMlLRv<;=gWkEb{9S61J`Kx&??|02iQZQeT~n#T<2 zChuvfD}1wb#Xq6g0Wa?)zD6HvdJjWr ziV1=y?S_B^L6g&n?b4~c&R%*`y=hS9dy|QjX*T_u+#x;T@Y85vX@}X5+e~?AtEh8n z`xv)ngJi#!<=&Sk_RxbI#K*+BvQss>%j8W>RmHZ{5gR%m^I ze?&XAxwwA8dZT&$g07FRUk)-1{-~q$Hg4|Y*6^SI!ZrO*Kc~O&g{rE?&sPi8wW=CB zrhhN#`GM+i^*~i^x4*9*)7uNxVs%mft|)!EI;gaE9rSdtdP_M6t2zDCmkFw+>YU1w zvux$g=yz3RJn!>LFIyXjt7_kwfp)9@Z@#Q1bkAOON&nFV9iCBhR|McCr9Ywc7X{px z1meN!WtF9~E7jZf`>dXq)xwOPE(@GF1N;m2bg-J&)0|4ISdC@aRsY*l0{V>M%L@Pq-7HjB z_4ib}T9Hg8r-aIYbL}KOnxEoE99>FOyL1yRT~J^~O)Cy^|XF+EK&DI|fh?%e-DL z=|86aVD+wn$~#DgIi1&F=)z|@;Sq!}OMx0@+~*#oF^kLzM73zCGop#A|I6!xK(#r; zeKZYNQ1{zvG>D-KIOdP8nRuU{1n!2wd;k0Zf@W*du68u3?Qe+udfN|GZ&tlA4QlLQ zRo(f5V0H)()o4(e2R|l=S)EH7Q=o@DmJcg3NR)REYS~oxzoK?77#$3*6n z){85!2CezxIH8uVR`7>QHDt@0$bjOY>apCMN3diLs^nEo_k#X|Zke#&apnsOWGw`d zlvoNvV3ZIJ%l2}?3aU4bE9bIWVx0t}F-K)R<_R_fEKYv3=}cz1f)_58ZO?23!gAF* z;gjo zbL#HAI(61RFOh~o0!e5+xhjTI2culo-$5ZX2&6)A1QEh>NqxBD2=ZwCOg2^3)JeUi zH`MVQA%O@~gw%ep+%(zMiKzxMmWL~TZQ&T&SD?P#Tj=N2@t3R(hZNZ9AE?pNF9<@% zW2qmyK@m!+re=D^$|Y?+>D}NRAq%WN;kl+c(9(%(A~pUyRNbe4C-k4EP}UDsv-0$>jmQp(&BFc%w*JRbkx=E!OWZ1cUj25i1KL} z1}8d0EV)aDzOW&Ke6dyvINqRFZx?%XNws)F18Hkb#|QK~rmD1Li?*M5QmxTa!U&`a zd7>veTfp4#@w6Zt`)pO6nifR)!UNhx!z+EWgx72DvueLtKi`BUfhE7iM!#9;t}zrWXQpba@P`DX%sxI)=sqt!$n#h|KUU%Qa$XmdqLv>& zF4_psP`l;Q^3BJqnh%ev847Bv&J&~Rz&W9oT&;F(0pSL$!)9gB=UVpL8`=pzCX#Yu3D<&)EVX-oj3nR)p~{Ak?uIq7v@A?xwy6BmSnW%)NMR3)Hm^Xy z?4eV--pPzzv|N-W#tF$@RXU7?-chFx*ONUrdX711GauSW}rpHD}FP$1C+)1nTbQ13s;MH=ZfCO=Qn4>C0?rjH>ZtQ zx*COyS!`V-GpxzPD1ExvCxf_gRSgoJqds<3MQ(2ngJ$ECGz>DezVX4b8WX(^YjVB8 zmaPm7*6ii3`Sg-OD+`9aB~1jJ3?BH7{(;m83t)o?YN*$&3(u0hjS??yrWT?uoVFz^ zA0+0)kU>b-zP&r}E(&PP!l|b;lw~9Its&vBcQ^P0Am7)!AlVwy-OwOQg1bp%J2QNc z*H5y4y{#9OMm3TIHWVEs-RR~MZ|R(I`Hevdt8x^(J{daIVZnJ^+`QZx4_REgl(JR( zrKHKFWx<4^OQn4hU*%|2Y11Dqm6)FkD(AY5b0$ycFeW27*Dkauhip#Am|TN%Z8YLf zfDMg>T;D~hb|oEin6EySV5g@sg%_vPQaI&8>tbA`E|oUP+dE9J{@(m@OnqUB?+cC$x@<;57QpDt|`U}GeC&=*(%msk?)KC&|gl(@ihTf#XJ zx-;vIwU4F%RUnh8->xG#cQ9r~Qq5sAvLOP0z@nV4j;a=}HjkV0Ha?}@v`_2pptvog z`=}qdW&>JuF~8M4yd=mj3PzN;DUCsWoZjj_7=_P>wZG+9N)*YgYXtpYpEUzD_mh-D z#|1Ye0b6y&Imjzl&7IjYm5@vF36@JH7&BUxw~QK(xeXD{TkSzI5b4~7v42|Ae6d+N z5PVhVyQuLcW%(`7B+Cy$ML)Sw=nUma^?lArC@G>s&M99mN#M3yNoHzS3$ckGrge3C zz4nqfFa#wN<}k*hj52eL;u|V&@7k;|ADhQXu;hX?S0CD&Vrf=A?t%BwE4{IBV|&V( zFiZe#7FST}c{Z5O)OzDh_>1xSSYt%hC%c_E`8))>iI4ziNSeL(fxE;MUlD{JuUHL< zpkXvl50 zP67?8asGZn(J}sukGtBP(t0zQKQU+3nED#Oulj=i>+Lu%Ji$JzC%W++%0NU8Jy(~{ zxrQ))bXu+CidMupL5nUP+ybL7)~c&cUZeJ1@4jD=pe_{em6PYAI1eB19({XE9l;g1 ze^&Lg_QpS2kyG7?xFWJ3MAc={Z1uib(YH=Di%VS5?7;5fUJ~r}o0-8kAM`rM^ajxd z|0rtS>F*J4iT_k}EytHTB#T;iM=e(bXqB?iC%n~!xtyLro3~MY#Pi@r2w>iyG7-zV zjnP(h>&*4gGIx1Pjtlyz6`4BUF_GmT@bWnxvbWo3HU4V%Q9%^`?y55;5NW^~^cC(L zC+(gl^{3&f;|^hUVzlWrs6b#$xjzOz=lz0b#A0vU$45LcYZ|pIDbh*xLgtN9)|m6; z7|o@n`j}2_C(avuu#~z$h+2>&@LBacC#cPrFrWe>Q61`NS*vq0avT2qM5Mw!i%W%h zMv4!f&0s76v)WrZp+1~r<}vQ5tT_*W5?yI^cb~7gG?VSUG|Iy-{3wP~0D0$7SEiw< zB%{H~70sBxcl>gwgRP1-2I0%eUEZ5Uox`j`1*S#DoH$Y0R)l|q7Q}c~1&KwT??&wf z-eo;kJ6sNm!@jR=i~&0}t4ZLc*R+=X-~!R>O{o(nGzMZDh&@E_LM41kd)mIGb4gE( z0ZPbK=CVx8aCQ5%T4BXI{;T)uVTs`tYW{lHLA zX)`1HdV)^<*HCp5-O z)lVw&q1w&J-%)>Ts8t_)QoRyKaz-#vCUJZ8$?Af=Eit` zQV!qh^&4rs-Cxo2%QvIt>dhNzbr2UX3SSHM&#-Yrm~LaE)wZ^#@~G?0&EoL3w;Cfe zMn8m7Z#_m@ZEqGWfT2 z4VCTR7$;R{~oK3)K3rT=^;J)JAZoI z%5zfnvkEM##y+Htn6TN0TY_l8;mvZ_^f~p0_JxIDcF`Bn)o`Den^0~Wxn&<7P1oA< z`lGfsl3!z9+|PA+&O}4eb(F82Fc|C`=&&@>77m(mzHPFBw)@}g9vGcRY}1W&(6w`i zs+SC}JVdhk@hKa)he?!1R2WW;xjv=|?*AFI1~gPK5jGW;PWT2&dpy~S(ab?R?S&P< zIbrHuQF|UNl59ArgL#cD4Xo#K+o0aWnYvMUstvTTVo-uYyo<4o6C=XY(56$j`WJgm*JPYu@Ffkf-6zZgMGGyCS`gby8Zs0cTmZ2*~MGW8wry@Sr3=evr#$ zjnp^Tu!K?!Xl;eQp8HbT7Q0hHYSZ@)9D~s+TSJ5GYRvbQ@EjGj!7o_Z{xhw&mpIIMC&tjP|MxwcOQ$S~g!rP*BzXvnPbScx1|$?m^d2 zd($VGtWgJkfEk{jbIIQwH&+`RBywTAECe73=SjS)CNH(xs-EkHG@rH*2#XpAlM<0+ zC`XX56V6K2ljEvu)OlMaDXu^M7|k#o^j6pJv+Z!(f?jt_+o-i2a5wH>ca?eU#X>z_ z;qsFJ-|dUt-E`HM96|3-%oNo)98G4<@4}@5d)4CK%^TPhGg;l9ShfQ88T7-`dW5z0()jGxY$jhwnH@Giij;en0b5G z9J+Iy#2Hne!9-VLOP|MS>O1B{0Kjg$RS1OFAcK$C1_aii+QF`LImcS^8#I)>#qzxI zVRP9rnml&9?xLKfke_a_V+R9;?pj*=ddy z>25KgY6}m;*j>51j&*y*M_c4)ZoK~A@&Q7;xfYwWltjY0aDd_Z4hlM)hwZkRZ7{|` zUB>CzEpe0|5Mcfx7}KOWWfaRC)4y0!w0L?Tzjx<{=Dtd?#v%gHhk*d1c(#Y+NwKL^5kjh7U&>QDr~LMMnBS34jmZz-ITh&s}%A8Xu~n!+x6&K z)yk|OM*h2DG*{~dFDcLC2SW=XhYi5?O&8!TVj8=GtX$v4Bn0EvG`8vq7=7FD_AqqT zv>Ql{Ymb#=ZTouDyuRL5+f6BImjoTF6s>4j%MB~v1t!6{VizCp+NPQ|jUF-JT3{|4 zLno^4%;}_=mlOFihsN?7S(1JW{4CitV#jaJkA#C4^VTpihqac%h1O~DeYvzQww?~G z3U^pCmu>#Q!1*S2?4Ei!9FDoBIyC@qBRonS19TSvpqitm#K#U7z#N|U%GB2@_PeETn=KcPZvhum_(ww_oBLKI4_y*twr4GLnrLWuws|5Ys#h5=27W{u$F$_s+#Xq2$0!oaKPxJycJ;RQ8^ap* z!qG&#X_yZn#4;zA60Z#%g#Rc9EzLI+0~>T=WN;ymQ8tJqamI!^5<%DG@y6*Y58(IG zL3hwks)MpnnqAN#L<429UmpAO?onzZK37>nMgtY2b{JVBSL;y^8g6aIlPmgZpWKzA zXRO^6A?I-(n2YX7(^Oq6kJA!klyDad9~TI#HGk)r?jjy%f3fPo3j%~WO!dVUzSt!M z@Q2~Mg?v-#Fl}iENSN*8Bj9w{+SG-&9s#Dl59PICjO|(Sxv%cd%MB@`TWNL7;l7i` z^wWWmggfVS(66&$_1`+`%Pp5gvoJ4=F~9K#T==e>ixJ0e;%@mG=#Aea+L1yc0SiS1 zQy$fRN%zj^5nn@k=>O$z7jVgvokPVALIN@0t|)EP)7*AuClu#pK@LQd&?VwN zzwt?NHZV&2$faD6QdrRHYsf{CurpdsyC}oSjWHxYmdIqt)(<2Qxb-tA?*G|n%XW_C z>0x-hR|I%ij2G;GQQK%C?>?-+;1AbUGLrwpvRpr^^Ej!Ug!_Y4-pU)2dLNTz_c2+! zZ&GI^)xkdt`*d;cPJo=n=k2&#!6^klalZY=b9s42lwirL&%0Bfc{}+oQ#Iszt2Vw} zM2*7s=usK|`@i2_qi{^;F^&eFO9egzKX2ISOKLlOxV;Mw0(?<)y@jWGJHefkqKOg* z@8IYT!(@-drCxAiM`7BhWJqDGNslUrhInHZ4$3YXybC+6{3Vt6VISIeMhz{O7GSSy zI2SZiVDASuJFDdgy2uy_G&m7XOSyJ}#?EEtu0*!!FQ2AxrJ>7fnZ_Fwi zEf?L-yBySI7xdPFLDZEOganX@&G`^>zve-$3PhX-4jXz3i1fdR#^4!Pb1e6R z5+Em~rOjH6aD?XUJhT&Pb}`I^Zq^I}FQzVTS6~h0t$O&-MzywQ7V$Mx-8U^#BW zZ1&@V5DR$q(LxfeY1h(+?tj1x5d#PZ=UygMjTi`3+aVos9BLsBv`RkbG942ScZB*yFwokHiC26R)=T{kPPj=uE?C2{baw4PL z(}42^SSXd_F!ijy-kfa~-RA0|DW`BO*bA5r$mm(EKRSq+1Z#qWg}}0CFtB?4P&qRW zW&>@ptpsC8_l6{69T>vX)6-$iL0@S(s(i@~!VjGUv!Jcq7bk42ZQm-y+2)`sSOTh?~TO}3~(d9yMO0c`zswNbaU z@|cd&c8HuGQfqD)o&T^5?RU!gf@38^bra%}@mALCAwX|{Y1cqsbu!fCj zgzf#Agpx)tdM=-kAdi@e&FGwhO`ku>Nh5bMB_Hc12?mGKpb9nEwCg2sNI-CVryXDr zRLFi&XfCeY`ReWxoxVPpEVoO18x)=!vA}6)@Q}1J+)|^>fXa6*-RCAHf4+;LSc&d7 z4iP^Xq8G#$PKwwcOY0*>TCJ?#2PC|{mv0k&K0ITy5a+qN_rik29MbB@Q#Nj91BVOb z-L9vgCgeV-L5TA8srC1I_x=p6^wN&0}r%D>`XnYdf3g!t+ZS8xuty zPC%c!$9LlPy`6jcxl1)QC8fX_`|!bGOLaS1hoQ~ad8ky~Qw$IBNezxfKkf)j zK7v#0I222c5-o+<(G7L@AKDY;oQ>(oL3biy}a-#_uI&$8gHqOK| zHq3?ESat~f)0aut)FN2>(kMXEgy&*#y?brE1ELEc?Czl;{#bmxFSj`03hg-T(d&M+ z<`d2bG(E%`9A~CAQHdup>F7sEOG7(xMVGB-1W^!L#JUVdmD5M*)O9A1tb9mI=s&+% zvPqh(Ynq9qyP$AO4ELglN2kl<@XSUvraY+4XA*a`YicabFbk?TuSXx-aO+QladwrV zs9<}pUXW9U;pLR-QYN76ox8Diay17QI2cjwj$AFO_0?!cXM2qYX9;dMTvb1)`yg39 z$*d>|uG|1DcM^~oiEj>Dq{s^ph}awkZ6ZH(oANMpNQqI)b69+T$gYqjOxz$xWRbQv z!9?htmwauOTzbnh*{)32G6gR%hIIdL%+|&&bYGxEvG>j&S8JjBw)uDB*>1SHl7nWZ3M0#48#t>`O!EYWVcUD$g9F>%3`IrE(FpM_*6j=kHesSc%C7=_#3-8mZ^GGA}t@1BwP z;*(>SYBA)hZI`|Q^>oASj6dO6t7Y2T?$%s3)zTZ>OzV5Ah)LFeic#y{gLM6J1AeE% z5g0zPn1%KGiItgzgJ?*nCrW|HXuI%PI~^Vz6msj-=zr^|SXA=y1mLg^S7bfTG$*`` zkqwjfg0YKyj~p^h%X)B0Y0&-u^@jnZbynWXo2R4=(9l%7)wJ3oa5+a>4_^+{hZfR=N2))uwA_Ql!8cbSO4OUH&SjcNnRE5-!L>0^MjsWx-NZq`Io;QEQa749Wv4@m)sD|; zexRgk`~RXilxj@3E-UqbQvZwo-K{T)G8=76vTO&nD)rQ@wj@r9+I!smjk!a+R7mo` zd$-b)=e6uBuZQ^+imxjmQr5=a&_8`^emmY3KKg;WMHFLo7e*bep}_E6TKBP5cb3Yh ze?+CyXCe?`&~WupcM7`V2KI1(m%2q=>w{e-r&CLJdzh0u&6c{`uvtqwibm1O5k$AU zrv*O{w`1{~e>Sc95QYP$uRGM>1}AKdHZ?j+6m9JDHlJ5rlvNDQN_mLkB5%^mWusIM zrLr91zWr&aCna^ON%Hg0=2f>dOUd-Ec5@ERV>3my&6moV1wsI;+e?gAJAl@4;@&5o z?H1R&Fw5c-d>L$?AEeGH(MX&VLIKY=dxm|JH~P&r)s^nAmj3i$kEaSlV55DOYom*f zJJ-luNxSSOgaZ~gh-<~=5lplgM(CSU?kaE{hM6uof>z<1gCk5^JK^>S4p-JLjiPS& z2U{Q3R#ITykp#3DUJ1jUJ**7&uyOdWv(HaX3%1-dyxy4HHNuf@J}BdojL}uQb1qrg zXK3I!9E|2dAzvTNsGe>w5BgNQ(m1PeEHkaKwLgout`q`@9}XY$4I9J-)w)GN*a!(N zxp0VE?R@KNQN!@aUS|VLmz#nRnOiWay>j=4NX89IEizfzNz|XQY@WkxIR1)K9**JLrFsU>*4( z4hSNGD*~pBWL^e_g#p1FCEcS5jNKMrD#vU#@wxlFSNFNWFu0DAUMl&DlFFAe$vkk~ zjU}JE*@p3oq1<2E80K$@eheN`w(Wt|?@}dE2nrv1@aDcK#TE`|9YmKWqf+GnK!4a~i&J1~Y6g zE3M6HSGpOa(w1RPs%6AOsFmea4zb@g7;9hFj<3tI5nR0vH;7fAZkh6>5j+MClj1s1 zZBY7A|B>gu9qC%b^Tt@MVjhUXXGIo z;IiKDOw2sBT^;Gl4Ph`8x_3v_+B}@0tEUU!H-b-0n)ajmY7qw}+<tWYf=&tr z@l9V;WdsEC#Yp{DBsV4aOK4OQi81%?yNRdVNa_9b$+}k3%Y3Q(_`GJWVS(jA_SR-w zlp1yPt-;77idG5=lLu&_TYYDh`L_mhs_go{Te?Ie>Oj@l#$k7gmhXg0{Qh-}313%L z|F1gFPtzQzD_sz|V<8kz54GvqnhPGz1UQezF$8e*6Djy?sNl4Z{s(dRRg_L>x%sO> z^nbleRVukmqJ|q&kjhpE(UAtyrMUibQe4Z1eki~j_;l9EdRD69Hn*6aL{8;c)@5V; z-x$RW+wx((=5Aaeg2OLo{<%yMS}cdgD$TdYbB+*exl6)r!0MVV)vQ=>$tJxh81eHW zUEOwsk`s2K|7yxpZ5ty6K&8;{xC}WbKP{-@y1l{a9`r6ID7s_^OZ0ymJ>{Ek^2Voq z(BqO#yiPv{k0QJPPZ&;7pYWIfoTbakVwGxt&i=Z2!++oEtjTE8^g(532xfNWUb>1Pi9oEE({UW?~az!n`w(%Tf284 zV#76)w@4Fq{ry7{_{fLpT1Z#m6^SJ6k7@ZmwoS zh>rD7UUt zu{x_E_fopoGIraXUUIjJYipsIp;tOBGpcIr$A+F->S~wWPc%b9t(^b59tj4x==QR1 zmQ<_9yKx(?pp8H$EPOJpI==+up}5%SKl9tO{)BD=Z=jX+-@7hu4STy zpt&M1Sce;dJnyf;$fFw{3&A(kvyGP1-I(l}n~lMiTDO_n{wJ$HsXfx4s(z|+j&xp_ zWOl(S)Hkp3!%MpGK@0k%-%qSJHkZz6wtVZ!=|^*wao6s7Zr5jBu={-#el-3>#edcI z_^VK|@ekE`{8rmPRejq2Dn0for9MsWnDV4|49d1JDGyqxw$B8s*aNv)JD9!d`P6hn zb+L9S$BsR#4SHm~yQS8(8<1}hs=YUEygkM-17#*zDFj3zh0@xqhJ0qOi_7}zf&xgPhq$X7r{G&zA5fiJh;19wWnBcH zVykq8?=yeVf-uwnR`(L4SVUgIGB4Ytx{opk=dc<(E>d(u97X{ea}^b&!aT^MohuoF zI^%zaEc)fl3zQ2I7XGHtHsqLUKH}77EC(jpr^40e6=U`FL_9i(fiP-tKSXT$K)hss zjerFB0j}tyLJrn9^9~(5HOG892QD4`l=5g8cZJhdNQtzuz)B=P*KK_`n*WcSR9{R{ zeikMj@sbWD+_*vRtj*Wex}L=x#V-jrH!uYofo5%aivJgZ%=s3gJ4%KPLXBTGxE92xMZ z$r8+umd6HSsh8g>^gd6huh^)rhQz|TE|g2fHbFY9ECOaLx01xMhAf0`HdRW_VD-b> z&zM91H@a6`F5;6k>F(%^CcvFoUA)i{nH;MjPuuyq!?jbce!d&h93^c@KN_-J%6InI zAs3^?w#Z5NLfm|9eNbJgNY!#m88wVq(TXcJX%+!Ktpd+S1FT+l&s1oN<@Al#u$}q&pi~6U717oZDr|8VvdB^%hMlb34lvZx6V{JE2uaAvHV(nG(l3H!71v^>o zPhkm1uWb>7{X-xk)^2DO&b3yQhd@M7n1^Qr_O1)8k+8jfT%(T@=EHTCgLb4VMs!eD zbECg7;|YVgNE5zyB^*>Aanb8*+zHqh-#KyQ#yfI!T4M(@^n>!6(^+ic`OZ(!20YX~ z1GUa{YW-P@meTCCDHpsE0>GlEH~yo;HZi7^l>>{$!2mJKT^Hqq2a5;u3=sW#p#`CE zS<{Vpa~Bw2ssDuj#a~L#N-5<%0_#Ejdsb}&AUX&F;lb+h>QU7YxUD_YHndED!|8@s z33F+pY=9fI@fOJFHc#5Kn+%ljt9P=q{$C%>4$3k7An=ZAQsAybpub`yjfw8_SgQVM z4As$mLADX>W=U!VBPNiS7;Dx4=K8B(Gn~Bamf77DKfnE$^n|0T^SX|I9T#V~sN7`~Nd1#-Jey_x&j}88P~oi}FvX-UNoqOQI;>@iy?DQRgkPrbMc=Qq?`2eD z_o(g9Xm{gomG;#zr~5kLI~IH|*1b$&PCVLIF;87by={)esbN=ma z1JIC%1SDlY$qif!=WKAuk7U#Nl4vc3{@-6847&90Irxo@!W!`yvQcvXHQlI&i1Ls) zs1Ppwn$|IUxIw|5=fltUeLNp+!D+_1&TDPEq5rEla{!Qd_aJyv4up9^^(f&HyLoOH zON}k7q)wFc8w&_5UpU8Z{)ty&O1R#t* zkp$W9Ja_o^uZz9erf;L}{?B(Wl|dp&wC7fjJMWyEZ^ok<%auv++s}|hVapj%YjYc? z=E2SN67)nN;pQ4fjcJ=Zr$p$;xdJS-O@B}+Z=DmtHlaLU6}gMp>CQDr*XDy>aLnWk z`};%7!?s-_tRhiKu3j*{_PPm<$tvc(O<-$N$k}DSB~%KPs`at#DDS@^kg5%si;1td zH;A5;vT;hv6Y$l05|2;W%;j#eX^mk}wS7>kDO@o2HR3!oTM<%he!P1Lxx&N($@<)N zk7nC3Rqeh<*yIU5HEc#wEBQ>c-2^eZt|QJiBSRb{EM?!+l4h3P;pV>Ta^XY-Dz-B=$;T?FD{Z zc3ra;fEb;PRb0Xwxz4+NRyEQ(Y%JtcP!#nOe`0LOIAEP4V`DzlN*yG+ek+69vK_6} zfpA@|!A3bbl3*KvrT^vJV2uIA5)NNWLNLrIhLSG}CrUKZL3KA@PNASBdqW86|7LDR zy3YlUiB;|g^^vSGlWah^Zw4-l^bT{&g%06`%yKHligTw_2|k<_{^f=NZI;TlZ#I;z zCsddlZ)-s(w(@dn`v2Fobf(wjyLv#uua60ARvuihz3zOa zhfS5%Tga7HH3M%|?)Z%vcKvBevvI9nN$w|^7sp0LfR`}4*XnxA>Xayjy<&g!w(0>< z(x5P9yqCytt^nwNI}PSh4e7z5gK-T7w;dWeO->sdL&!69RO7OYJB*$Z$oPdrrwPYm zEZV`NfUJrZSPu;a>$o*O8mzL+4S+TIl4fB_&Wuy~dt5G|Udt6T%9Zn=954@vTEd|N z*PXBK7Wz0kb)V*MPBVO|>OEaz)rL3>b68F3jT&8@Rs*(GzK|K)PvM}`i3Mr-Muu+>e@@%H*i_-9KXK0XwPS2S{# z?pfih8<4!jbpazkCd?zqrkXre6WfgLE}7CSRJ&e~5jL;6Qu_9C!Bo4w)I*xzk1MFb zpB^^W7f(l2@1d%?0n$BYb6k_|WT5_-;6zob?#yw}G3WB{Q7b~TN?$j2eD zZY~?S9y044?&BzZ!H5}M0Y>3+=TNhFxh;&Zxh`1U(&te^v7%mBn`vNZ9l0cP6-^6% z?Jtx=93_%n83wc@kk=pR;c90Gr3CNcf|f%zpf^G2{$fJJ$F(2CW@;KxE<=4&)(6fq3A?3h zAS;?nW&o#+yJT?cEUD#O2D{miFEZ8zNDVMU#`gNZQG)4eW8l3D%zXB~ub}Q53JoLRaSW|po+*|}I2>u=JvH9MmH;9d6#?NHZ(v^>Nw`M#+J`n~_&P4CCYcJupj zy!8}3k#I{oa7((z?fll_HZ*9&d4t!R+DDDko7zX<^MwqbqywL%YkXeZI6fa0OMgK1 z!V2l4)f|uaiGH1GPgGA!;eW8|-IU&ZRNt@O9B&=Hjbn(&cCvdIlcT2keByU*_vdWc zV;y`m%8jG&s`@??zBXsKa6b2*hVZybgH;StTH zi-<1&13DTqjNfSARTbcI&m6xCc5oWy5hLF1Qm+N%-m~*;bgf;fdr;x(*8 z-*uld36EP4MUK7jmsEo7A1uSSGcST80}Ch=(1f1c-{!)3_$5Qc!Xgjx5~;CjvA zMN$ZKwD|6!Ienms{6G279;m$s!-qB+t2aKJa#lz87V{K?899e$8)ugoj~|ma<0(a8 zr15`T4AWguq2dhcv$?~qtzr&p>_YIq(5{$z?t_pXoaT`OPdMXc-E5MeTc#Q;F1G|F7rxdA#NWfgd_AjW^7~+;q%6 z<1g4ExL`)94<>-$49KGa7RGm>8+-fJ+S57skB9>@KAcQP#W3J`u&hy-$Jy^()LEYM zcsM4ktvvL6NYDN)Wh~)P-KW*hjCxBUE!Y@S!guM-y|*K;oDG&&m#O(t<0EmNh|&0g zA?&1kZDz}!XvZbsO7&4oBPG!1UG+a`2L*BXy)2IPyjtn?|5c92kJlvIC5}q-K6t!? z{i;C2x7el^ z+fA-{5JH&r`09=8Z*RD6TkG#z25YT{>)OlE%-GIyZD5dK*B1{ZNo$o&p4ZB~)?8o0 zopM`?7j}(cj)Z(B?Duv(BMwzt$~U>kdQPmz+QzxbJ%)wF80#7Ae>I=NkJn;heQxGF z3ikbs&q!Zr=LUO!m6Z$M46;4|HB;ohiXZYJBvy^ zDeW5tvnh9e()$ojuJY32!}V^^Fvpteuw|b$LkN%#rt~=oS2;{l#S|M3E%<&KxrBoWJ9&|ltM+LhVP9tnL&Bsu7n7pHJ{`t5oDt8$mQsLOvh3vvi`bvvwj$w zQJ~R97zT?h?x!Klr(7&aDGZmPp8@qSAvR33E55cp2NL@LAoI=>1;l9$-vS6BH3C(hM#}&NU zH{YO1=YGeP!|HIKKx`|Q=5_VOgdGBVg31SLwm-$vwmxIz;W^yE$ot<+o#Q+4?Yv_e zN*iqG)-M8w8NpnRHUrCpTksnqQat`2LB67L0uRPaA!O@$Ws)2UfiP@=gm104&qW0CEs#{*-91p|xQX4kvkSd^3Qk(j zkoq~Is`pRTO#i6NqN8HZlCPSiG%hJJxcesNK%YGJ8*J{!VD4 zCT2Q4`&`z~{hu$yE_K*b))4-BBf z*ZuJgbD5O^4%0boOeOed=vl#>x&R3BjQQ;X3ErMtPV2>c zbggEDRf@xhc*|Kv@O&p9Ht`%3S)Y4%4XbOdCL^dDg(W}`wG(@ITc-xrf7Ec%#Ss2> zIRqEwF>@?-VojNku=o%J9@aDHyoY^Y1zu1MWGnTfULFAMY$AHeTMWkF>>|Jo-6Vyu z^nRj*+x4FiKEZ54rymqo)$U+4&uKredO7Tv%}0ZPA>w?`%Vs4!3Y*tiSg#Bv|G4-X z1BzjnbJb18N%hz)x29$o<_T>6!;3kmcT7MNSgV#u}}lWwe&eDQe|)KRk^7M;nOl&4@M#@ zbVKb*-zW1GI0Rbt&R-Lnff@)<^^@W^yjANk-}9o^J%=^njE4 zWVnB#OAf;ka#bbxfD?4@5C$&Z3Gf0`Ty}*|<4m@nDIfaLHrq@Vn4ihQKT5rHt!$|$ zh)5Lj>_ivmGV(UUKemB(9v;<>I}{zmX)M(jH)~-I@1w-h;7oEYSHh!k*Z&J!*Ey@m z*AHPagHovrob~Ed{Xci}09-XXb)R$tw~+IB3swh#CBh z1H|*mQNw_#yWfJ~ao99coLx4AMAiS*ts6w{)I~O=fw(`fYi7zauFQnl;7-`;NN$0) z!zPk`P(}q+2XF;(aT!7W>5f3ZhPiri)Z0PTW_So*#F$lgtr%K?*;O4^YJtNKhhgrw zp|3vZCp+$|RaAcQi1CZM+3Wx3q)1?`CZoQ61e19VMZmX#Mn@&(?!8>$@s*025$A%F zD*)pMGlu1KqV5kQ=bp^=5Yq&8D^8_CgB_N+caBJR^2o56nxQ~R;haxvF?W-m)r`B2 z=Wf=VD#QEfA)4rT;p72~ouU+$U4RrGr=1-O5#9jWR>kJ9m_DJ}xf_VV?o@vGxuea- z-?^p_t49b0TQ?q-_21htBdiXz9vle$45Wl*RhG^rc9itp>0bYPCGyfpkUPjv0Aa#|UAg3+2BQho=&IR5P?giXH1O!%z~u1VKNeK!gUavHxC2cvcZfgjACr5s;)T$W3FE|Mp-Tq@^J*`TAyoZ zyz%uOHC*73kL-6>s9y&%o#~8C_*}X3_2?!;7}vkFrfu`NT9SB#8yx`eD5!E5{9|Ip zt}}IM#}Gn9&$~x7#K52_z^aU31)R}{Bj3G3SfKR5Z&MsymzWC-JKF-ogO;Lm>qdLd zkB=~z;n$}8Uy8VtaHo)0IEnspN@k`dRp z-$@mcaTJk-7Uvoq!+uTb1gx!lMFH+h8qVC1_c1^ZPUQBM?shb=4<3~w;@{h2QJiaT z7^rvfcd<#w78)^Ngj_JUzn+jmbd&E&b|J$9hJ4?6FmkmFh(H~4`e3Dp_5(5o_Xl%H z>p86hQcj<1)da1xQR4e|Zf*Di9Imj&By|P0f>ysbm=xZh zwhGiulhAh8T3L_gdB6UuiBPZV&mn>16|tmicLpSGGHRAp`=W>{j)b{!ztrA*rN}kYJN%vSS37V^!gY@ys`X%caMnp0l)~|oHwu`BLErIfo=qQ}O zA<#nn<(P)D%9+SRnnS3SwB$ipNzj$NT{1uO#>3oQ=AW!*^k_5Bfy3_5TRsYf*EZ}% z4@q<8?~!sAk=N?Wh5k$R9By%6Pi%xDSPM^Sy1;6_f~vJ_;{dd{kMLEYh3j&CazJGQ zI%&Ol3u5|+xr=B#pNa_j^*wtgkk~fYvVHOsBZ(>P_D3Z};1$8;!4-)Kz?5J@#Oe~y zw30~ccH0AI_-BH?SJ#hSj4Og98|(7<&;--lvC#Jr2HcvI2~Q3ML8Wk zQC$P@?S=9h6M_i*@=gyLWm&~w`29a%B7F3i|0y8MCMtn$SiEH5S5|$+xV>u6E%}wlf zm`0lxM$Za3Z7+@yoIBrt0#s+GC1EXy^xB}8+=Kus2fnO1d~Jlan+#O8jT3Rf7vL5s z3&985T(7+jo#=w!&9z__SI8|RzO6R=Hte!#=4!CHa1=sn?YApKoyyMWLe_~`);^Rd z8=%~b@A6}A45+fy@EJIq@$$j>Ex`<4-zAchGPxB!CkdEPR9poQihS{3KZ=5FY<}L7 z7+~hI^Cg@rcSU{>mtA;qTF;}g+VxgiCNwMJnAQS(2wyQCwd7}pVRrS?#nwm7e93rY z-nXLVG@ix>oZXcJ?-_=_S4`xDa6zQ`$>^M!2Hfr(>h=FkzNj9qHREP{sy%J)f=@oT?r7pJ632=Nf&qMtsTl|A{;;02jumT zVL8VPj^(qyrGdV6QVZ_-mQ~*CAWI8`<=mutF~`%xHIK{N$)mqqD`X+$C0dJME!+LX z(cqS9UZHz%gS;uPQ+9H5xKdYtt_lX~Zj=<-+-URdvQf+vZt>h{DhdF8p;DSBf$e@zI{k{z%zhR!84R@XYAm=xZUoXfhm5yJR z2!TMm=EjZE>z~oTU(Tr8c{gK5Z`J^QBOgF~(WbrSztQ!1<5K&I=E*}g1|)aeAL`z? zv~b<<8U+1ji>MnHF8HqVuL~eZzLU=jq6B;l4lXeO_wKu^x9z76f=t*AuE?IPU!UME zTDK68mA;blR%0ua0Yi>HPsH7``#LyZSrq6)QV-pSbfZH!sgBEY=w-(-usLCrohdeP z(s0-_i}Hyr|I-rJuF2jgpo6#$*WgAaPyo6Lv>wY1z^-EmGx?-E zT#K2(5tPRDAkxzUVO9NV-e|<-#p)QY)TA2(U?yDXg7cp3DUV=fL$qtR4Sl(5*C(x> z5=UQzBv1_DMH-2n6*w znP3vJBEwI@Twx&LzK#f!*t$Z0@Y;luB(KJ>0SzkKZTdoMjIkvO1Ex5tK+OXNA`5Er4_&uyTE6CjO2Q5a0b|gi z>j5d)DyU@?l8ZAvXkZZ|lGbbtaHINh45Ll(Tep3f7FG1sq3{%&dqQYci1BJ0d{_>H_(utR5QKmE)gn)*6gTeS?jiVv z5-;faEv13|Ilbj-nV97#^oAo6XGPg(McZd>oAQjF9#H*<^{?vx8+Jq@>MMjLxX1Z& zL23|N1!)oFV(6e^Y^m!z;Y6VT9t7lb3QOce%lvxS3>FY=M+go~YJF54RvR9g=;hM| z<`I)Z5Z5)e%04NGNDx~@(Aw_xW@Gf+=2S4H0T8XrhAbOO)B4Nq#~-6PU%Tt(qvI*f z7<+Ilf23oSFkL21M8?7P>Ohv54QSYoOPL_ExXDR1x>j`b6G#LZ|fC&218eY+vw z*M<8$n{ob6+mQZMc`nZNsazor;Sw6|l^e^9oE30d$@8-9cDGE{7)HjSZ=453?A6`>I;} zF>BTJqXp-KkJTU<^`JxKe^5_&AAQSX<4x3ZGk6R_j9&zr)Tvw(Dbz@ zQR~#`Hb+4PCsPY!hXz`Sdo2QE>$g&kPsvw0qtCs#vUp6h0H=LYv%nV>s{7H=&l{Hb zIxed^(dE5T9Ix8^d_uop(zaP~1riS6v>lo&?;F`$1)=F8k3?w6gzQ?{Hs#O%^IiYP zfBbj<^Qr&+-Vd+6^t1op->$|Ky>QFHUT%IMgjCz8iH<7*m1)w|9+t;h1 z?Cm&Mc}~T^Kh)d%-gim78HwX0#t-)P9N7Ebf7o$QPv0YTE6A|c_f>{zORGmPazJ^8 zO=<{1@BN3#_x_t+Oeh5|^aL*6`w#SV#5xf8za^Y$U^eLYep?TYDUIp74kXBJQaSc0 zVhw(8q6Y9y9>07*)1tW-?$_-3Lqf*>y{i=Z@<$Hr^+F#Jr27R6vr(g;_5h8>ewX|j z*L6NLV+91V61xue409KLG%R48p^|p=kce4N6_3yvjF+MigU)$UNsx8y8 z?Nzn6|F3Qx-)1>gZ_k+8-m^zUv`4eBa7)$Ow)@s)n@7ZWP47kh3Q*IyxtB0H*W zs{G6P|Mqcp^ha7Idsmg*+y4do`*Rc4_}>1n7>)LShh}&7K2UA@Ks8>8A54DbTLNlt z|L6Ahe^D!4jVaZq?w9{Sgsv%lK?J$$;Fy~HEBgfQ&ut%P&E0-*J5T++tNSV{iRiZN zT^$FURsCu~?AhD@d*11HCj0-m#=t+Qe}DHDfqO+w?a^Ni?ZB7@w735|jEi4?sxv3< z8rN(H_WoB7j7>~ly>qhv&w7(rC$EbB`u|j^TMf-uSvI_aJ9!b!CfHOj@7*Uf^*YE~xKdgBlDdc8Y7P;K97dBSV|d-i_6I)gSNI+T&vt$5J5DluQ#c0)$Q-D ze}Qk0wS14jS9{y6xqHa!|C+tH*K+RFBm&sP#2!z8FA?F@@o@uK)VmA|MLcTDUa-%f2!^M4lk?HgCMUz_ZI z`@r@+2lV3G`wwgv$lFDb!iX-L*uH1mf$cj55>vMQz;;m<3GoOqQgyeT?r!%scMAe~ z-EC8&CD0>Bg?864?Y6f$IJ>>-wz}rF{g9#_cJf=-GQ4cNRT+Ek*!Dk--wOC*BXt!R zO8@WGMDeW&eG%7QiENahh1-O<{g1Q-yhHD-uJE^JGofap?$=onQTgj$`RirnuZu5;C1{Fz`;8v{yjaA<#Ge=+ z6MHi$-~QdDHT&M@{r@81u@6+DbpG2Znyl;iDtW+veq_R_XHra_A&FHOHBJ7gKi5B! z%e=j}9{2BQfqn^Iq;;|Pd8CCzul-8$>erC-ck17NQUCsv`uDfItvl*RaS+;C`-6ky z<6@c)h5h|e`};BePKYO7xQ7D2IHZ7;+Pn5Qjn)045<-~jJUwnCHTi&5`;n~jy_W9( zp88bdm+WbHDRH!kz0cn&_P1XPUQPeZ$4o=|(H%9u;DiwV-sgAOTKLz!ZIeIqBP<4` zY#Bdb%lH9HKVs=eEd7|JAG7qQgd6dI3CsGFWqrodpRx2YOCMv7QoGMs<}+5{d9Oca zS z1xx>;rGL@Vf8Nr6-qOEf>0hz*ukAFfGR4kaov;2SEAp4D$X~JaU$OLGyR9j%^=U8u zn!Wg&`HQdHi@#|v{!aelTlV7b*o)svJ@2;c-?Hp~kg_K%`yW{LKXUZ#v8;b|2aF81 zJNcvVk^a{ws<8vxB`7CutG1ioj_&SCjdBm5MM$F=KS+9FV!IR>{t90|vSa)fs8Q8n z_hZs=c-rGy3p{DBxctx9>ex00cipyUzqA($?Hb>qW+ukQ#A@)+&+XdhNICXHxJ z9gU5lyo`sY_yvRU3vJ?|FmJNHa5f;|%w z3(6W3FVm0z-?MfKfZaQdaeosfNj(b&8{$7Poc$9^|F)%nTj>z(ziT3`GGx7goX$@yAES^Xt_i=}U=>;00I+F^fp z*?S|auer85ZaKGE4eRx5cUbz4iSe-m_TSD*YT(*M=t)z!XJVU-qHUUMiFMNwCi|Fw zlWX5JdG|}g-5#6jUAydO$Btc6HQ)Pd{(rTt1d8{Ay}e)iktfD?OuqMrE+XFhhJG=b zzTyA3CoQ(evHiZ05^l;-NX@`h-}}Z+NlO*SG^J@QJYJ&id%~J+jIM7?97LPF!|l{$ z8GWNPh`zC-=~R+_Uyl~CBEKPizxOfpG7TkI{CmIR=zi~4OyIjR@ZPUHHZIHM=b~c# zqAV0+Rimx{1MIZq^*6S??~b1ICynI;n6vfIv{ZT6l?qI{F8WW?`wxx_mbE89u>P+` zzMJ>f|Ej6XdJneha{JUt){8a&BhnEf&-#8{U09#r)hhwe0>`v?)Hy0mZQJ8@_n-mr zvwr$&Py_=SX#w2gsW_qwCi~K!*;*NmLXW4oN#1Hg#?u^=dc48+P zNPBJFqYg@=d+a|D{FlLZfPy~ z94UJb+1NV_W~ZrK^s`L{&fdqQWlVl;zy5Da>!2;CgJP%X$~DvZ+C7$gkFjxe^{w5v ziPMUs8~<9Pb*p@@6}#8cAG7qwEd79`A2>h0Z|~X(#xiE|i$AyUN3!CY{2=;cOVl|4 zkCH9ddb{`|sU#HeM*_ruYDKfwcE9bJzvMsPthvcI|AdH(Wp_XWZ2s+<*rmbUDnm%Q zBHjA^Ej${)jp}%{8L|&}_id6~nmE~N2oEJrl17rC&>JGchV#N6fIA{K`L;3{ruKoz?b<1M(xNq`~sM!GiMp zmH$&6VitO;&gp@x@7j`>wBF@I*~hxlPjBDBTcGzWXU`tk!jzS-c^+?fLf`IqtKVmt zN(!-RtK#H})jl*M8Z5B7u=5?N~&=k$LcxR6~h8v2#Tgkf4HOv9nsEq$SR zm>_9fNfT4UFCr5^5-Z;?eMB_#0h#?6KOgD|zD50CXi*uaTi}S2m>8)mrl=plqXTt~ zso=zfqrqxk+%1NBpy6%;9qG4vU}EPTywmBRJ@vbiu&`finz1~|Z^4wEf&@=NBJYY6PC=ENh!mvo z7T!RDH*yN6aDr2i$>;m~-Sh6fuU|_7N%nZ5b?-Uno_?d;Qr1gMzzhAptz&hlx_!-?SzfPgdoQ zb5|s{L}=kvvML>5p46Nindq&@Q$NP}qSDX=O*{iyr+$KcQD?Q{N${h|EarYdO2BcD zmR6W}bu4a94}wqGsIrCA)X>EPi@j`k7`j3Ny7a_eRK^1aO64A=cIR+qqL1QAnFx;} z4YEK((BRQtO!7xT2GR`Y{xR9u=nVs?6TA_SY7eA82tCD9Z(DS8KUgE=I3&aj$)v)Z zYd*}Bhtzq~2gTfPF2N>mDuh5SRz&UWy1yR_8~_ymIQBz-g3dcMjVYK?cpFUyhb{~zt7I5LyESc&0@UY+;V5Hv z)=YKB@P1dowACL%0!iu$Xg|H87WNONv6B52#G^^!%0R!*1a^{BQ>M+(0MSGKgWo0d z>LxP9mXDgS{HEpgBu&XSfk9zixHH{3AdA2Zdl)crutE@7!wTc2yBmrsH22q<-!e1! zTi75|Kg*sfOjEB*4>Z5UfP24UL&p+IYs-|iyAfdN(<*WI&^uLXbLv)y3Qflh{4|s= zl0vWVy`@(v{i`{(h3DmkJwxN|{)LpE!ep@C>!eIbETfqTGi0r41KmxY?Y+xO?5?IS zSUqciqG-NKNq;0Q@Os!Vcopfs_ja27)LGGzN(YSd>XM0G70&I}``e!Or@Oj(Ho*1lqIN@pTL5Bb+DLab`c7!{oiSOr zdv{TuHqh*pRkauU`UMe&1Xr@k3=sxRAyw5)RF$CR>8Ix4gX(Fo4*P>tRwLcj|I?x8 zr`5C9X{2>@SDhb(IzPzjOr>>nSDkMMbbh+E$A zo|PJ;(C(|li^Wsv)1frcKVbM@fQp&=xoHi&!shEp9$ks>H($qdh^Kx*f(_gSY8cR*Z(Q=WnB|ut%^hC=ABV>qt48LWYvHR{N*c{ZFO7>62AQ4_8sq@zgKv z`EEKkV8$Z0$3A0a3<4N6LG)qz_-*0LCizns)IfSQ2bBOY@GQQ2iT5%pnFKNU6KR;~ zlBU_D3;IWqc(RTeNv&&2z$IvtjiYF|s#$zw$|G5BQX!EzDV4`<(>KA%h?5Q4j-~V) zppJgF;*`}tJ1_>sn`;T1eeCIB3t*37Cz7PB{ii3*-DD*;lRgy7^r-X#H``+6Zdz-4 zl&3cRjk0LG29~6_h$l8YV}u9EU?r{6E^6+!)!Z11;bo`B(>1ypuT3u&&@wCKr2vhu zk?hgE2h6xsM7P~@joQg#)vl!a!nfbe5zpBERS|9=N|9KtbxoC3&#iF!H2KWfKm|am z{6DNPcCD)5pII`=_0Y{YE5Y!30N7w>9MW{Z|3YamMF=je_CxF3v?X$^c?C|hRxXD`=rv&Tf=4Jt0%>cIK{)Df>DOc*pI_zEMGoc zi7CrWuHdQzF=~JMzlCViW)}5>z4WZHuNmyPM@uuM9bSo$KSwxNS~|9wF9hp zb2I-C^kRy=PmyHBoiyPFV?130yNA0P5I>^9-lrsv_C5s}i1+tCH6YGL8i(qxnY}#M*ZS{jdun~OBv}b^_`u^NNG{LcGpchj8 zF3V@Lm-p%`s-m8L?ai{$4Xtaq>2ow(vfk_!AthH>BZ`D#oBoWtay0s`kTD107@jb= z<=C|{ysHcA@sfoD43#U}opx@sC!MYpwRcMhO`or34jZ10NNg)M5_~IrWxPH@fQA*J zm))FQiP%;d)8Q7RuJ|(YeG_0LGc-`x~mDUOOcf4*gs)onXOih`0 z$;e4xXeW>MzDE`-dXzBT09QfVcoY=M|3XGpP#|T*1WB#~y|rX5C=gL3#9nJ!Ho}i_ z^FgJ)Y$*moj@Rqw5uI)B@|BO9jd8>c{6STgyO!KAF15AygLsC(jr`~j`5Qt8Q%B-h z!XR1Si^(@BkpqRm7)ZTz+ab9krI_YMCykBJwJBB;!!)6xqFaitXi~`yLTNIpotNYW zVt`-Pc8UnuBIq?9QNBvlBJq=~XFk~UadN97^ zoDvl`vH8-Hsg?CwmD~l_$QKhx?OFIM!Wxd& z1|Yd))GEx3RN|SjfaXy*4Mv53ZGu<=WtWI);+aL(nMnHzJ9+RyO;H2f_{ZdgM>;^p z!f-0b-0ljY3&S*LZtcp47>fb__$+mW3nq1&2BL#v`icHBH%mBEI z4J_xjsw@Gjpu{0R3pS!WP3@?Nxin?&*jx@sVhMfi1Tm(C(K!Qz(6b2BRav|#PB@`9 zQZLtNQ!GwnJRX-#NeBubQSty>Pjc13FhcAZ3IIqP>`WRbfZM^tB5&i3nn>?K$)3iH zNuUQlgCscsTYyk^X*Xzd3JtU_>+lJ&n8 zB*apw{#5%&Gl0`vgt4M-td zw#-H)tdJ0BNKz~ztbb;xaR$`fxs9?ol9jn~j)$7`T)v9nW3t?Wc(uk6F>;zdq;zeW zT^ld^?Xch8Fp60(VY~+93)nTk%aYq7G(R~0J+VEprZ#KiBtoSu)-g0t0S0n^Wh9fC zo4ZAo&CSeFOAPsWb*8U;^Mf>zcxc}0aNbVy9RoUWHnUpov4)`Q=DR71++$6&RTL)^ z1j6H_&ZEU<)yV!z7SVb}TO@I^1`Y(kHOe%JB@VfJMEgMeVAXJYJ$f|R?O68(>0Amuvla8W-!fAHcL}-E zHyDa{OSR8j2{I8rNmECa$+K?j%~LXYY}$WSoLng^A7i`D&!8z)#mvOc97ARq=&9TX zon%w51}>UhG*D3-^fFUem%(9|5&w3sK}lUEmpXaXD4GoFfBMTvP}#zMrL}LCfW^>w&Jz~4H9-zQy!GwrN zzAcmEI}p^FhZdSg;)LR~&0@oIXX#m#=IVwnRD2-oA{56G zAq7b4h}8fUE4mWAVxoIPZZs=1}UY+wQRB^(CS7G825yJ2?P z6f0|%-uNR=c#IVRq3TQ1z7U=j92~wCTBu})cL|C#w@}covUFgCC3uhCt)+FIt6j73 zPU8pVdRPwlKzb;7RtI*fcoFa=)+sDEYyf0kO7KGS&3cZD1Kdw}j=PuHC-6PBIb z4ON}FrLAH-nzh_^x-pGsZZVs7<`!qLnGGq)&)kvJ2E(iZyuR^Jrt^ zt7JK#RWP=m5MKxfn&#qK@}l&Vfz57?C;gfRlZ}(xX)1nZtVf&7gbhkdWyj>~BD0fB z8J35K#Ccgyu(k~&KGmRR|K^6b@^n9muvifmq++x zw>Hf$l#p@p)`nDqG+B1m0LNz<@3Gg4zO#1Xf!8_VVf*lDiG^I)o$Xd%Ut&2FQqh1CkJ^@9)!3W13sT;f zPc%9re^6e50uPAURN*ET=zEf>O{VT_@__ipu&3e&+&+-sCY`*UqhRp{I$BHIwl1r3 zgKTUW|DjOKZBK=anLdIaVFBlX5d#ZHC+3g0Z7mx7oW5apOsz zXun*eJtk5{z9+j>y>T$*>|~dqR2V1OC6q~1Sdr;DE0UYL%M8R_K}qfEjR08Dp=$M_ z0gh);18t%(50N65A4bILc5VW~td93!R1&K0sZBpdB$6`)m9X`zMuHTXJssFEWv0xh6tqQ}hI+@^iRxgx$+0C?%VuS@gBsk`cArc&1_T{D%g(+yKC%W! z*)FQt2}?C#}TBnOM-Cbw01FimMyl7qrKosuG&8qe%>SjjpWwX;aPbVAlhqC$<* zWh0d?+l(#jOjt6qP_JL7_nQM&OP>6FxNqh`ncs*SQ-*Yqf@LzI9A6HNQ7BeH%qi8p zyn@AWEG6feUFJAkeok;EO&W^=te?iAU;`~1mv4`d$j?0+PBNA!jo_BeaDWYY7tX3e zPc{|#@0Jjnccm}kxZ{}|l=_eY*r)S@m@TA)4Xf(SlAomQ%_`h?cIqJq!pMkIdN`HS zA|+SL?P}tgWM8^u8igg(s2Wa=WU}w~U1MX);XHRRBVZBJNVS5w+RXaisX0rKP3bA^21f&rC71b_cxF(;JrFaTZRq z3ilZ^Jlc{~(oLmQWg0TB%bQ=A;FXe$q^SCRRU z71t`(k{lz*?spyJn>lDvTHCkN$rTknVMU6XkxZjzGf!G!b)X-MMg9$!Nsr0%mZ!z- z(|e6~Q&A`I{fu_HbXA(;+IsIKP7Yb2UUwj^n6w1-A^yz0q%j~;*Av$C8EawhLCicC zx;box&sjHzt=jWe^1P*ekVCmMw>Ez)Sk(M4)TmWrV}V@DqMEJ2G*`nA0gaNFq7b`t z4hRp>)8UApfP{xbFmVnN^biBd7&HuJqSbZm zw`FSA^_ra9JTiBWP2kF`j+2*IP{SANdzf{A0m&Z?_S-M0xoiMg(OPVXthLmI2DeT~ zfB^ac#c7rF$fy<{SalKkFNf8!{h^tc zwY;qh{g2flVI`NuE&W-^C0dN+hzS`@Ypu zbIe#k3G4o7pfiwmq(~G;ec`8{PVe8VtG}Otif+1H?jTWNxZD=RLQZYwodASG_Kx9d8nY=* z49dpaR_)zT?U+sAT?(P3rK#IgLvo4*=pT!qh8B}H+=aQS*GFCKXr&tJ*aWmyR9DIS zdeFjdd$^9RRfgSqEjwFPfElls8FPHz3m;a;Wi}JiIyMe=ruLK7$87s8$WX;vu*=6z zZmx^bVz#HwK?&Yz)p32?a9$;kO85cF_AAR>+e<3Om(rotUVq9V(+=P&#h&|%*@0rV zubAycq&hBUiw}m1*%7^@iuckn^q^)j=ztB*c{;2{!zz{&-{S3BYS!^hc9?Gf~YO*_;1Q*X<^~ZZF(5jL#H-m)#DzB7~Z31 z53j!+K$`F#jW1wn%)+q-8Z7O-k+ax@Ysn|MC z?_Y3&nRonnQKwwi2MLxBa0Cj<@H&1xIxSGCAJtXBTgP^wSZ$|o7TL5`(ht!R@3~GO zj-t4=ia2X)dE8n}lD{zYN;cAwH?LGjhw^WGbEa3N{w5(?{Px}rJyxqdu8+-Tb7Qo1 z9&pK$B_VReN;!=7V6?P&W!T+ltqk<)z@6WA7(~L}r8}IW^FY-k%i8)55g=2Je3yf> zUdwgx8%s8Qtz|8SmtJpq9|6j;)V0HEuLHK$f|>C?&gP_;fz?vFZmkv2tz+@j1l8>f zXzLd4tUua((hlG}6Sr=ceb8EuePA09FB%XxsJykFs$Bic3a$0pcxXOj)xT`lTVWD! zrN|03t%o1c3QD+Dl+aqw8S}XHWyDByOXIER?Z+7*>z)(DUCG}Xu zaUJSm2{4&?jv8l4MhRC)p0u~=)h!~05eN)T5_~{>5kql<4}#;(BD%P(B(Y2a=eAx| zDMH6GFoeP%tQ9!nN?(d+XzfNLRL89RQXP*UiHHcBh9hH-nuSNrP*11jtwXA76zs-H zEpW2|knO2A8)KY<09KWIj7`s&t4fR@HbM{rDp_m1`V0(F<#^m$Gd^_gC4KKr$u==j zS*n^Q<#;3K8*Da`=yr-Ea5cg$Bv zI}lGipm!+@(q7%FDCl?(cAO}EPYLm+oFG-!nc^{n^f~8(2ineQ>(RLN=umoQlq7&k zvUmb5*?QFG`6!X>xbbY{8jM>{#;vCq zEH@I8)`$V8#^n7oe5MB)`)1sFf>FiowqA=7!``u$l9;iC+jo5k>`slqe}Xd=1%RMK zK?1=J2dRSiO?B)WDyVk*k_fNgz$8t@8iznH?H^ToL>IkXs<)j~I*Ucjjn`ymEeO<- zU+o|R3EN#Mc(x}aZR?s=ij|Q#N|VCJ_-soBXwM!Pvh5x;jz=GPOn0=nZs4ri6w+L; zSF`+6OZc-cwbol0!sC6i&iE73X0KC~=EE#Txo;FQ z;y^Nh%1+USYU^7=%p!el)86!ag`-TB5iz4G>OcE%0xcM&*Jg#(hk=JQ~L*ghNZt!LXUuMaKJ z;OIBDz`4mFg;v&E-y1>=Hqo?cuEwmFJ-a15gRfiP$J4NmtGqDKyU<@e;x!}56Pt6& z(|mG(vqxnZvGv1JnbT+lXY@uck9RYw48Z9%N^r_DeFW+`D7~6)B)X<EV zVE#Zjox&oId6|n3MA-8(-U9D9%|2+|A|XAa9rLtsOj}9%!U06!|FKWd)5GF2MJ+C$ zLYsb28#->)6DEe7+>{PCo}>k)K1FX74G`oI&FEFR$CxWUX*-D{Yv?mH+0;XJ-DfNO z1Fi7XT3z>?Z`TW~{FTMf>GUJ)Svb)&USJbu`Vl>wUZxdjy&AV(k6S2=-POpFCs#sS45~;ukE=8 znqSf%^^}%WkZ-#6RifS!?VWx0tQDEHehMS+S!?9e`YCTL4gzXz_A9=$)7Pa-JAIuM z)Mjs|03slf)=)T>f_VBMD@Jj6IUl>2^kp;>JOl~#Z`O7L^ zq^hZfCLu)WTMQ``071I+)7N3oFmYVB+1q7AOdoI@>y(tR`XMvp3?~&30*VQ>o{n3; ztnIlig>Y(>L#XdY8Qsbs66jN=pSecx>2SGUf*+S^8`ifblnz63N}OIB;Kf^mqs|Vg z(pd=-Ol2Z|rzuP5jmpu9N;rUxM8jB~@<6X*zO$Pws#GTA-d`#AkHVT$eeluLlUBZf zD)~H6PZ8E_-k_6@o`PhjMhQyW@yd3?8qbR*iiE~{HshA#qEFStqs<#q(izj+J7vyS z@v?7aOnd+q^lAr;RUfyPx~CRrP_;*ir_Q#6Ej+ZdS@}wur%%H77_5#(($YCoAx*)+ zytip|*t~(SVQH4#hU4&$VFjEnk^?q-mt{$8wS;=~BB3^iCFy!%c@(p?qHKF{aung5T52LQtg)jB3bY zNJUOB(@iT}a9;L&BjR^%p8CAyavJnG#lyhA0Us4M}pH+YPdvb&@vW>mQ*6 zdCzwYgAgD`FD7I*{r14rg#^iY8D z;sU1iqS$`woZ1wh{u10(I~>KyI@6;Ti#4mlVQjs^?4&v&!IkXJKo;A$0P+QhqEMkSpk>+Nc?dr04t zph(!8TC0RcG=5nU&*%+JrS+8vFSHXF)Ugv7syno@Oe|I3^D7PO zgE%VVo0cX78!zOF>U_mRLyWWKoeg3NGgoVZml0G;2XeAnfRd}TEbXaKMaFoc)_Htz zk)9qe)GAh4InGDKR7LLNhp1A`m5&=-P-~t~P0*&Vt@zCCMx6i$4!|l2nCAIHDQ(z0 zQp-K7aPQ`f+wL+(x+YUcqpk13xCel0Umpe2k)7gvVy zt_+0$aivdEUs+TO-9F?a7wJl3f?fH!fdv}4M-kQxI!g<+5Q>kf>n}?^b7soOYeIhv zxW)(M-7%}~1NMXpeE)4t05jj}x)enO6a+*%aBhC|ye_R{(be{9=IQ{+_2&=p4r%ul zpQmS9Z3rN32yimohVur7)K$J&cRI>7x+SFP^_I}?2Tz*<3{2uK=ljAWau}n=)-KcZVGH0E8*LBpY!71r{q_{L`f*^}8R|3gu3Y-T z&|!mvvc7Cr`@k`U%gmo{$uN|B(AgDs9wz zyY^Fc7vF8KS8~Z3=7D75-z`*}od<1He5O$G(fKPr_sMK%y-_pIz|ZHZxoqqT-=UPA z6e63ar^C+92ir6hQ1%jEEQ3VS2cqTh}9{yD(~$LiAqR}gv1yYyPYd~$jufzgY{6=zZ8fa6JFs`;Dvg` zeufA*mh(sYI3<=H=_AwetZMY4s434vd{jqw!Ov5jDBL>{09)o#Hm%VqgF>zI0>|(j zz0`tus^f;#S@~)5C6Cot6RJDDdbdBpegHcOv&;k$_ z(WwS@MOm4RlBn{qc;A$F`G#}_UORoLdv>1C;O7{jpZGgy!=ZI`Lck7g`0+d28?^(B zkQYrjH`o${PLMqHlZ5^juFet~{3)n5lfnr?J;f=~AQrOVP@#&9Rgy!F@*Kivo-*y6 z94hc+u<0{~r7X{Cbpk00Nm( zxAMO1aiTR--q()Fq4od2^F@&wy`twzNJ5aJ2|YxR~~JVIUiitE93;l zV0DC=J=2ei(3q2>YBSr55YUMmJ`6-`n0{MhJe8GY*!EFoM-bb3wn&BY(O%_S7ivC+ z{?P;9&eKybUxZJta?XiyFhYkAePfe^wOiuE+M2NEX_vMoF*}hyy4)XGb$y*y-Cb#A zFNI#tORHYz9Aj0Nr=YH*%sX7k{x~9xZ&yekSiF{lm6Ffcrqf%Aqb;z=TW$6&z8J(t z%z~b4*o#?GsUjAuOSqKyO%8TUc=raeqbQQ5{`gtqjJ9lTE0}_!MKI;nDp>^%Fjn-T zQ2LsAgT4szRsNg5{L0N|uX=N~a^Zis`sSxE{n90kgVC}m>TN{Pz9@?N%UsCcc+*uE zM!iu~;{Rtqc;tUC|JB#_F1`Qr|HZ$bUH#Jd(egiR{{F=H?YI8Hzc~Cio0rZU_`x48 zTKs=J`-e}}F8ur9|LNiv|Igdc`Pv14yW~G!_~hTeFnVy{v!8iw_dneG!v!DS`qxMQ zmrLGSciBVNTs`p4|N8q=zq9CyzyIMc{zdEFzkTWd`J?OK{@br?`VUL~%WMAqdw2it z@5O)g^uOEud%yU1mA>1)0~i2U(nZkq@}@9Qt$Tpq^V0w4Mi=mJJ^y=3zf^iIKcRPS zbRGYn%kLte%P-z-OH=xNwH48|h5x@8l|TH)-Uk_>_aFc9AOEmd1NIV7<1n5s1G-dn z;dolqJEF^wF2lNv>QdEZfi7dZ)O1;=%VoO6x-8UXkuHmMIZKyM=(0qYvvv8TE}zn+ zuFJSCOLh4zT_$unN0;B$<?`bom`!&ei2SUC!si$3<5MBwb(#x&YK{0yRR+ z=M5>J2OZrI()-k3)64fhUygdUA=|qRUeq7s~;*n>)I&$RbBr@$=ms5 z+9mnob?NV^=|Q3XdVZ{IdvtqrQS@gwv5NZ5HT^Q-3j2-U&fgalh-(dC{b+9Z^>UTX zEzOVkmDAhx4g6lLez$isa9fC%P9gC0hE0Fy{-zhEP z{M`!A8%`(0fjUkJzn$=gP6h30#cxJ%rxm|hx2GNAjEYYy#96n3_@A9linxj2OT5pd z&nCo~ew*@+Guyppa9WXb9dcs_KX2~PpH}1)yB6eMJr(54mDb&U5?4y$_EQ=~mO8)qG}0v{Y6^`0;uXv3@4ne^^>SHXGk$J={s5etlQJOMlnNP4#Me z)lbw<+E1VQ@4UN#(OKFJpPFJNz`tlaecWq+NLcs}whsA^VQ+)`mg-khH&LGby7N|y z6E|vhL}Nn8HvnXdp=ML`+xk)8@UzwTM8zMK_1@3x)@8Sf9i8ups@oXn9{x#NZ&P-o z{jjZPC-f_~ciK|um%9G~$n|up5LUi{z3V?bzY)+Mh^iX^ zATzcq`rYUqbUAV@)z!1$xpclhuc1dr-~*BWT5$eX*89DvvLWTvp_^^WvU01}lgx;; z`X@Pr?}&yz%`->I*r!>Lds(^gYv*+pgkOKZz+laO`24I-gG^ys&3DkJ%-+q>icgc- z0(l6b;`BRtAjmK1TD|gzknuL=e&byR<91w{&+`A*X(ce^Gu*@dex8bs?xsf(--;B} z&oZ!B`s>sYY&)#&4y(&gV)A=WrQT9ssnOeDy-NKhz5-erEb&d?(nx8vROOt^SgBTu zOaEBNS9Nt>R-dJMPC~|C`K3S+{<+D1<5-BVQot9fkf8xL>#b{XQI2iNsD(@ z0H}8tz+A)9Z>M8PRShnAre7=% z(qKjOm%qxv^5E=<{`1o}^jgsBl0-BMP&NrzqBFN=ATZZcxa_e9J`W=DB@RHp5HQF&+7`wi;!Ptt62)V~XW?)2Nv zXiT}C(Wfy?9Z-8b8I^ZMHqJ83C5Zo(}1&8g{oA9*1~p2~!^mT|p;wA*dc zx*GG`=syF7-P{{9MVMCF^Q&1Tk;~oSOABy6ZBBmN4K|z2w3Rb;599wCeVhoAuNMKi z$N>2g9Y`+bF;wV!2_TrQ;O&3AF zyb)hlUim36w6-WG>jrgbZCs8nA5=x;A z_4qaNH&XspMpmHUE@OFz#7EQirhB^iF+U1RI!T2P-0?>%qOQB}2=iOcoTqtO!Ad*&E{bd3sV-1P&KnsdL$zzn8q=15? zn7h~_eKDiLQTOpwY0->=lc9B>6AvdT*qud)Cvxh=Sxa>6E1{s2)UPo`it5`cX)GBPQWS zaHWl=&w?-CpO7@yT4eFs&lbamRc7*Z9zT(=sc0M^8*QQE7%BKD#Uj+BLKv{gc zgR<`W-YGjzQF&usoaY++*8x?ad#HS(h$+{$A0MWVLs`P$|*cM|0xBc)^Nl z{Hr|F7vdbM#>uU#;0rufr2hPqkfD8lHPXf8E$TiLl%wzFL(qkIiC zlhZG2J4Y?9LzsQH8JtLpclMmkC&=8!kv#q`LKbWEPJ5#}XUxT4ka5!ez9W|Lq5H!R zK$o%)v)KrzH$%5uO^00zJj6?q3au-^c%Mfyut`*mS7brrJZr8C`saX0*Am zy;husI6J`gF=p_ui!*SVKGik(5-=4b=0ym@N^QjU2>zxl<*t?NIYZ z#?%o6$!p1Cm)OBV3$jg=t$9gz`A%_|rSKqMM6DI_61TZ^l*f?xA&e$(#XYeg|79x` z{gZrKX$$Eb!8Ae5u-4gJi(Hm(n}zDoZU>84bp0P>K_?6w7%j+#0D-*1&Bz2)hy&37z`)bguLLDOM-JYY5#3Z^#cTDd#jXKW^sC z;K@9WFHU{QkIQRoz_u)nuK}TW-Tn2QCSi3PM7EGT5ZTdg%d&QRzs&I%4>i; zy>X7?*bMX5gi9$i~@_K|Pjoqv9_5UGemUJ6W@_EL1G(ZPwX_d4-0S4RKSpZ`{7 zoIn4uBD%4-^sYeXPR;jQ0z+p?A_$MaFr}hk6{k4!U9L(snygfpEx|@8S~w!{5Eb&R z9*>aSQS8i>&P|A_yn#^cID;h^6%t_?%thi~5p69F;hxg*hA4KB`S^+^XM<<-B`|!0 z9NJ2Xqq&rqZJCd%3mZXKW&H%{D-7zTF-d9ns`BGz(!N{lN%7W3!4FxLMtSr69hNm% zv%y!*N30Yv5C^%ezmFMu1YP@DzLL`U9^KDuTy4br_Hk%=r`go9?lq%={kf-ztFU!= z{2oMvA(}7$AdjU$z}YGV5;-1$G~O@5;S%@eHpzP*8=!EfZLMZzyZ_Ud3K?s-y%=D} zk6Kckxl6)ZINY!@x{NKT7Vl;TUow}&g1G8hio;pBjr0u;V`t@vo0rs zw{@~nhl%JssC5H=+xZ>7;_)I7-C6}7IlmKm5gg=#^Vf-);B#gEUf5&EC{;AtZB{3a zWpry5aMAd;c`6ZYNJ5^<`eyto(Vf8`qDbAKImJ2rx5YWQqB#?DI5TU|{Np10uEivY zvKMcH)h4>gq?M%ZnU+z0qCwtgkiaLS;X1X@se2+PGb;M=ts*Wn9sTRWrQYJvAsNZ5 z&S=od%xW$!n`6aUx)T=k?+W(soWI={)IMF1CxI&z*O82#G)<`UA@U&gHk(#D>;S5# zi)|;cTQnkA7+Tx4*fUNcF6E2;h4{<8*jUmHdJ!PJtt6~S=gVf2b>K&bGAZKFtV*Hq z-c>Ij8A00>cE2w{%efr$7-J@dq@_G!ce?l{U?Jm^Y_tv7Fmg`Crw+N!Za5!lmpp45 z_WrYd>QnXHHP2wLhgd6k8YxoFN7+FQ{NKH2X^k*qh5_OGx2M-MHpldKG51 zSEZ<(>~G(1%Pi7>@#EpR@jn-_(HUzNMf(b#yk+F|i++YUdMS`Vc!5zB25{RQVT1S&5x!g=ID4?A<@%RQUQD(Cjok4N=ckIcv45xK?f?{t1w2p2Zl? zmK;C2>JfH64xHJHij=N{4`HLKc#PUN0<&O)LLf4Ld{s4bxt@ag_=knG`r7Icu0NZj zfbQ!bw&A1(vZG0ugB|k9&B1QRB}Cz!2ag10MuqcpStobSe`s+2K4d=lT8T=vg8A(~ zm&?WA&!uVb=SCp^RRy3jBWHg82kW`5J-L+bR0bDDQZ1Nz^Q~s_pq&RG#gE0vVHQlg zpJ!UZz~ABJU3XjLI2T7!&A`7Ql$^m;bR#r_5WDoCb5^sn-}yG4x>20u%1&mabL>77 z>A@k=k|3Qraj1*L5RDXNh9riJ_h1O9zf5|DKHCRP{@+ZdXqL_$AAg-P38Nt5y{v~I z3;~}^#wytAvy?pW(35JqoDi)CNP|W2@n(PAx&K{p?(RZ$Tc^2{GnZmyq-J6hvrn)#<#cql_xnLl9kfmVRQLhOw{5Qw9IRL=0JSsUpCO%giXq9wQq)! zPe$(@&x!P-blr{?1bZOE?;Kp+Rm7D$HNWY&k|iW;2mWyzOp;UDTs#yU{&NeVg?v3< zuTVGGyE?S@(J(EPRW7= z8IPP8OF>ID-YjD2RIP@S(TsB~hP>{d>t)PuGlaG7rZt1d*!cg7GYlK9AJ;C*IOF&_ z(=o9Y$tMZ$YqT1U73Y7d7E?ESV?MjEh=WcY`0*^H6WE9E6ld!;(#PlelcneGGd+`Z z-TXpvrl)Fc{nK98{I=ZOgXMv;0?!v~=i>mOrU&PnpD*I@RIRX&g2P{(&s4-l=V_aO zk&lYI#@}bSQ&iREitO>uk5kRv(m5Hf`gqcznb z>Wl<>m|w@?7_Rz&v|QQ&50cNBD-ZVjqnVqneq+9?$Bugufh#1e&{RI3BtSa-{-Lw-d{So8C=8i&4th1g)k%S zA{IXwAcheE2$K2X%jTf)WIoK~t2AdGx$uEj!VRI5o5yvG5O%Cq5Z2MGLdY*OKs$E? zgxm+sU7>ZyV0Y>)V)6`OF=tK*i>@+G4$5w|I+?gAEYHjwvVgY4 zn}R8F8FiAU7~W@1a>lb}>q4{JJc@8<9Ctr`>l2KDS`-|2$GEs!?)GPNUknsv0m4iq zsw_AF+4&z2^2*Wn%@f_{a^PJ0bNB+!1ZCJbT%<`49you=-M)uldzfFICfyYe%A>oK z3bHhe86@WER(ymTE-%jFqsaXe$seusHOA!%(1?ygkh(jS%->%K^|%y~bnLcK)G6!o z!C1Y;Dy`6svhFZ-8eqGcnkT1%!CubLz7&dc4c5)nyO*;vzLj$iP$-0T^5YbZiB8<< z)T{aumpEnnSDSUd_TUrLO~mD}Wx}tMn0K`I88UY9V@!VfA$#tk zG3@B8#~{>P{LeKQ90yVX{-tVRGVGa#-C7?df53@3!YGr#TT`bqkTwtY%QL zzRKBaTE0(}&A>n5vcvY){R>e+*kxmfHMzqCqL?#?r!bR1(?M}Haxdgv$_n}V9}h}D zj;6hh2N=bV!)r(FOhei%n2#5yJGtG&;GHI@v{RVhvz!})=`?*-u=6*+diZGOu67kq zWM*r10;aVWB)$*l61u67jdNTDQJ;^ZvlzYuoV~2+3ejH|KK{vpwK=h_<6HU9jLe1P z0!Hd|T6RSFgJGg1H%w1nIkLxKiE*DA5oZF5UTnDaqSd>9B z-PhI?x^_yPc4fF`ujm$KNfC;<>z9{tl5PHJxxy=#Qq->S=Pq^tVSZmY2+Uv|=k`t2 zu{*J%2B+MxqH`fFn&iO{RQ>H}eLuaFX$ADhf0d`ZRjiUgQAk3&eA4n^tk74tG4uG7 zJ`Kl-Gc!4ZAb)Zv^qB=#GX0csPbYHzq6l*Eprx+D4>)LfWit73JU>7-KlU@0c5^}X zC9H}AH?J*@>!RnXbQFnIAx(=kpUs^a8o^MILKDK~vZhYb`ss9$uzQUDWviQ5$YLaA zF2$X9QYyw-B+Sx9(fNff>x|_1H3i=H5mt+FBscf;U7a1g2NcX#kytRz^veMgd`axf zd?{rey);)8@#x<6Zz>*7AHITF)rqhC7b7GL+^@ZswFvJI_z@SGazQ}IB#~z}*W?UJ zA!Dyj10|!jz@BqgJ%7XjA@W>)MYYv0n(78&-mDY6;#W5yq>gt%^Lg>GkvWJvGJ*B` zAssm-B1jj8VRrfOku1}^xXgaXM4xxj4E*~6*%EdO-vwxb>b$)O zjBAH;ky}Eye=AH9_2fT=-07?~-Ybp}-c4|quQPJvGPc|C#~{-Km+b&mMfWgU)-3+k zjXa9RjJt3iA#{EVj=nUM-gNR0QHyKz#*eN4w25JDh%e{Accd5r6ZqtgjfV<-abjh6~-GTJq8^ zsDiu+-YNZLE2vCg4VF$;`_N7{hopuFrt;y0e2+mnxXK9h<@3w8{(~aeE}p}$l?8nh zO!c|yyfIa5??(8ES5JN7oLgxw%Nq_or)6S#w#VO1uZ38ETcNR6KhY*@y$&>Tv z(zj!;MtWv}&Y}bor|K6$)}W)67J-EyoXhLhU{w?sE|dnclibbpad?{Fo)D4x27>>b zfSZEqH5iedvZPzcI`o`L37MmFzfh6M&CnwA$b(D?w!5(H25IoCLyaKizg|S{{EkzY zu%B!W5qF(44$+SjNrbQFhgy9c4@h>|#~ipX{JV=nV{mt|5t^DD+qRT_w)tuT`!?p*V9n~TUw@moo{ zwcMTk70=yDNqBlK>Qei0!M*In=iFF1`26QZ80ObrH=D@um~?kI@-;pdEdO^A7I$O1 z;bX1<>b7QAK`}Z4;n>nzd30T&pKI8GScPztxC#d&f-vlKHB?8!HZNl4-}2Tt{@X|a z|HVDLKm|c)um=CCIPc7H$o4ecQRy{8GMgkb=09$dY4`a)+)jwBHxJ`w zsW{1xoxv8k{Y1LeZH^||zxR{PMQ?g4 zYM>vV-551@7O_xtIDFM_0_ztL`PaQ$?6|ulQpD9Q^PCf&*;@nmz{!d`74=Jo+iV@L`p7H! zpBCmD&lfTO(Tr0WOyXw!&X@RDa#)6j^po$O2dP%n)ZH|6keVT;*6pqMP$%fu{0A>( zxX-U&^ZYJYyBpwn!_+N>y!^|Xy`q8}nQayomC>r&-A*Qp5`Ak$x;wn@T$Bh!TJ_U5 zezYo+1o~{2|KQa9rm^(V>C5>i3Gq4pHU3R;HC@+l_*k)JtzgD6;r+J@kdwtXMZ?by zxfT`{I(Pi%+JxHMY+hG{wHVS2@<-m)Af6|!-=BIkMli*ZX0L{`}uya z+yez?)wjDcI*0C2W#^2!5C`hctjg{-X{Z;tpz+-zCOu3VRz28`8rvzaGsyQRId|@Q zFs0vVlRN02HdlK^;6F&u$fBGa0B+5`U2!8I* z)>I?8CMk~Op$+#iGT9RP-;q+9Fq%gv==VJDK#Tf0h@IvWW-F4-z4)z_pn2`X$GNj_g2DB` z>4c#(03#`yg>PjSD5vcv9g)zFrMX4W$rt%gGz(JK0w;#_rsz+wk6i`}Q;MIsSK%_& zrMmlNzS0W*%-!tL36(p5&^Lgb66Im!@qOCn`b?2SPJA}W?Uau`SJ@%j{yXv9f(>#U zTFM3ewL&hd&%_D^pZfH`oqtRHa|8}u><0ztKef{Oykaaa#2tiVyav2W`9ehQ*jWVJs}ozkOKTTh}Pkm&G_$v5rRx zK31Hl11k5zyTysF0R~A^*VEmhD%Lp#s0y5LVX8~B-a}OGv-a(j45|< z=A%9RT&3t(U)Z@Hx)IlR##HiOiqaa-A5rzQ4}M5s8+`>i?y>5CWuH%`r6qj>#Nws7 zJ7{^CtSE+##Q2W}W$(AIi2gD!9xqH4XNF#PD_yW3AC*DLxJnM71!G|@Dp%xx*;#>f z*V)%VSF&w<8^$$^bh2!G*~CG9d>y3WGW-*Qw*r|7)|Hzs8 zFFFI~q7pQYPNVoy%i`}B2Zh;PICV}iyuzRp7ye-&i3159pSGJ|=Q5&#+Zxl6nVBkL z*zgtH&|4l^`J>mX+d{mXASj+a$w;@GknNm@Lo3ofv1mP>a1QhHputUS9Ly_ra|W8` zHNSwHYbpk>VXgxsLns_zk}wiYxe+GcLhB-uJvrP2$0ffVBS_tW=)M9H1Y&iG17Y)5 z38^S)t{dj87XtD5qj3swyGd}3IhSJ9@B);6&-X^QoMhy<1Gyslb7m#?MfGlgi#FT8 z>;)-d*p;DkfE%6S=paJ;*Ae}cgRhi=nA(vHf1mrd_1*kJYJ{qCu zk1SOEw6nyPNLa$A_%dxE>&#{k4DLkSe-${pDO!3pUWpE{h9A`q?}Gdh3%x%2Grc$^ zZqrbbgZ^9AQhi!k%{~A6$co%2G=-_-$%UK4K861f?)_-$`)P7N%(Q}`6x07Kvll^L zNJ_r*XPMnrkSCl7h2)C-Vb03}I2Ze|YNwZHFs+936pg-34UgkB(|G~)xM8L##cS3HlO zZWGEjowXQJO^&xSK8#Q8j1S{T+jM%V;4UaaMp+SMXLt}t*cl$g(RIh^MOToWdHOn| zLpZ9==n#&mttXGD&zW4jWR6^%D_xucFF@jGv*iM;!aw3f(S^|&8O%}jD;ms^Hg~Wg zS;jtXOFB@N^d>{sWfhc6D=6s|DvGNp_&+3tn|7sST2sliD;=3hD=3*(P|_=WGHCXz zamB6%|Jm5~NVZh|k$1o&?==6&JFJEd-Nd)7I%#LUp=T?93?SN7SQHX}j#9Xh|F4Q} zjpD2@yjIv7z0(uL{te#G;|@-uZS?}@P!`_+IUZSW{OfM+#np@`!G9lGSq|*Ypi#8v z5wo6y7~&Pn*13SK*2ncc3p*OVceQ~9($2;`ycBr{{auW6 za|!=G$3I1UH<4RO`-}P4c<)4T%GGga*MG?S3qY&jf*@bPx@9@Rd!pX{Y0SDgaw0g7 zKkNKDUIiZXiygs)TMKp+QT+|V##v_`8`nauiUaTXO~T92>BCE&Pks||(RXUfr`-qDE5Cv+(vj1DcCFP`&B#b3K0#9DR@yr>_}^)uA+iCjjmBNblN zoCq(!tU;LRM|O00D_>!mPKhXR=fA=81t8YXUfx}()Vo~seUD4y?^cu=Q#U=ZW9Q~= zD{k6+=j44`c0RD;`px%k+p=TFmV58n(Jsu&uG+ctzAbl5?%ce5V%v^8@4av9mOGYD z+`Rcd)xToZik13*`NY+eTX#<0xA}^DHc#%nZ{ybG6W34Pv31LxU)=n_hI{Yce9skk zeC~4_FS+xQOE0|a;#HehuD)z>X+wGJrn|Rnr>8An-E!x~ope{~>939PZxR2N@UPz2 zKOXN<$uj<($G_$LTiM$mC)fA)FRndMDp%}QYrGs1Z;*(0m*U30-u_zSnNWNrBo5KT z&Yu49o&j&UEIc^uJyz80iE@7r_dNn+7sEAvtX>;GDk)cMyrIi$y1b;z%ep+T%VAv( z>GE7pe|!rqo79b)@90v~gm09K~=Md`hs-j}5J^V0kB0O-*{U}=t);^q-` zb~Kc~77{Oo#PcEXV%o=8D0q%U+&rfguTuhaHQy9WXVYPGMwf@cM!c%j!!)*PlmmJ^ z&ZY4V$SW(+FgPwO#d{Z#O@yc9AugW%u03Uhgs#TNYkTW-W0!`3t?9>&pOomT*7!g} z_6`fCtIF{t1zP!Lbe2jElo!{Uk5e2^l3QD@tEc7&U{uQe{S4TIGRBAbS6x`FpIjd| zFIR;%Hr=h(G;Zz|q?cKddJBN=W#QuHCY2|PDIZd2UoKbU=7V5iB3AaQ43;<<=>^Dj z2K51fr-E8?g?c%(AO}gc8c*uU!y0!zm&OaK^RiI9yToj0$q4H-t@i~DgcdhH2ykVo zBuasO}f4juxJ3VpobiMuwAG=-ry5e3GLW96#aHy%;bD{U2j9nUF|}FmFROP^Sw%^rCYCsXS38CA40LD4Gd(x=Oys=T4pg}PkAW#$bV z|JHPT>yuWs7MQQKBy3tE>hl6MeOH&4ApKhMz6!a-ttdrtCB0X}=&keAdU-p$Qnl@} zCZoyORjPDbR?uuvt?{(#Zq{XsF56W0opw*psO$k<#43&NmHU}qt%dB0Ti?><+hm&$ zE7fi^dmUv{P)2Qb4G)x!TknM~rpdP!G4Xh6q}&e{;?_H(LOjIVdUm{TysxSp zG^<>7yic6e`hH({DA6;;%;TwLx-8elCM}+7{XmyzxlC^tIG1bG={2Qz3N*x1cL{~9 zADY&Po8K%~E5=VON<|f$x0T}Q2UYR9lo%ULTfN&#RjY_FV1n_~S2TdNO}3Sd7pHDl zkyf(xBh}cc3-m{S>X|WXv$qFermsuO;%U+U)Qm1up=@eZJ7tvhOFEqvo~Aa5gr}Z> zET@UevVDN#`j(o6>qu?^EgmH4-*juc+*pF5lJV89iO6)FE9C z>++l~&)YE9q-dFbNo6nVazq5BC7YhI`A@&5(l>N@OP4ow5w50>>hg}E@fu_N=_yL4 zuIJMFxl-$ac$Oh+vrp&(1hv_xbOEZ`?321MZfzDwYqLOAn|)rFgSrToJ!7PrpsLn* zn_+5=58Wzg4wlCIG%lQ~dyN9qTaTx;Dr$E@`b6BNrlx(ln|VNsaIZ6A^Y>-C)>p}YcawoGfUKVS^LTQvZ)0cNPR;~$@=!Q<*Y$Gvs|q<2%pIRnGGts zJ*!eRL9JOY=P%2oHSaPKMUP9z#xsp}!(E!)%uJd`5g3FAYAN)|krWycXmW^Nw1}jX zeM^_a?XtsY=hf}p5%qhd4am_rImRG{f0Al>v|Tq#z1c21rWBNe>T0KKd@Hk2Ev2@O zFm>93%;T0BiH%oF!dpv-Zq?1wxCFu!0XP7&;=I;`k@Ty^bgj!(a-}ZU>9S6JONGs@ zCfmGD=2kKqa5uZ!i0&KZel%Kb_A6AGKEP$x6yxkBlR$c6LaTX65Suc6W@TxMKB{5e z17r`)DbNbdz7|GJj#hj67f930zB4eGgJx4cG{e^>}u_XZKq+ zZhTW&Zar#T?Wq7*wFlE)9n||NtJhYlN*#N1kcVVRSqYAgm0*9SsoF|X!+--zSi1fE z5&ElFX;x>jee}zHvVW{pS{hX=W2G{;rP1(MsmBuP&kHrGr+f@Gb4Zk;46p$du(?{# zAhGcsA(dNgr2w!*nb~7}2n5}#w6HsP?Dd3dQ1^S@_Isf%32*zXw|zEk%iY^5Q68G; zq5G!*;gOMvUT%$eQkj8?atVk9V0?SLx>_|7dB#cP8Ot2<%puDh@ywAv5!B96>-Ci} z4Arr5R;X02?Hprj#z3`QCbf1AXo~a?&Sf1+eykuAsHcGMx%^C zGJPdU7<{rp5#-@vHq?2jUB^P(P|RApgD#+&ZyJJ{Z(8Op z&%9-scRcfsWon+Ok*PHoE5l8h#%q>oyk?n~JoA!ep7+f2!upsk6<1n3=jG2)9^XO< zaR`-gv&S#`;}_Lzr8Qfr$}-%8=STyKeVJ zqfUJ>Uu6QV+&nv;tgMuX2_@pnb0-F9+kmHjJZ213_uCS`Ew@``ta^^uqng*U>k_*z z*R=u}0Y!7XJ{Wj^(o&SflMc^QPytF}E8_uJye^&`Wu@1#MA*;dG&^D`B0n#JsI-83 zYK0aa@xnBznihbmO^Cc<>o#+bgc5Oj$W)X;j##ZqS&TS10k!=MA)lsH1InSyy9$h| z8lh#``WcykI@R(3kHQF2U(|zCe@5zwI=N~J32D_FwgEluQ$Cx8j<;%|gi_*(Am8cCA1*Vdz37fb>W$G^8x3_ z13eX+{*+iMRYypX9(uQq%UV@+Tn<1#!32=*%&sEjISQDkX6+fDc#2FFd-Y+*yzs)G zbRK?}nl#iNEZ5t^QOb;;(eT)82uWkNf9pmht-OL#A6cjdx7Jd+sD zKT|$DbAc{!jN%*0I}j4>KEY9+V5p=AUS*_RWu#a|55fqKkX$ z;dToaEN$CcXsev}DHkp4Q@PN~e$sh3l=n7+g*L^UR?d6Cb|PIh3bEBw);ky|bf8@S zMA^w1k(5f{agnc(RLdZwtQR?jRa)rI zymhN32c0sd_`tikhZ$NfV6DNEz&{OXxF!`;m^=v5*h7`MA(AJ z@ZTI4xss2gKGz^<)wBq6S*$N8#``K`7-&6ZOJD#~PErlijQ4_pFMUO{3!RKv@49ZO zblNo(^{K~6p`p1^G52An;wcm-)z$PI>Me~H;VEP}if^U(>|9~mWBOzvjVoEvTHKBD znAgS=Rfp`6Xap*y1p-x=(&LfH$Ew85Efs)b$+pDJZR2={GBdV}tB?W}Pgd}1qVc7X z@lbP%t-EHtFfwBOK;32-l(Z>IvQ%a-2R^48soDxYqu_<|m1xcqo*jx{+NS=1m4`|KJHork>gq-Vw69X- zULFkD%$h^cV3{4DS{(>*lHvX4LnLR@UYcWLQJ+_U)PJl>RSK##d6j9lSI^VzEEY6g ztv{O`BcuL?Xt#e1Fj+MfRFsF{Wy}e*MQX4(>X+p~-WA|}>em*5@U#@CTgFL6sPv-! zwMFetaOc$t!)x|qph`GH9ycGw)6%+rv%D}`Sh9@5CuzomY06+imBuZ8pY9?zA34|kJ=QI%&yh41GpypT2gfyzUr7nKPk{g6!*>{;vP zmG+oF8mr3|Z=MI$#LZutH!j+e$Czxu_HKSy#pGs!TVXO~ftG217$;1^p6rIB2;ZrA zlG1oGZ6L0!6AD6ypjk$FRD4kL2etMCw#uwU4Vt3G+y|rnKwS+RGZ6-kle2vxUhvy1 zLnw{%`0#jjyt)7>*}Ob(TXOvfGJu)5$PtIhr%$dQQy_r7xyy%PVs3>0qSA1ED8lb& zM%QD@MHW%4(C0WF9(ycMhB*!6^7zOb5_gRuDVwhgJCg)L`5T@xP3Vs(%oN>nP2OeVbB;V9J%BS;+nyb&@^yOI2#mBGd1cpozGNir;{@g5jGl)^<+ zL0}vuB!%!9FP{}v7-qbR*io@HA^w3xA~vNGu_5(HEr|xvHMz=c?3p(EM1%q053FJ+ z|D-qQ_9z$`K_Q+M4WwNZddPaN6v`#LusI}@#;VmcqeUMYtAa70eF8eE4A;;mlvc7! zS~989}lC(h7Yu+6paMk@+a<7&bf7cc=&bIi;wBdL2`+hftqc zGfn*Maf@jv1)Yx@Cg5%ax+pUlMd!m+5GtaCa0AB_pazBZns133-~(f_jUq(13(8nH zMrF_#?PxAy!{t^_g!qMPZty6~x*kFn{jRUqDNs3jmgd~c3#8T+iB8rtc5(#-t_P$% zFj*hKB0$2R>5vdgKzHNuZ7>ipVD6!ntBMAi5_hfL@l|2 znQBFn%aHXZD2U2yk+gPIg{mPE2nMUp-0!mDWQ4^Krg$9_CLb+g#A-lbV8%m~>2gsf zWLukM>Xz;}-C}t#?6PWETB8Z|$RE+2vkPO2PS{#3S5dN3Qde6%E1^52u5b6S$uu|t zW;rI225J&Kv$Df@(L}%K&dI0w!HE+|G_1}G1^fflII!(0!A8&EqQuQ(Og~I#J%tMdbh2E5b8=%S7$DLy3+kCV z77o@EmlU8nYaxc_N*mdA!rd)da)QruRyaFQiqFZzue?=e2&ZHulPaN)YH4^r^Zn7LhQpSoQy2miG3 zMppQSjRRe{Bo&27ZVGC|rhxULm&b57n?Fx8sxsmQ>?x43$Ts9}=2#sDl9v9tJ+e@F z_Q-k_lQ5;`2bs4WS&$1-GT%`&W!&-sYp6uRGy!Y$Hp4b=+LyhX%UBeeb3xKS>S!69>FZ7^4c#Bk`abM>N(YEk&uHAbYdpmb>Rs-`>PDst zQRDNFLaHi{edg64u{AMXfRSpALveykS&oSe?K)LgC;FvlM(Tv%A#$*;_%kGIQ@Yal z@0dy?Js3^t#S;TwN%9V+Yre--@>gmt8PTExA5b)lE>47!ZaI8L7 zwP%WIcX{@S5b-WPtB#6{-!*9IZ)~DJ50vz{L@ZGBshod5)~J&)6Bf`ZPPR z%a@In0ZZMM@oYtRY;Gt@U#=~yErWrqk7QZhfY>4+n(vO4E%&H$$=F!BsV3CbVNm!j zeZp8(FGw4zfJMLu9v)pD)5;$-%y@ikgHv*36N%dHxv~`6NP8gII zIo8M_Pp%TabX36$IfNl%8mTXoOxM0+a-KReO3KPIB3Z~Z;2e6%%0Qt=ce%=}pJto>*K~1mCDD5No6}^KqWcqyg|P`;7JYp4jhCd@Ofh@EEGqvn|Q05y+_Q^`|QG7+DwGP#qi_S@xy zku2b`xY->7lXa{K`%2nqrU@>nQr6`9c+H5E16CXUJaQhF zR_-?@t?tQssrV|UfHa!>8H^39{oFyAH4tE)WEW;BU0cc&T$M*A(2`xaK52@8b6XB8 z2%PG|WEVz+z(6l5tzvl(H1%@NWc82b>YENoTp=XK3367kYLHBHiNT z03>6Ck{s}P95CUl+G!%$6%uL3N2;=WQmB}x%uVT<{yX|tr6EG1zz+e!|wa4J}GW3KDIMguL_JdmE2x(k`gZgV6p`{GR zWLZemMF_i(uM^CsR|i%g9#Ho4RnP+48MUG7obm7o!_R!h{%$sQUj5c z3_fDh%piH5-j3N2u!@;jDj^6C#=d_cwCDm*Ix=CZ-R8wR= z%ON95ONB*MiN`GTO)`|!YdrU-p=iKb5Y`W{x5MgTZ;Bmdk*0TMLYPngLe*nzTz zk?#(B0Y}g%Gb(!DQGSSk&$hAj!7R1 z=i)o{sw||TtZwPkcU%^5z>6x>;E>p{N(TDjPS920pwkbH4#QEUst(>L6M#-@1&rid zv`W^n)#tZC@8%`H{lW`J{ifp*Amk;1SW8|Oh(jw&Vk@nd11_?Z5DQDr=9F;ApP56N zsftvKKlm(tDrdM-FB@8q8Id-gatsPs7ql!x}v7v$-Hd+@t;Fr*?#<5&- zG=o&8K)9ww(Bfj=W+G~Hr*ZxSl_UeWH5P8JulM7IY ztfz3Lqs^#z8Q#YnlG}t0lS$!3A(`}isk#vvm=9(Ujae_bW<;Z`%{DC;Dg*_n()irK)f-uVZ+d@@+c&KX6&WWzqf(CVE7LNk zhnr>0>ESrOWk#%8YsA`^4`P_Zbkg2ufp_Ic6nIw!4!vS0$-DF+5*1yFMwdn)yK0B` z1X_!S(rTK?uq$>Q{nsWG+bt9hA@AH^RJ9>WWJgFLHk$d2>b9R?@Pvj0-9r*xr#_6w zqY{Tyl^gI|`mE1$z1-4)RXa_pMVeHrG^r+OQq2r-L6(*Y;xsuD9_PRt%pMPu1Rw#- zO_jOnIX68Uh}hrcZX-NKqCH(@taN|AR2fRynGcU2&OcU$p1BIy+`zZz`+%3cklg1b zy;(^vnFHcE0#VQXbUTo`D7ej@ur>0|j)_9-RNBy9Sib;x|B zS+<-OBcy@NU!kdq3su?JW0y zGn)d63VikR{rUZi?(VdG^XAQ)_ujmj*{I#2a7qYdP=6$d^3Ya4@CaZj=WJa8FTjpj zpMY65jj5&v8fm5}fkXrtRI!e5P~&sb3tzC05f> z*xP|gO7HB+qcD&>tYP3x6&*{$kL)En;;cubCvQFMg~l&q4>3eF?+r$&*&FEBHsB&T zG^iXL$)_XvID+>f+2j@C$S68zlm`A98pax&N$*k0Q$Hp`7Sw1@4+*GzCWI^yR(Ufa z3pEw&aG(g#4y7@{IYY;0Y8Vg5qf3KQNRpuUz?T6fp$F%~dkAFtg!Pax(@wpg6P3UT zXnFus4cKRaH-zF>0X%vifWmYkTL(jpB#roLD2ma|&ZhnD7z(OC0sovX1icRR=BzvP{RC0mTh9@L0(MXf zGSI;GR@rHTc{tY|mj(MB`8VNh3@s1KP}qftp~2}oT$Rd9?NtERI$phmp_cQ6o@k*( zN|Xu(!2$FHPs;MMkkAFPKmd-@AuWfBVa({&ggm@@khcqiS3gu)cvR)V?tC=5@|9>9 zF>DI-VT}n19-5`|Hoz!`-AOdK{A3J4^T&_orec(9}eX9bPHmxBs`4V#~3j&ui_VyS}YxfBFwngpS`U~>(00xqlu3)56s zRlsQ|NSE!41iz{;&;bDTMU}yt92BA-aHmbte9&~TdJ34+F5CRE=HQdUaaeK7AB&+R z&`=We0T?ZIRQ>5%5^yW9l+LF+F5e9J+(tDLfxw{&C3C0oj_7w+vsnzlul zlo%?a1F9TS;A|!e8DT{PH4^~TChra6C$z8&c{EVmNyyZ&QDMA6Ucl%8PY3Xv$^dvt zwHS8l*fQuzQM4`rQ7xaIapdcx#zGAE1UdrNdBH-$55!<1%>OEpwaOgqKs7@(Lb5Sm zrS1sz1G?}bFtknf(S`)LV=K+hJ_^=?jmiO)1twJCu7~~wPJn*Ex>VH!sf_&Q&_+!_ zsSXtAqh5rp0)1>Gqe3%GVFW`OK+D2Vc(iSj(*yybRX-i32O>&_fe2g3aX+FvP*)qX z#x0ZRGMQGmG38Rg!GzDx+T@EYkQo9G3pjWNk_14DED)~Q#c*N_*%A)eV$UlxM*L={ z9;PD1fp(a`^Y+nf-W+#iHjb#!+z<}P(mB}6rE;NjTu@KvX9MAYWuZ2eP5yAmf!;?m zd58l8<76BMBCFs9=tMq*ki`KnsMtVyOWX-`7noJrXrBR0s=WHDWnW z0MN&;0Is!JMl=c-24Ze_5!5$OQiBvmKo`Y0!j3R)zA6a({s5$W3W5T|3XBTe2(TyA zwE&_h4@eFB$dFFd6oIO>*@UUSa7+ZF2ejDf|FGt zxXezv%uXEHOGozN$YwgS8ArC$k?r*8#(bt8^f-*m9Hh$}#F0Pf$R9XzoQ@nfLjqHC zdK@?dSX&dr<<8UP&f`ca9Vx|;TXY23OK`}Xj$FeL)Q!OQw8%eAM^59MdvxTU39blu z5Uf|IAI{_h526u;OVOh;Uxgy7aQuoY9BJ+BnI>R}(o7Fy4%|R6GggmEm?qM)%a~~n zVhy@Y&8U_H_P(R7j+p6e;0+oCbRiu;Kp+Ae4M5JTivbW#5O@wxh;$IKB2t4>1=WN4 zDq}gApJ~z&7on(yx*SAN>+-OrXJKqpV1=T&?{H&t-_f=en9;C`3K|Ngx%5iWNa$fT z?ztnuK2rMv(G(mY<74NDJ<)EsGl-cH)1uH55XtsW-V&baXKo~U-TTPS)mDxOJ5GR^fT<*)866Dj5T>9PA!cb{YzMXsJm7pl zZNdbnitNDWn=i40t%_jf!0z+Hdk_cZ3K0Xk1lmt#u8t&Fz`N>lHu*SKi!d@awlgud zWEk6l!nH8AGlV;AB-PGVu#pMs673q(dXUk2mzr;2Q48-J0UokP;}?jC4jEb(Uej|V zjNxL!Wufl~OQmpwGv5$`!`_Zyy#Imkr6$HOlHpJu96?5@>+yXjz8{BI;3zIi-iz*V z($x`8x#4vP(U8}YPDuo-ElVWI0zy`Jp2F8G= zBfbwrci7i#j1WURl<5%OhKj4!hH}x@k&ICq-i3-YL5|wwWI+QRfW)xN7=y$F$n{2e z<&MJW7NdI(>O33ROa}K5bq_ERvREnpp$(O4n+&_Sa4ld?<`S4Juz8Da9(-uP0)r#9 z?;Y2M5GTO?CVWTavB`Oe@8=QrsJ7BEq3uejD!knY?TOYDfDZ}L@0jaQ8CVNr zh1w45t2m4>#C701EJs6qNZ_b5Ey}$?cjHL>o_ggKmr}31qA+svzt4(H%|KE4;? zJLZ_YsW?0l?l3Dw{AGZG;4493o})1MJ0Pq=xWnWV-*@3V2ArP^Ve};+Ok3nR(2@as z2auJGYfuH@@I<;8whD~VydMF|$K0$+0CqrRvQhQNshC(WBSt9+I3)}BE_@#Y=_n8; zrdFuZ3Nu5DMY)+Fv2k57J65O%79%3_q-=K9E$E>d|<*L;{)Q>Idc#t zH7XR9$O*!f!J5LDfxhPme~rNLPed{6_K*vb!(`HcfkG-7eMc}VK`u*IFrXZK{1N_g zvKT~8TBukkmnmd%O4nc!B~`+g4?|@lO5zINDC{nP&ld&^R8ms>6~uC1FZ3o!4v$2C zJWu@aqGKfKPI7R9I-k$sb9rno8brfC}5)gCp|tV0%&m$nz9Xu_96=AW08S9EUIR^bkP}2$8rr5#P&` z67fU=E}!D@gj_FAA&<}Fk{*;N#pT9&@;L5n9#crpS>@JXqMfh8ru88nIiT-UlJq@IU$fJMeuDkbltU$R943DP=;L zMB&;cnUV&J{A5xoB~<>@v)@$D4udYpsb&}a91GuJETlk3B&t7cUeUm(CBJK@^q;){ zZKXd}yI&#sPhS5Hyq*NS9{)L^6UmAEDdWGXj8_7=rC%Vo>rdPAJ23ed-3GwqKPAg| zAbKXSy7KF+{*(6Kf%Y<>z4&vq|LLyz=8nk@4B}UJS2iDh!G^=;fDhG^4PIJTK6o!< zdG6pmjdd4@1bnto$l-~=S4*+^ah~oTLbia1wiWDT3{|TL+PU!#K37rpQANo16>!!+);&>?~ z3Q{VQBdC;AaFPBrrM{^tH3GUJzXsj#Q{j9Eh4aN}M9-fh=o_ztWdQFhbiD7A2|t+T z9cgCujn88bOHFMwD}Iw=8N+=tp@(d z_}`TAKax2W8DC5EpZxwE`2CAsBlSYOO#X94^4t2Pzv#fwQT->!e+P~q2wGPDIW3DE z7(cgIeV;8>!3?5-Ygj;3pj?ndrOV`r&YB@HPf#jY za!LUX5lZAr5ZSO^ofRwW9Xf~CwzM)w4Pl9eo%rHMrpOOcuk^(k3#GC520^TZn8 zx}Q8FSt*N$t$qn&AxoA_(ReA^u+W@cERDy%N-U1cfFMp1pdTa#@fsi%qE}&GAfRB+ zAnNIGuAmMHq8WU;K%4o|EQua|~NQLc0F)?g{=*%DjtNbzz1l@h4A|D0xmQo9gLl9vM zBDh+xeB^RLMzB;V^UY9FIHCo|Cx}o65mY^JQc(tB z0ZgD=mIQl7KLN@k2ww)_{Z*h*&~F;@`^zx(G#$Vth)xV5pjsfp1#$%yE>kE$MWs?& zf&n%m45DMTKp|XE>jK46u_A$jE>$xIP~V?Hw68WWe}Ph<1>!*vfegZ@T0n5)DmKiM zAi^0$=W2mL4U2>yBbUZw?n;e|qvTq=V54aSg9xn_K(K#>Fz@yg$mL=|JQYEK#E@zs zvSA>BVD+yaNYszrq+%hAZ5<@w)M^tAwbm~I!0EsMHv};Vzv?5@C3XPF9vvXygqpR? zPnMKaVGO$0fY$>A${q<~C8bCf2+I)(IICu@qj^HtI^eC248pfsWC|51g$Wf|lnpG^ zmqGNXA)Fqd4x;1&u>|-vl1dhUx{~SGl|$B`wHQed(vg&|FFC-aRg$UY1r{EVAo>(a zc`DLLTH0}dGpeLKK7kgNniNaP!vtYESil=S8AN2Y=!Y?*VSzLhBgGjkjRQ%h%+LV_ zPWev&hf(oh(o_Z*IHzVTNMo$S5Ll;%DnO1bn{tiiLjQJU5Fyo~B9a|6N|i`TE=Z&5 zi%MFqrKHM~lnCVJM@WLotF}O)k(5Y~kke9*3o@?SgEvSZ6-lVDREb0frzRo}Vf2aC z+ za-fw3Br=7rZPk(48W{K)EJgD$ZNt!Xq6>rQR4rsMAUrC8N|an$ zuK(B|$*MGWLaOv5#FSJ#C9gQxIY9R+Tg)18{xF%MJ~Xq+`u&TL+`k!49?+lP1}87j@ZSg$2%~EAZ21mU zR_H)B33RWrhX07}pG?(|K&mOPMhMa?as=#`s-ibRgO*RK5?nY*$r1{@LK>F@h>R*J z6AciJl*MscXlOtogsP-WG_dd!yY;l_Z~;b@2H>YKBEiXm>_?dG>A*qrszmV$;L6Dv zWVPs^fpn?VzXn&b|Ql4%^-wJL7l_Y?PrZgTw=OXA|9eU{CGR#pag{v<(#oc+} zY6ia#7%6l>+jVS^dU6Kw*+bCSp{oPdNsuOp6w1ZP^vUSfZ86aU6hZ-5#=1<}nnHdC ze@Y@wLgtaq2uD?Zb>8^3Dl1IQko*|RATqy5@2^4hM=B36m1KOOIkHq`Wi0|R4Xb;p zog%x0u_A>D&|R!F?RjQafFMdNQYu{uP7w4-0OYkF03LM(4HqpyB+29yOGGKbg`cmps99s+^3tbQGdPS}!CvrUvt%Z4D`ycvXN)d7Ua zU{OFTV5{K7#4YGlPJ&g6#8<_1C15^A<*U;fEez;DDH@YVI%9EG%#o>rD3;^v<%3|ERt3;RYXmro<8LupmG(*feuCm`hXy- z;y3`ir*&IDIaOW{1IJWN7IebgMl)UoHUZjJ4+3-L@QDNM z5J^emQ0F4oLVE_$rV9L}e%+S>iAZVQ=K~3<*o&I#rBay^uOrj)(38_2da-&$@c9@9 zknyV%I+{g6u!jqj39eW!BGY7Gpjd*v2>}BsVXBg%qnI{TFtREE8VVnf5rb{}Rp8wi zM0geGUIF7s37jYREXGxGTvS9kP)td{)A@N4eAQm71fGTjUxNG9$x%hPT~jG}#+TrI z)q__Fyhx!y`X!iOod8sX`89A=l%kprN8qYLN%+)A3T*%)!L2qFD7j-S_;sCFVz7K- z72x4jg4sjMFP4BMq|FIR&PoTPkyY92;37inRZ36jU74#*wi^n>A z-~^pv(b|En+alp5k*GImz+PJ{0l@PITN6Kf(hM8KaF9j}_FX2u{{$>Y^pz&0cIB|6 zB7%bEfpOGYt+&A4=`V(j7BZT`f9WR754it`DH4h$WW7UKfhxi>y~gGB|tV#E^k@rLejwAYF_Qhf*3! zqoML2LF|?)Mzw0-)n^d;`UD(Aiej2Wf5_4`Tt+|+3r;3go-@Pzb2-^?o~iP8%syLB zwn?S$m;i3UN-7B-pz5H;#Uxmo02~0cBeJJ3i0tv0bfAmT9GeA8KCE=eMd6y5{;Bbl z(p4spcT>*}6mDOX%Dyl@@wTLoW(9OFQLL7j>#OG6$fHC-aExgh3;G(+bzSR&AfQ$HyWqX6yFlIz}sNfxYs;L^dL6mNs_Q2!`gKgrXA@@6?YvAo-% zU1E4R!zQt%fb4wrXb%Mfz^pcs63B%Kff7Nyq9PfhWH3z=!KN>aLlRvY>ZJt-9(9<9 zSaD$Uvpyq2FfYNR5q5#V9yHW+5LsH`1A;}31uKbCCdkTr;@M7C>1kxh$sEtroobv%J&Ad<3Sl#=dmMo5iB{gg#1l@pKT|ojx zxLlkD5)UN3mS75)M{5M3GYiZlXdoU2y0YNRQ>H@iYDt7tFPM!TRfuP2biM|ErQ zMabx6B5WoU8EXQ74e{f&P$*BUSqrcHAbrRX)vSG2e~|VuMalo`4NR$71AiC}rT)j; zmsqp*-TFaBpiv@~5hF`h)U1_1j4n(R*HDuFI4x9W)T|GG7)c|oS^IvN9+bf@-x}F# zKTHqSP}%=5?W>`#|6#1P6miWM^oJRO;7_Sp3x60E9ayvW{V+W^kT3k7Z=tegExi4M zn54!7`O0RI9KL(an)w5b#P)qZ8bv@ON&ozw@dj?#`?!Yet6|?q7E5K%{k_J;u$LZ{O;1A7xn0;Vo#Gmv%qY z(rJ+N*SOePuM=hC{){s88PWAbdZYUB%?qN_++Lm- zbNe@K$l|okJB|KXuJ&K;+F67MN{W+)6+#v{u{Joo35{%Gr z^iwGcxKt(W#@ ztOJB22)7tFg+7Z7%8u~-DM;9uO zE=^qX)TA#||5a8Oyaq0A`qGrw#5GS%`oHjJ3S~ub-O~fSpmU1~fUA8GrWM-f#_sYcgCL;5rT0Gq~Vmhy)22ET0oeaG}4-@I*Lh`r&i=h@R!?NHCas`UZwZ z#wMn<%*-t;t*mWqYuBk;&#r!hhV~AP8aHm_VBfGoeY<*f>(sWjv9_|bFgL4ZYGQ0; zXrQmhgfA5kETFg>(Uj;zL=%pL6HwU{ddLiF=}Y7jjw~k@REhCLIBDpF!sRbbx+@Vt zz&8-^A8IP57L5)vYbkPgcLPe{fFqRfr)5c8ND@S ze?I?zrT_!WTRT`At4Ia>HCEu^Pt#GkAh>$6EQnadSn9u61K2VMVU>@ zM1?^-818`(Mt{Znk3OIgY6()~WCTvaxAy8FlEX+=l>hUG2m_!BV4MZQ=##)m42H26 z2cr-DHOEpV3UURIs(^d}j7Bl!N^w3xtk&NRfZ?Pyq{|^k3gh@wNV9Mm6537wjI1qqI%I0+Z}izAxB zyQtTd09_7G0o0*u^?!n!D_|^vf9Nk8YKF~HP)9tj0nsfP=!>X<^p6tCEP>wnv_8Zm zmD89-_+a>~a!?SL(tV9ulLqyPpk~k|xSd_pCDCX>?bP%QiqXCNY5i62i}LLaC+wiT z;ZPsyw^ZO~WjU%=&P$)~bAp%wmgC3pKJMwy^)nkZH5>Q12hf5K|Ae5$V?mF*L%We& zh{Yih#Q0EB2>&>cD}qv<5T-Eq#6cKoeIdk9IX=9{2L3_(X9BqSz^G6_*(87_fu7Zj zN*yOw#1BcKZ}n#ZHXT7I+k7i{KjHjH6exmu48dd)WNynbh9<2Ff(l-lGmMx;xh=CH zDT~Qquq{b*LzDgmK@3VypUE&F$i9ZAtqmFaj9d>UL%%4D3?b{4OR*$P^cX~u{#<4@ z0YB$i@m+mZKmV9}Z>@bE7MuMtpZOrAQRwKaCst(rw%Pdh<^~eSMrB30<~d}p!M|j# z-rXXYi7=VAuxp(eF@n4F^~7ghmk@E85eTdrSw<~DX$ZR(X=13?P2bR#*)5W7OIo9d zv8`zjfg%Am)WM-8wiRiC5{+!(lWd|SnN-AXMB1YiQ`y?CpCY1OU9&zmhTve$*54oOXn2x$#%=G4hj|v~!!EzL8SOT| zQ`Vu!{*zxvKbf&}$LKw#%#1O8?_9bfIa8;X{l!eq@Ue9wRi;v6=ZXcF4wm%yPi_9U z@xrJBH%F{GIy50r-ZA0G*`wo}=5e3i;D((i|4P~;x#>BGA#7qBdA3e?J7al!n<4Rx z*1NZFS=sSz*0O@qC(5i21;IY8hFl0+c(F$)6Bv~-FPAX{D3VDwhQ4-ap>Idl)pB!) zF~iUpc-_FjNKcP+Km{!H>+09$kMC{mGva*W>P;KNn146Q3apoLf(%F5*80I@$N2%I zAKQs+iI}IBZMiT0bK_@Tpk@MS%8Rxe5W z>%HixUUH%swm-NDSS$Jpg7phQ_W(aXx2IF6SCg{+LgIO;Z{10`5J+?TDLOKXeU+OSGdrH#G46oV_-B0^#ORfcoYJ{)j)@4du;GI}>=-#iBgCh$)0~UALnDC&@KlNti7CB^g zE#i$IXTM?GR_ot3uO;vFVjVcS_D!t|D~Ik$b8`(DUbofkk#;h+aNe$x*Vi_kKi;W+ ze7lY5UB@tXm~CC;CRA5I;x z-e-94^^1KnEgJ9l?0>5Dii;N0xV_elJoUhK4EJ7YE-$e-d-s;OyHu*ZXX5Byr-~fM zUu=B5)#yX))+H@V>@e3i(Sn* z-0`iw9|k^HQoF^gh^-vKhcvgcx!u}aPTY4kbI<+1Y6YB$O z4MdO9!vCpf+ebCBL^3{F9y&IibLX0;g~8*c*6s~&)MnUpxxfF(G1sR1FJu(A4ZdT= zS$xJuOy(M8f*OdWRe-6$V(dw*R`ot&7BXk}cM+}dOVwyd>e)K!M1O=#reyg6f71sM zC>9*hPmsZm`V6fS09D{YdUD_wsY$E^+;J3X2Cv@#btRR{{8Sw)Wot+BtltmO9Gx2fF+&Z%{J-fPyb8t*yeJ^N774!Ib#Ey{@hHc;3MA;(7&T-=(Egd~uO!4aE zek^Ov_?7m}7A=W;C}=$3x?}LnnBg~CM4xKXxn0EG4L#a7*L!>-vya=EW;c_gExQJ$ zuX{~g-@crg8*^!Aopr?xPj~Bl*K3aD{bs@2?Kb;o1>D-TN1l02ez*D69f4E#J=$&G z<5J$JhoQmbqGhA6KI}7l)w|29<8JJloHMBGY+2{K!A^^89TzSd9G`vXx7dL(Yu!}m zdd%p%Bi+&QNm{evNna0S^>nt4?mux_yDnVS z#nr>>U6~d3eA4Refkl!jC$F6yKC+fZ9hQMQyiZygny9V3It=U*E~o!0RYvu-FVtr0 zn>8{8FG4EJXZ#2svKA8emih=x0coj~{RX5SsDKJ;PVUl%$sX&srM5xX^}iM!V4rAK z$Rm5BHyZ1MCL+5Og%))#2v%z$&{m(SIjrO0IEe^8)Q2?@j9VDBFj%$9E{5dBa5z}m z_0uRfP<9byI2opigR=AelCpCXYBb#!;48_T*$8=-e$HevX9AfsPD>gCM#SMlu2XFz zZT=Div*~3C|0K9hENa!hRbtOzVPg}qwD*)rxALCv9P=!&^_6$O9xvuUlD1fRdsWM_ z}HywBy&KC{*bdztPx-MxRs%G+x%T&gp?Yd}v= zPD;xLL)ScS`TB};8Pw5IkwAfZyOp{Yv;Pq7uUxOwU^Zy z9IzxYx7E3rso(SxwDue4KFF zw`Tf+_5taQ`1?=JojW@-v*|xU6B{pk+p$^pi&?LCByQ?F`No6Pfejx1y|e0{cOxFu%Kl6I>#BETnSRLVt5;K#gyXzV%|gO zO#jH7iT`cI_1PISTlL_^l0lw-lV6`Y5#YM9XapU*!F>c$?AQ_FYzIz9M<$UN>X^LN+h5$+iOD zBJz_eHQv)X7TIR%5e?t^Q?kkrG?1H&a8=b|#^KJ_=P0hvIp^Nr;!(k2 zJ$dP>9z|zX7%*NBSophr>;0Sd_g={C=YG3i*BeH4-}R0?;diFz%MaWBy*lJ@;quxJ zMst)8TNODZGb~$ead?})@Xm*|OH;~rb3<0Tz2I#eJ&DJ&IlB1O0YzH3M^}Hf%sJ4q zUz5FAnRmB{FK)cCmL&REuAIDl%kN%~V#bZT_NxV>UiMD8c*3c3OVb}V8)*85b1ck; z$#lOSJFS`1RsnMr;m!BC_@wqPmQS{|YHPf4`cjj^`uqm5FDFi!lUuJonOm=pmYjNe z40dik14v_N`viF->OLiN>;BDT=zZ#q$Yu00tflF9D{x5UGJ=4%{-DG<0RO5%t9qI0 zF)DFKtbDV!%PucPv)cvh7L_{RE73de@X+`4V~H{&)BMk;DtD%#U}E&m?hHFy^mBLg zZ{G3UIXqV`hu53b&t@{77v-FvpL2%HIr&`-Q5Ui`C=i%NHrE-V!E#E1PIH!^U{?j zKC<8gs<_#8`Xz3e-sA7bC8cjOlA{k!A9bMB`p#v(hZ4paq@3I_;%>q8<;O3sVgx>t zHwbJQ)VXJ|;=!VphwTnqop4>fc6E521I?SXJuB+D^1`zhfm;KAb2b>(*Kz2ZM(M*w z71iER{GmVLX1_an(BdI(jo-_2r*9A4)q}6P>07Ja;$>HeE$_~_2OIY(c+l0@ZhlLX z>1TL-FN`g@cyB@W-4~sEK2h;_ix%~L8=bx8vfrNg9RrJO){a;a%S)X4X0%7Ap(gE~ zCSDxBsMoZ}$Y~&wtA-n51Z0O6pe0qA*ixE*hTaG-M>*+iAPhwiyv$@OrAMqIdV$^u|kxrt~ zyCc)|Ze1O9s)L0|-B*$i_b)8#JYv=T8}X^HuU$*I)VQd7ulNgp)=rvubjvl*LoSic z<1RIiFm^WiJ>0Ux)^`1xH2Ga}er=yd?;9nL4qf`{1;ccn*JfAc9rLX9@8-5|{N}tU zc4bI<>Dc$%cj>SHYxRdL-j==F?frL7de#4yL&gfJ_1ZuuAJ3A``z9~&d6#r|WQ*$* z^SDt5o5C)cetA0|X-s=}kcymghWun%<8>W-4`gLG%DvWRxqSYLH-o|}*yFPo)rlth z#YX2nzkQNg)G(4?|Gu1zK_+cu{hnlZGO8$|D7+x-YnH3p?If3>Pe--jkUCKV5g58~ z2jiS{WIJJ_T%s{*!6@%f_5+Wz+6xCpdH7fB(%9uytL^?>i?IdmQ#J9=Nb3W*QO3xoz-RD%#B;i_B#>trulbY zalLHfyR|R<=0Dsp?LdadxJQN?Uac6sdC=m)wKAe7dnI^0w_W7$VPWY00S~*|P?MXS z9(#P$v8>m3sd<)*dpj!4w+%FjxpMAoU)!?yb8XL#KUCZLa^pMPgAuJguFPIFZjAHM zOWEsN8Ye%AQjIZ^Ok;MUexibd(%u=eXwPGVfvet5eQ4kH}=UezbJRb0?3&g|iZ0w~bh`Y5bAkHBJ1M zeh6<6X=fg65EUa`@pQ**xszkovX_?y4>r_E-?a5i*v`SiHYWx+&Y#|Hd+Tv$)2@ar z@qOa0ckiERy^gORF!s)@n=4Dg=l485qx*)7e<-FOn2;7TYw^Y1?N6*eI{v=J?8MXW zP1E=u?e_Gy-gIcZ-1v!Pr2+5GF>3Uphn=R2>zrxwqLKZe8*k6F$a6lr=HEyI=QTUo z8y?!sHl37XxS{B@YgW==mld(~{&pNNu3t`Lv&UvLhD8?ZT`v_JzwUTztd+HWv6--> z_ay7z9aHDkiW?F2SKB#jhZ}ZjG9<;X>%V&s_4V8WdNBn&RK0Y1k*KrpZsIKF^x&!3 zRaNIBuKB;?s!}US(hC%$Cx^q~gOUWtGmdgm^uMgazoyM@U0)b-cfGtxt&F)x&Na^{ zwm6e}>iyp{jEqh$k%XllJk0O$k}*`$>DrCrE$!;{=l|KI@;dH$Ogjt)#Ts{L$V+KYnl(p~-sQ~GvgdlZ>^N=KEQ zvpoMxWR{nJnYnlAd%1X(!?NWs-Ankth%Qd~b!&q`+!fhI!umLGYL7jQRFdYE%&X93x_i}Q`xwMVzy7&ZLXq~(lG z+e%WF)aw)9|H|v};~F`5zh@m&4EC88n0jPETSrNJ@T zTQ4mg;{MP*Y-syD+g`b z)Na5H*A*IVb{VwU1=2?AQUOPm0nP*CR_nZCq6M2)iy}UV_D(Cw9oIIH?{v)SUpM`~ z%c;RiwOn7M2w3VB5HqzeEF^C*%!z%f=eO}kejD9SAYs2vrE2DzxX{kL?0#g-y}5m3 z6Ha(f7~ALEpVRF2lHF;Q-Gzj;q9Rx;(k|pw(}jlCibxmI-G#%&n!2|}NrI+EE5V&K zanRK5zND!uai3L$t^7!QVx>E?+u(PtR$O;(9M51k?{j^Yyz{#yvcLM)-qx?D2-3h(b1|@~}#Mic({5|OE09lFC5$XB%L8*)jc2|;e&0Zumi@G&1GPQY+Eth9M z8|}USS;AH7<^1kTUrpTT*sbO9=EWU~cGTZ!V`Cld-SS$8NuJAJy>Tksv%TKxsC?gb z@62Y6s9$*ZajgM4yL0OM){jX2&3(7S9)ZHuIdPD*y|c-{+V{t;UDD@j@I0m2_J`xL zPkP_!)GqGVF53$J;WW4~>G_zK;}|dh+^>B9GDI%3T9!)gli(PqeK@J=Y}@wZ20oEOtJlVAJ;Jw0rU1pv<9+I}9N0iALF~fgI)*OLE@xgT4L!UTr z@%tmYe1eAz`Mu=G>tAnesr^=>iYj#AlYz=>Jy%7zrNxr4VKxj$%! zXR`l^u}=;zYx7$hqyElKT3}$cE5&et)q00++@9;^B*#6Slgm5@lN~g% zhp|u0`QM#-&uwN3ZG`REtu6GJ4fN^|O%|A}xRqHtYs{alB)v?>A*a!&UA zA^&B4U2gr>z<^*H5Vs@VOeUM!S!#VId_J4c?yXJWvgrgeo%Gf@X!IFuH;^r+Y5=ez z1z`s4PO*Q>gk=IF9JcOC7l`Uy4;64P_c{}8*wDK6kjIBvWJ(&N*Yu3$u;ysOjDn)_ zvIS7q%gG@+tZ!$2etnkx!ZA)m8n09Sme(d<*p%AV{6&_nuku;Uvik|cTX>4gqJ*d7 zTZSfCKG#36v$S}Kqqm8I^DH^qqvsV~3*X0$>KG?p{%7Tq7W<@QBYodo=1s{|J#5jp z>)ID1w{H88Tv*nsWQvK!fB?PhHYwY@6+M;>T@<|U+H7fmp%*(>-yHlbCfMit`+v7b zvB$MCH&1zwYc8V`*+A>11DC6L1wY&;Ue!g+{=&r}tkb+&4|j&XG+$HC@ZWrApDk?- z5~mHDGU2KXne$IM08BS_&R=BCT{7nunNzIKic9avE)DO|O(LB*%!~b3&yX3#dxNKM zvU_l0XoTq9m;f?o%Kw3(P&whirELDtrpFtf_|>IdPW!g2MYU>*PiJ2?kiw<<|Zf9Tg+*VjJtMQ<;?k~cZ9ppI+^yds4b?3;7 z!(#$w@pr8+iG9_rbiS%I=(m&SjPibCCbyciCaz~&wTy>=ys| z_s?~DYd&z3VDz+<^nM-ctnX+4sJQjKKFTxiINPtV&SbWT$=DuCw%PpL)@9R#uAweP z!{S3XyNor6+n(CRph?`m_l;J*E1tFY{)7IfI>0P-*^~WIzfHKjK$zXf`Pd7$g(a&e z{`0I&UfQd!XUE!%;d6hR^w8~ucua0-$D^;_oqgvRA93bgn&01{i(5}Io6%vN8_O`~ zV%s7UzvA$f3pRG`?0#bB<@y7j^xCn`{NF~=?{2N=TzA*Zr88Woa-6R2owP-@ebmHL vr5#J&G<;LEynf(i--K&={Wki{A7dA9*K=!`{VnsvL*rg}j<@r}lgR%E7r$!r literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Tokens.dll.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Tokens.dll.meta new file mode 100644 index 00000000..b80a6e96 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/Microsoft.IdentityModel.Tokens.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: cbf701fef220b9041ba3f7e8d31b4dac +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta new file mode 100644 index 00000000..7e9b0ccc --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/MostRecentPackage.unitypackage.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 32d91f0196eda114f9dd3c523ea0972c +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset new file mode 100644 index 00000000..271bea0f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset @@ -0,0 +1,24 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5d0199c11aa6f514784c5c69cd8378d8, type: 3} + m_Name: PlayFabEditorPrefsSO + m_EditorClassIdentifier: + DevAccountEmail: + DevAccountToken: nmya6os7w73ij865ursce8zfszcj4pyisa91k8q3adgp67ax71y5yoyabrgey798b1heudquctojxusy9hp8yhuqpca36xg3aesq6gg3azzifmra9w9dhdqjsdyc6besu7tiojxr35b5hgqhbqcc4cpfsyydobsjuycpiyfun9cog9icpmqfuycpg7mbzfmcsrd4pzgx + AadAuthorization: eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyIsImtpZCI6Ii1LSTNROW5OUjdiUm9meG1lWm9YcWJIWkdldyJ9.eyJhdWQiOiI0NDhhZGJkYS1iOGQ4LTRmMzMtYTFiMC1hYzU4Y2Y0NGQ0YzEiLCJpc3MiOiJodHRwczovL3N0cy53aW5kb3dzLm5ldC83MmY5ODhiZi04NmYxLTQxYWYtOTFhYi0yZDdjZDAxMWRiNDcvIiwiaWF0IjoxNjg0ODc4Mjk1LCJuYmYiOjE2ODQ4NzgyOTUsImV4cCI6MTY4NDg4MjY0NSwiYWNyIjoiMSIsImFpbyI6IkFZUUFlLzhUQUFBQUoyVkVTeEVVdklhRTZkLzk4djRrYTkrNGs3RG5OMFBwM3kyNjdjSy9Bd0Nxdi9lNm5oL1hnaWZSUzQ0VUd5b0FDamorS3ZmRm50WG01TXdNN2RXdyt3bzNvckJDMUZKeWpyUVlDYVVkaWhsT0p0d1hPMGVMMGgwZThWRjhvM3BzRUhUMmZzK3hUQXh3cDI4ZEVzY3ViNmV3d0RJdFF1MnJBTitBbGRSaGpJdz0iLCJhbXIiOlsicnNhIiwibWZhIl0sImFwcGlkIjoiMmQ5OTUxMWUtMTNlYy00YjU5LTk5YzAtOWFlODc1NGY4NGFhIiwiYXBwaWRhY3IiOiIwIiwiZGV2aWNlaWQiOiJkZTExZDAwNS00Y2Q0LTRlYTctYTQ3Ni0xMjUyNzY2ZTFmNmQiLCJmYW1pbHlfbmFtZSI6IlJlZXNlIiwiZ2l2ZW5fbmFtZSI6IkRlcmVrIiwiaXBhZGRyIjoiMTMxLjEwNy4xLjE2NCIsIm5hbWUiOiJEZXJlayBSZWVzZSIsIm9pZCI6ImI3OGE5YzY5LTk4MmEtNDMzNS04NGE3LTYzNTFkZjA1Y2IxZCIsIm9ucHJlbV9zaWQiOiJTLTEtNS0yMS0xMjQ1MjUwOTUtNzA4MjU5NjM3LTE1NDMxMTkwMjEtMjA5MTQ3OSIsInB1aWQiOiIxMDAzMjAwMUM1NTJDQUVGIiwicmgiOiIwLkFSb0F2NGo1Y3ZHR3IwR1JxeTE4MEJIYlI5cmJpa1RZdUROUG9iQ3NXTTlFMU1FYUFJVS4iLCJzY3AiOiJwbHVnaW4iLCJzdWIiOiIwNGJUSW83aU1SSkNQRldIMy1mdXAxWXBURjVyQ3lMaDh1TjlEN3hvM0owIiwidGlkIjoiNzJmOTg4YmYtODZmMS00MWFmLTkxYWItMmQ3Y2QwMTFkYjQ3IiwidW5pcXVlX25hbWUiOiJkZXJla3JlZXNlQG1pY3Jvc29mdC5jb20iLCJ1cG4iOiJkZXJla3JlZXNlQG1pY3Jvc29mdC5jb20iLCJ1dGkiOiJQaHpJcTlrSmprV1BOSjJ1a1p5T0FBIiwidmVyIjoiMS4wIn0.J0PtyP5D_rDLrZ2L-W-cRGmKaoXbXhZR1GkiMwnG4Hxa0bcIsAjHov3BbNJPe6vfovEutkjcO4bjTnrkMqmOT_Lkup_Mq_Iea_gs_8FgFH6MYl8MquYsDsDNRffHrDFg5RxqNEH_fawMDR-jOE2fXPMyfbvbCOj5M3SgtRQu5c3AV53vkSMr58D-bgdx9sson_Q1j3560Lbo06Q1BEjpZcJsIZEatan94YlIn-TfXfTgsSZjHd3x3TRyZKA6hcLBiRm5lfq0IvQ_KyrNlloZwSXrAmxJa4J93mJKu4y79BYBB_Qcs3uF3FZ7Q8uuPugBeGCqJBaIlqVHf13sYY9QSg + SelectedStudio: CreditCardBypassStudio + SdkPath: Assets/PlayFabSDK + EdExPath: + LocalCloudScriptPath: + PanelIsShown: 0 + curMainMenuIdx: 0 + curSubMenuIdx: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta new file mode 100644 index 00000000..39aa0b76 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9fc396195b316c3419759634cec44227 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/System.IdentityModel.Tokens.Jwt.dll b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Resources/System.IdentityModel.Tokens.Jwt.dll new file mode 100644 index 0000000000000000000000000000000000000000..f55070ccf719a1c8c61d84a096bfb48773e0c4c6 GIT binary patch literal 82280 zcmdRX3t(JD)&JbPyLTT+HrdVl)oz-WZu6pTTG~Q^rfr}pebJ<)yiB*rHeE<^)7?$m zw6r9=1O=3*JVYsiiVE5fR6a!kc?cp3pCBSo+D}yQ@$sSZiK6iToilUy-c8a6PyGk> z+&O2?%$zxM=FFLyyW8cbeOkDL5N>?lc}IwQ@T9*53=a;5ksX})ouIhe|3u9_+Oj8V zIyNOzk%6SylZ^F6x?=tPW;(JV9!U=NM-u&!#Vgw*eP(yODK9TDSyjENRfuJpORQ=; z>jzeA`^2P3jy7G0B25UNq`o~9=?Kyb@D!qe)4G(K2nGTA8%93p-*`krzt&$!tn|PA zR49?~_cheJk`kzQ*h2~RH$fAdYLQ;AiCjGHouP>iEAMcgk&Nif?E}8VQLZT+-O4BnOiD0Okb7KTi0K zHXhM{Hvp*oy9j^W#!u9NuK`f`KPCLvHXe5YPXVa>w@2ZI8~G&wD*sBtzhdJN5AY~} z%DsTKSVP5s*QiH6!^UWivRdB;GF;p{|n(|Q!kLg788ed?MB% zUEJqh@Qyo34zz+BtE=F;@E{@Z@Y17SpVAmQBDtec45X%_d^8HMeVFqqcA?q>vT)wa zXdadd-NdqJ)SVZF_cince#tA6_kWd3a7io-FQOd zAxBA9V^~jq9Lh+33Lx5q%IXK)4drf^c_h+dVIo`zH28HRibck#&(&oHV=i+BGR>I) z(Pn_g5OQr2)N8l~BN(3?Z$qV?ydEuh%~@1rHWfLF0JZ4h(hYffayJQqjvDn|-NOmp zMT)a}Q$ z6R76b8D1d2&md@y5W8TJRge?l{j-yo5W9UEJt-Ra-f|+YCOap34CxDUP)|)5g%O<( zO5Frq5_#+}pD8YewP02si|mFnqfsxaGX_^kW6`~JMl?i~6j4b|p-ka)L%;$MO`&X2 zQ4t(LG2*gHBaFsypgRh`SKr{%ky@onqFm4`OH!Xaq8L1ID4~3J^mu4v-tCYn-^J;M zbC6g7BJ$`FZ6S3nO6EZ4WtWAat|=ud>ryySExHi-w@fKjr5v>ABIKkNQyo!&?Rs)2 z>QH>-URx>a1b|CBs3Mw}dh$Zzkxd_fC*LClovbG>BW4fFc>rdY^b@&y@*40;<8n({ ziJrU(G>Envb<19Ov9 zM)LC9Ds+e34H2tQNGdz4!~#bN*oju?33(cdGbKD;YR;Hj?qI{}TUls?jCrrZZbOC% zI}a54=YF3szj-oYfl%Nu+rOAf1qL%shn-EMlSX|4*<|Vs$Atp7QKB%%;tA)l6&L1) zbCW%4U;;E$f#lhvR8v36DijJt>%f5rL^Yhsfb?*TfuoOl=bd+6oC+%p`5U|-!o3Av zu+)k4r_i-M6Bm=NqoJb};C`0R#i;m7%p z=-8u*K|IM8opfw_#eahKb9_)E|Iz&UAyPgl-)*i#v!%^7@XsYBmq7;2JQbAW<4~l> zW6z5^$yv7G<0$DK1dnE(2F5^r+%Qi^BFD>B<@!pS3}0E(+45zJTt1% zdOtWkQL5aE#)Fy>teg27Tw zXr8FM4D$@gZJtTpB@dd_U74Bdla?^c$A*xD1r%U{vNtU5C z^~HwSgG7$*b$QKANIBd2)p+ep6g3Mh`_RSzp&iVXkltwUGEk?R398t5lDrOYKB8xV z&|t7?>Wn90D%td@5D#={F`GUl=}>Dn{c%Z$!*kN7=(iCi#~Xn}!)MLR_eS78&pm6p zk>m!Fl{2^*^4wWsk%va}>qpaR@`6s2G>f0+SDnEY4|}2g4Q%M}<4W+7jr|hOJm`($ zK5UyRc~VeJI`2N@c-cI1eGTXOcv;J<-=J1Bw^aZO>IzItTJ{6cvkCMP=mSXg0|fTg z9AWY9EwPh1c2XevGQry5F$z6Nh;iy!GnB@gLrD{6!P4W$OCe?`)f zkj@%)qt43>CX)?*UYG%0C`0YR{C*1FZr3AX7fszqO}mGNQhTc@AgfzW8+% z@s^lr&;rJ2^_)zMi8Vmi@!ium}EsK?qKVYjsw3xeEj z&D7;S47xOE1I16d*SH6zQ3dwR+aQrEIt18|lWcE>ymOG=?kc?u&JVtLV$)4k=5~+* z#^s6f=7wE6sDOD6U?a|vP@q(8K;X3(f$G>?phP7~?6gZ9m-Nj#Sc&BI2hG+ER}|ww zdpnP~gH(V&)rZEMM7=8!^@AZky&osqGmQXAbbphVG8Sg&MjQ zxOp(T$*aMIkS*xGWlFh1DuNyvrA1-x2DXS8YlAj?Xa`SE6pB-4Fot+aihe-Zuggdg zq^{g)qv~`aC;1bbX2_G1oaEa!&1=yrjeaXxL(~UU|=ADTiX5Z$dYrjBQ#Q%N=T4+>i{q z13^y?oF(m&5xdZ%v(Z&jUkKW{l17hlH_38e>evutlPov34%%otrl5>=`l+MPMQIH| zBUMTWTZp3zXX#Na+eSmKe9~!=QOEgpqqB~qEOwq_vJfsHYY94m^OGnhqCp36#u&a+ zh$w5v0T6tzJOJXv=;q*tEZ)&sw9{18^y?HKu>AC-7{sX4ci{9!R?P{t1>q%u6Chv| zB!LqkEU*Zi0HMVqZ~_EKB#UqY1h@}L-~ zi#id69OMpnoM;v0#Auy>Xz65h7RCixysV7QYCCY&QakHyWh6CfY@3nAvr!ohyYOKe z{m~535u#GeVhGG0tNVV+Xe7s{lpIRdiC}G* zmb`L~EtDfiwpqeUM)U$SEOb}t4N>ga8C9ioGD}2API2gzn@S z^N?DJR8)sd!zUwEI*e$*9d!}jPANB~I*?L#w0}jJWarVDJCn1KO#aNqUn2a(V>0>e zNGAW&#vdlUetsr@4wA{6Z2We@^N!8rmm`_nY2%j={znTRUIWRJe*^kt9xb2KFbw8} zWCWOqfhmpdBZ}%}G{)xU7%Z&2y6BNA5&ACb_0ClQdh{Zc)OS$2A*}BrrKCO%(oReW zcYTh|dSFD~MH-Ts%aPJ|v7TUOft{FGz)3opzXBg*BG$f@CI&Ga1>I1SHuwY)r1$ zMb<#RSw$3%n%Gcq=|q-u01nOyl-A+@rYCc)@xWxG80UKEx&U)rMQD0Soy+_LsoMM` z;EcJ+X~#L{3TItKa)9tI*Ad>;arl<&2;b_G`_P=S2XZqdb^WBe z*N(SUXYPjWn*#vo0{W06DlB_Zt0MF%7CVc*4n)@n<9L0>i_@l}n>7xX)8 zBt94+|BaFGQb_JHFJpK)L%1+dKF#n7hF3DYis97^uK{G4t$vk^D~FPo$1jKP6^Jdn zPnN87hm|9W$EnBCkJZ+P+ZV4Ggr6(qnCn_}vms$cUEzE~p6mNn_|>=~`WbK(dK5=v zMLv#7^yqaU_C{f@f#?kcZUj(e8~yp%-ARhP+5p9^D9QWHZt4w!406kX*7y$!`aUYz~WVXz?3{X8D^9uB(- z-N{=ZZn@e5`5?C+L3Bth!$Ds|iS9Lg{*XI$I%*60f`RClkf?JIX^bnUd&OB818mVk z6!1GPFwL9M9Jw#Iyn4j^!d?t#VTl%;BOx$SYj;tO+dwpY3kbP}&uz{_!u$e2o*&G2 zE(G(f8D?_Xq#aKRv&krQ`=hrZ&&BiB#KdGN1K4MRYx2 z<1rz(OEG%+G8a2}jEB6~Mfxj_^jEEP>I~FdKi4kG+C1!%g~r|mh2CTxWU*oz*>VcjoOU@Y`4!+LVN~23(Ch|9G@THL&y6^;Ysm=jwj8#T+q(MCxA5loi_39 z)FTjoioP=qw?4(SGezDVW9Sy0$j5vRrS1Sf^oe@q(OypdY%d?}<;pe37k0@z^#a51 z^6^oh*#zeLpy6}kUU?Go;NF0@0hWn58h8PM%Xb~ZqNUwB`!mG-Xd6BWYeh4-u$wPm zY`NvEMWf~2FB%jlI!q1s`*(uUI59Z|O<1Al*!@3U&T8_~)tgBar9KAb1q|mBWPTmh zxlBY1hCx@@Q5cO;SCRS#$lGZh^g{oo+&8tx+I^$xa_b2nQcs;iI*vh_rqJ5hH1QC} z6-7Bkxx9!rt1ji~es}bH=v$#%54qju9!h%ru=}%-^5^Oyk2?z08aef)STZ<2SN9E4 zSfDaIzLUMQZg|8o&`BBT1Pb^`MggPMu?e-AE!2)1=iMe0+K}g>iUTR~(e;6_M~+a) zgAriv*3sPmF&;P0s11mC513&O>+t~gZHe850>J(gST4?N*sZwD?*Mh1cO$Q1s*BF& z4UU)^D^Q*=xA{%vO=;ARaEA?Y$^pF4LRC^-ux?b;4QSR;(j7(1!~j=^=8QaUF3^zc zS6&RQ1(N%qmyCU~7;=B)Pkk5Jq(?)%13i{2J=$jFVx_~;E>A8#(f07k*MV4G#tzpM zrOd_0?GoeN6;Hy{y=YAOAA{Z^HFDV9_r*$#U0{MfSc{ za?ETS#lfnfOnCbjM`uzCvhD^|*9K5{S(6g++NQEd243Vab}Sn=tde9Qjw-x9Uf2xt zT$`R5Bwp%dEGQWo&{?XT&ra%553$m1G_Nx%v!Tq-f_arpwm7PiM$8>~GT|T9{CF)} zCtO&UGv{_*$FZGHp4yTB_J}PQ1cVEihIHOTQx#`T=J)ZK(&)tsyc?;2;r5vKA(7*4 zoRj>)QpXz90AoB8IrW|-9sQz3kHZ#Huwi8e0()!o0id~ieQ@hodIB%_VAs;G$3#xA zd^4Nkg0LI$!QuEmxA`FInRg!gAd{Fj4}ntX3;E!yZ#>B{7v$2IdKlT#FhkPI6#7H{ z#s$eom)Ryi#>z`WK8Kl4DYG2EqcVS8QNV3tl?*iOluyX=Ly`qI?2x5-#X)5WSd(u_ z^0bu)l_YQoNtELaaC~E!7+=fkw;{D*1FNt2U27b#C)V$jYmyn_0IBmtz#>gmM}RN^?_>BV$S^$NVud_#5-x<`Yzl z*B$){QBpqzEOg6EMr{TslD2Y#lnCx1O;|NNDIuj3*Swlv{3}0iDqBTr$ z^i0u0!NKD(5gJ_;^;)I59wl=jcoCjQAA>8zy}<1E8}PabmNMaMn3Ehrdlf1U578mL zqiPwFPbpVNNDi}?enc*ih2cWAKpI&KWRY4Riwf~ti@icR*_|t-%^o&F;SkEOTVi`C z!WH2&q!W+%b396BOiP~8ZW}nujm^W9GE35D!6heX^3)D^d>aqtlfQ_f_o6`0pQz_I z02N}Xe*7hRp^RVW>p%9na*5+O#H_F=idkVaZoWTR54uaOdv^RlcOZ5+gbGcJ0yc8hCFZszd$L38ZqSY z^?lCV6OrrX8+=5^OCX<*FY(Riz!kCJ$=fZ6Z@&Scj0l-2A z-}p4F-3x11fj=%oOI4xhH4s6miAvD@>3`!X3m$#v+n6cYTL#fG3sEG-T!%ujtrPUs z6gCc`;Zuyysi5`a6F{2&XzUgPhnG0O*oBaLz_I%as!(I}(F~9W1LQgM0KvcxG(ZLh z$dCg>7th2N_R0bBItEC+`auI^V1U%yI|fQPM&ac#qhO7}Z=o0(gHmX3^cd8FHWwdj z3O$^)LcDpt-aa#71$cKx=ecVjXT~%2`4WHhvU@Ns8bARNyiQN952UY4W-HI zQ?eK(y)OC1Y_je(Uq=0P$-Z@2?8(TfSvX$Cb@A~G-t{U*Ta~^{LT>tGHAm1ZPQRuK zoA^X9`Ws3!6>3qbS19$HQO+oPqvLR^GTDGB;fcOVCF%Wy|Ar1HLT9uiI-q~EE8&Ip z=+8pY9`kpoqhYpu^5Vs>0vWsjOR8gyivFIsy^>z%G5BH~$FK(M;ud z{hN0oH%nbrUF?!wVE*#N`VdN_rZy+Y3emlr>MOtg;VDLN}zQ+(+T@WXF?Q-{}a@P8u^s_ zW0w+GhN*8OKTwa87xoNTr0+$AJeENfsk%8*#eNtODxw{9TuvS8Fdqua*X$bb?hlv9 z;m|dgAvSgxAFPY@yD-8WgW^SD-b^`a0p%SMbFRt?S^Is~DPkKmnM7;RC&6WEzze-t z8dF%$0xaC#aG?)dovgsrkIK#@ei?mwWFWak29kJ{AMz9;`vtG*LNz7ReLfD%8u8tO zWcO)yWJbG3obG1!I&N@FOAs3RCd9R3&F@86#$BHjmzQg~L@k`I3D~`ugmKW}hw4wa ze78Qh0Pz}Tw%0H{sH{#OYykl-qR49+AT;0|MtX90@eK%ekT?emSm$CJ^(d|<5pwM` z5i;pfKaic9DY~O|Tc|;>7$bvd)a%vh=nW(kUD-y>d4%2yV0pvUXl9fw|d82 zXn-=fD`YlwgGl0FNb(@xb_>P0>jEBw-bGaUpZIojnZARDhX<-TM=y~&3)B~u@Og5; zkZR^rWu#N!-AVf7m$$GxH0taj$41r~a%^O2$a%~$x73&u1CP1eC~KA@{$Fy$-;_vJON~-ayj-u&q0Nk;DdqwIv!93x4dHrY;u{b)pZ-&xfOH_4l!YH&duhh z<)UG|#h+O`cJ81;Fcm6Qe}uk+aCQ?o`;;}7Sv59Ve2R;PwDAc&N`1q4Qb{?Ua1x`& z^U+7`@syn)ZW>Q+&l*qafnz)wjwk8f9#5_{Q130_y%vopZMJrju6PW8 zPGcw*wl7_%(N+zAjLUcmEzF^Oy2)5%1C4@^Rc zA1@bT*6EXW+RMAC#p&^I_CUcy7dps)0Y_I>;B0PoVnfBSZ%k$Dbiy z@NX?ML}!5DUB1?`eDU=%qJPY96d0m~;VvJgrw2Zlhxhk=>%e(Gmn!hzm1Bq#0+f3J za~5;@3!MH3!{@o|NHvue+Q~Xja>dDdKztPtheoB;*8d_M6t@Bz;us%szQz2%&874l zFTv}4Tg$>?ZN?*I&o3-hThUoFAciU@wcj9@h&-s`Eoq#`V)a_)A{ z^-Uo9pCD(6Xf7H-4gXh3lxQAtZUB!VzEkvkBrNWlMD_ff;R`h@D@#Om@km|}W4fr^ z5O;b=p36&q1^!z+1gH61p>sc^su1qttDy4-!4nosBi{}gB3MlP=W$O*SYtllqVll# zDOwDOFL=&JA9rz&<{Bi!LXG&#!>{KX;wwc|&nJq%jd!Xq&L#L@4e8`f=6`~Fn&z5+ z#~NN0q_X#N>mREo&J_`&JdSq5Vq%Eu-&6Rxyb0n*W&M>waeK`}=;>d%@9R)DEIJE_ z=My>4M+|XM0a5y@h;nLe5cM3z?d~Wc{k#ND+?}y*Uo56{9Gsx@xZI8031UfAKgv!= zkHX^b%yR?tuVP7#oj|gE4y}-_zse?0b9xx5zvRRsZAfck1g^HSoG>@$H6j)fEr~_q za6=O7P?(=NzgbC~Uc84+<%X*W^JB7Vcmu>$6hp5Hf%%c=LY)_4zdnoe@?Dfy1B~*1 zUq*Q~;xx`XFFzJ}K+I=Mh(Dl~$M9PepMabNusLdBE$%%L`iOn-q;X*~Rv=CTr4864 z$SV-%Ft$bf6#n9goWD;DiC1&w zt>^@c8OFJuw{wYdhKu0VLW0XVcQ&^bW1dc?pBACq?{GR*Lg}D~;0Xr7bD2KFN9q6I zI`3h)0{vP$+{3w#7E!u}`Ewbzb1Uam5&b3RpUU*RSccQN{yzsO*B>Uhp5<)iTq&)_ z{9DkjCKkCSqt}0PMFC%QH2{7a{F=DgO|YBO_i?&`VTj>QreDu+pL;q=Z7H4&I1r|h zx*zqQJUj)GoIG5Dv?hKAx+W$RQtnTg^4E&_krJ^6^b+wBr@zhVGf+C&l8Ua{G3kdC6$XYCl)dMdHD)Zz9&`#TAZXG$=O_W1~{7li6<6W z6`>h@McEytXM=JM0yxC>zA0f7*!c>(kg-oFtf_b#^61YcE-KqmdI2q@j6I^==oyaC z`bc??XxDl!j8J4Lu}eLdM`-=D%lQ;W<*tsIjE1?(QPhM8o)1eJ81>e`y?lQLdnQsUwq>yABW2>e47NW~E1+R$E|ctv6DC|4)m zVC-7)%fMriI-w&56tJF6STyQIK4aI4Um>qvlreU`a0d%(8bq7od?keY6Vbt#9HT~Y zP6jKhX%x3+u*o$|;)fY*VNJ96Lk8PaGf&W0JZZnzP(d zq;3^m3NuUoqo!31C~TqeU0^#E7VuEsClrRCEI_%>DD2K$!fsVqS0R<#qp;^W@B0c{ zSxtG5D{Na8mHUOlUJFp(uN8I*bk-{Vq_7s~x>dZRu&KfGf#o*H9_57zD_7XOYQpHJ zHK2L_%@wWgR_87~>0)>6GqO4|xaL=T? z^F>+ZGc_wkFJo7UJB=3vE*G0+9*y70;#P$f2VbgLEq*ae=J_jMt!Wp%vk4m!4aT2q zI>e@<2zx}Mk;WZ|!pK6_h@Fg)_53ulMtnkHzXG;aT+JBSM1eR(teZo%5cc<)b)sml zg?T2ODPGTD;Yrj-J#jrYekd)+-h=_K5#! zjC8M9sjwF?4!zJv|> za!=~*z<#dsT=}O?>KA)eUO4|_z<#UpYT;2#@fu?zzWMMdrg&539a$qZZ0L`n9*y`~ zY6`@F@H2LiuMDzm79o{486IV`s8D&oMY*Jyr1IWExumF9c~3w~DbcL*UWMjUV!q1D zD-v2-EN1L{Uu98&NQ>nvuL8bjP^?jT)8Kms#m7|MC0?Oz5gS$B4c-F0xnMH(i0{Ek zdD>QyRGg3I31H_cjC|HsajC+{4{jCLt8x>$+-`+6P4XIB#a9&Pr{J@;3A~1mzejvD zbGC_n3Zt2`O}r&BKh2zNqGUdEigPhg-9|#ihp*=ZN@W z;Ot2|#J!BkRpuP=0= zE9{xtPXjX+kYv~TE<)aj$Wz$O$Quz+#vbwA8*Ic*s$O9)GS;N9zZh@o=ZX0e6Q2rx z-gTbXFEMQ-a?Pak@nv~|zej+5cG3kRn!)ay^hvQQgS|ZIDzQyr=j7+tepdVs`Xj;*~-L>9_A&&f~J-YFJKOgt65toEDYR>nreI^VUm-xBmw6f{O{`486KFP?6d z*zDjFwGWCvWUzg;4~b1DP~JsiZT@Su4~tnR684C=GPuQfL>!yJ-l+Ydz)Mw}_h8WQ zJSNsHA?yP2nyyX$vADTS=Di&JALA$DYbOzQh1lxNo%~a=U>RW#X zU-f6tv*J3&9@4sMr%wKbaGy+hBf^tAb@KD#{?!tj0&K5X+(Fnw+GhgIllP0FH4;14 zbM)l@784ZKX|zrLwWw3r7m7DbepSp;*w<@%C;velr?8Gm=S+T0Y*X0z!2TpIIECuG zK+Mm-c=8)!+d9Iq22@`$`LB3|l&~wr&nE4j{5NqDV-IP+pLF}=zl$}DJtAHXesl6a zi7gXVzN0XT4)2?cu$S{Fs(fTJ&cGFRspqN59_3~d`@`?de}8aU;-TVekd zX$1Dr=~Qw=JSr$}A7lIdWfPyB?A2b8nD&Kg%6m=aJv#AtU~j6t8%kaT=ZSP+B=&17 zO4lN9C1bL6uhy&bsCA!qtHP*tpLX?`cI!Uv8;tGuCnn};KJ6ZfaqB+qK9xtU`?N<@ z-XBX|ne5YYK4!O0-`LT_#np6nMaSGg9{#T!VwI9C%#Oc;+-7c;yzKc!t<%AHl} z0R-ooaKbdV;)GKwh^Ln!rFAi}kSKQACGfk3ipR<&ewns%ovj=^eX2u-mkg?TNhQJm zDyBMDKpQTmxW!tui#JHi50#5EIB0Ub8lnYM1J#3*HPquBhm&&Moa<4!B#$mgHka6) zPq`$Ulyf|K4GtTvUQmnHXv*F>VNosRIyJC_wXq!M8oF5Qq86ti?G|&9_K2^t=4EaT zB(ZYyakS|Xo-*oJdkyt#O%By;)l*PF+9)U>eHIjuJ_`y+p9KY^&jOrR%5gvVNF9Fe zWmP0Ut`i^wr7d_kHQa)JX<|0|l0AYqVoaSjAV=A&BzIcN!8m=&w%;AUUzG7UzB{Sj zdt0N&>&EKQ<8=ZkR^Q)?RI*0_HJ2ZY(0I`-w&t&#gR<9hL?rBB%WUQ`C5kSZtKhT5 z9c=R{MWL~i{MTWY>Ea&PEoz3fyT$7`ee{T{z-geY#Yy#0T0&V5jgc#h^6)_^Un->< zZiD6Mf@-kJ(u~%5M!T5qR&`1naB`AQ&{;OCtn8zcXDmfZ>y%ukm0DI5Q=9GSg3G7-N`VxS8P)!x4s;Fnkrz5RYj)N~ek%{SB;> z({x%Ni^Ojy9*y)5u>MZde~Xo`O7xX36EpNath4iUDm9sT8kjzd>zO5%xe#}#bYJO} zVljAb70bj0fp6hgmcKOV2S`6%b2QS#xmZwJEvT(PwCUSCkBa@`8PC(=RDEOh3xHdy z_luaW=e>g4svV{O19(l|1>$ewHtZ}q#5V(O?Qf_pPrC%)u*D8Z-&R|wXxwoCMhwX3ym@#R3H=!VQk zV>IUG^`VA;Xj=grC!C{Q!P1s%D~-B$nFVUt!d!N>@bA(QEp^YoClcHXq!@WL- z`@2~mu6>g^-vZ|{ms`Jp^>!)i@OJ$N-ZH&hJ2!WN{#mBq%Jj|pDb=ldT53t#VVt42 zfMCfp`8h7ZR1cY`kOZX7Cezo{& z)z9=Fb6ZbyJy(lM^M0>iA*OlX)c1?!wg1%puJ3rJx$vbP-wc=E^@=#k^#W>e>o2f= zUgp|f=Gw}&%L8Y*9ugvAy6#3jDey1QhFsU{M;g0a<*ps27rI8EB|~i1!=6IO_GtB$ zu4%4Ys%~)2aD6fN^GH7xxWTnq|8oAVu5R&a_0ixwrTY7zoKpR;t4)70|0x$~{z9am z^*-g=FMf*?hby>Fvb|rp$m(8p{eflJtUsA+y5_m|l$);I8tvV8Yj`aM@Ke=qfwIJ_ zxp!+vmJ^&;O^|k{yEWRC?$&OuC;|KnbU4p-M}8x0AW_rcp6A+$+FD$j%V)aFwf2H} z?rzq`?ci^9->!|6zU3lIC>GOP>%FVouZ!AR(|w6XaGJ|gJLuk{rHjsYw?P{P;$+vu z+GXyOT~Cx>1^6eV|5H0Qa=rTjEu>G-0BZ>TH84RV{tNLcEotuxjdp0Hy$9Tr9Rmj!9huzZaJZdBQZRMIl^^k4Qp8s`i zzz72V!yPoPcU>7NMw-U)cGXr_ZKv@M@wLhyz&4iG4j5Nxw7a`q`()`(gEW5u;0tA+ zHryI{s$7jcSO@iZkqHLuZA&t%lj9$?Wb4qJo;UL3&cHu zi;)iEChvQI9pWLtb>eZrGsJ%Zt{2Y%c8k4$o5ZgHd&M6B2gIKN)8g-d+wiVY5Z=)T zI4tr3FAybw7mHfJOGO>vr^O7wtHoTv>%>WbpB1YCZx(UDTSXG^%VGrZYvNMCZ-}b^ z?-n-$-Xp#Zc(3>|;QiuffDegZ0%COm{IU2Q;FIF7fKLlOHzFKu6!2x1 z_7yP!=|70sfDPJW!0Flpfa|pBxYs^I+YPv0`%Do1)wbrNzglep`m5~@qrcjjh3K!A zUxfZ@djQYTjxR=kwI2drpk0PvB)nKFE=7N}+A{Q4`zqko+U9cfSDS;o_3O1aCZgBc zTS(u;>6^8F+!XKT^sU)(oGnTLQ{p7R9pX;F^Tp$U&EkKfF8z~Y-LzVU zF@_@y*Sm>6%uskJ9bvfJOX&v~?q{g^h*HC_g<*{02*ceBA7Hqj;czbT-^_499;Mea z9A{e6JfZ3;d+L{3~y$5Kf`?tMLzR0T)=QWLs7tVhNAc?aptrIC0B`i zr`=!nGt|G2;ev8XuV*;S@MebhGu+2eR4@<2VTLy|yr1Ddh7?~4`lUvG=7@g8OVhM@ z+HqQs_8ILYeMG+;@xz~VkLwuMX|Bs$Uv)k1n&>{o{RQ{k?nm9faMycgdp3HGGVU?< z8Ap3JdB5S+e3ib5zB=ELzBxX)8$|s0brQe;;?i8$MIL_HtpFY&#P98#5&rXJA->PB ztN0&CM@!sO@ODm#AMm1_AYfZ9!EHLhwH0B&VosmoB1*WT6mV-HrDs!+PTpw&gIus^& zY&F68m9qeMmlDs7WyfbIzvKG%ajAx)C7?gR>BozS^BC81z>@scfD5>%tu;iCGS54l z{v+2pv54r6+~3c6DebF01@Omtl$IKhnu$#!`c{M0oI>arVL!$_2&m&X z?hr;}ymOGQMhcg-~tA#4Bqm@J!moD5xBS2aGP0* zbQHT94SSk$r19=B()EBkR-$UaM%1c{Ce)`3{MsJiF{newdNdXASd`OYd-Z_FgIC82 zbtGU5c1OBc2p>alLe2(UEam{Vig|!1pblM}h|)T2_ISWHl+aX_Nvfn>|Pm0qSBq+R@-q z6G)$fc66~5E$Ctw>ej`%s8z?>ngY)VAibYH2zWkf(y`hO0bYpGI#%1A;JFM?7nh@) zhTl{=7wJ!a!kBj9z~k$^X7GXOuUHN%2# z24_gz0?v^5qBaNc%is)&uYfaz^==;Eo#2dM)E6NNiK8!P$-H@+UU*8ai1c+$canZ3R7u5`le=e*5>vED>_Xpz}B5KG3B4*s;sSbIDT;*wZu zlT5WOOQeW0|F}7wom-Q!0ZR6DcAk*vkM;HrSu)I+spOnFQ*@YZ{pseJ;-vV{+F0*k zd{r!wTu=E4mLrxN0=91U^m&Wo$#i04qAQk;Tg7KITlF-H69)Uc)?4_DS+d@vW+{dl zvsI#bwwS+iFulPX?C)OG8%y+c3=PCPlCl2OMl;!WTz6;ZY;c?yPq*~;E{=C4hXzO+ z5H3Y|M_JWOKgz1uN;GE@bF8N3ik^77b4|wya}@=5-*QxET8ZX)V*YZod$2ct95c7H zFKTNO%VWv2TT&~`{#8Jzj*}3Y)3a?YKUT-KE{>&RA_bC_PAXbos>@9FCN?l*`=ETT zo82Yahf?WyUz0t=siqU-{qba?i&STvYS#{1LDWBsw7cz4I9WIWd0 z){Rl^?d(kSC(?;nZ-%%c))z+}3mhL(sa3I|UNhFsbz5oTKs)#s#=0#M#y-)Fq3tlw zj`v%{#qkv6L(ca2(yeKWN~O_j3sp+6Q0T!*b`GevTe_802`R@(c(&s+Un%dnvpYK% z#=6eNd(kH(;=M9M)iQ2gd!na5mL5#T$IWdSOmBkD$W&oF9kHIVTy6c(Joj~M-V&%d zo*YYuum{O%lY^1i&W*0cEH=lfg9Jw}7bWA}Bw?&KHMSj$44eHS*dWfL#K0!ZO8f(9 zV{1XSswm!#=`)r=i85YZ%fLXqzgzUh)0^xzrc zewbW}lZq=5?+4woCKQu|n3W(lOf2wVcEbS0!dNPP)T}khUTKhGnc362tt-ycetA5V zg4v7K{_eK^EwD_nFy52sS80du#I#PN2Fw)sQFxxk<{%|j4?@L#aq=)rV*TBqoET3N zc0$tZQxq0Em5TRm=p8zl-0j9hyqhMHSks@_JQ(NXiHR-oeol3E^~O>uPM#3!OY{!O z{CFDvAl`w-MC*XrwTV+wBWa0rn5b_{Jek6LB{oY#%Mu&oB&3i!UzX^Pv%*PCPOwvE z48pU=WXhTp%;*4l%-wlb%Iwd0SkalK&PG3^?-fgV8f4nDF-t_7k|yWCoN^*? zQt4ErV@dRwNf}p{lzmuXrWeNH-{S)R&Y?XO7U|*X^C9-H% z)Hfcv@7c1;XMKWUS)i%iRCdPkZd)cT$1R9PqXP(DFu@V43PlCfH-xEnxiONkly<)%_0B&XYRi z+E&MVW7{~Dvhyv`S0xb|bfw2;EHVd%l8K&8j;uw?+Ns)JGPdywAcX55vNM!#q9SO0 zLxSQwJ9jD1Yav0)=W$E=?mJdCBPnK?E?&CszKn5kolR8327k8A|b#fc z61tLR%G{W4YU9;2J%rFL-rIyZja8w?n$SwMP0E}ohn-)Cxy;0xYB|2;v4H`~>jkmH zY|nC!R-V*07fD%do{~s!I#j+nh=@&Af7aHt<>dH_Ut&Y{g4ewiep-GfOpwb~Nk}Bw zPvH5HCP}3o^!6G@9#ru0ya%nmt%nfJ3 z(G2x>EyCtt1L7~yWhItwJ)7%Xne3*mgQZ%_XEniJ^>-x(kRz32{fHUmxjwNjZ{EE!%B12*c zxGst*#DRAF5oyj+SYhe;_1ZBeX$HR4iM7OO!S zl_X%Ub8l2W^%(`MK1v>GJu22n4ke>H|hPi!Fm=s>lo}D(IHINpi}$Vv4iU6pe_bW};t8k04CylT@5q zDLcVcVb!38-?7-R6U+k53dOpadmv7+LsF+c6$>i@sxu=&d*i|nx>sG zEnEUq14D~F8`4=lQz{}}Op|zbCIA+QoZ7Ic#QU&Y7)8(6y3L(cX~yW`Nm0!SwBtSi zD@92#piBvy4O(kS_TY%3KTVU;&d6%YCaaoO4p1n8{@6KL1t8KXIGwO_rI)jDt5KVx zYF>n}$|kPd5>IaIHMiQ71FaF{R-h}LfHa63%qk#3jQ9mB@4n3*m)@|~MeFJNaov`aqa9))XFNp4V{dpI(cCsh=Ojlcmp3Stl9C}d-ZX%rnx z75TTgY@U6V!Z%5BQa%uK#t{T$rkkZHwZJXI!=8||X=CW|k3ZUpIuN_ITm6j0MVW(9i z=qEDy!g0vsOaoOQYZfRP4KZ9brh2BORB8~lTkBh!MA?uLl~cf?NU^Roq7Q{6Y&J=e zYh4fYxjLRQd(i;f4-cGL!r;P2XJ;IS?4ASd%y<`Bk;9ZEZx*4m+xAA1zokz;Glro$ zh~G-F&N>kGThqc`axw>rO%@xrd-K&M-156kGNh1?<8btdu#}IU-$j)Na;~hgRFl;d zG(bUBcX>NQdnspAx&*vCcNacbSxFY{pSGBN+S zS)HBfO^Fnr>nI0+Wy?B^Wz~#BCd(R+Jmxr;E3lk))(I{f+W0x>)7TSV!8@mnMOY@M z<}tS;r?kCaU?P@or^`)oyJLvT1&^V3_KhwM-SM@O-I#qfWYbPaBvWbZ0%mC<0}K7{653TI;d=~w~@VsG7+1`Uoo zqq+_pkT=1?2YX{l*eLB&oY@XXinC)>s5}gKGKMcrl3mWYx!lz)au=3e&YFGpg5s#u zI;2u{nn~FXmM5CE=oZcl`_n1uS5OW~Y4S_ArmO=USp+^;jx;AQX1G672Fnyu9ZrWp z9liFYXqyYVEudXMx-)5<@)nMmN!{2GShlP(sD*X2(`22LhLg4SG0P;Of+O+$s# zQn7U9hO=or1H2;<8(?rm49)JUuFTsqJR;{tQGAzl1s~RrL*al z-n5WT&BD+jsDCiNGO6Z-XltQE5fsPXTpS=8Q@OAuVv-S9=CBz@R$CHDv!Aw2mcw^S zsqX!p(jH>DR@Z=sTiLr=s1H)LwM3IP55o5DyF;V-E-QRDT{=Yd&Tctb=N~r{{z_iB zvcWCFo*A~fHQpZYp|P~^R2Gg!2a`36q^5@G!V1ey31(06E7!_iBx4r`It){r0n~&Q zj?PRn;jXnNw%}HbL)w;&Sej|F^OY#}`pTWiVth_R<(HdV;w#_^Eh8eg$O7SLDxFGW zS>}liBCU2~h^(p1g(LIW_m5l;q9_N2D#@lGnsVf?n>{F&o;}DV*QC2vm|IEHyz%aW zHs!rDA0qI{wNfLF%g4>Ny37uIb$p;VHYAp|B$M>Oq99Y$1vodRU{#?ckszfSFup3~ zu8pQa_ADMMXZu$!;y~dYXg|Tij3tluz$^swX8B+^c)OPD9J!$;`Dw^#>7z7-R92W^ z_05T&h~vzmJ_K@j=fFv~bf@G}r)*RMm2jYEgS3{8!oy2^@~Aob-@1 z53v0`Iut?i2MT@EHQV3#DVgaHI{)Zdnv=0F@-zgfcNa<3bFd|Ne!U z&B72olrUDaCSJy~g%LTj^9cwphA;dm1+p8CK_}hNP8?cG;U||jLPLG%P%m`a3H=fV zeeL)trAy&Wz@*)FUJs8njdxOrp^s9Mtd@&=pci`EvEQkgb3a;nED16rlV_#K2*vOv zAEh|Xrme}i5lZ5L^3pJFz`r<6uZC`banVHms7*<>JpePNp%kTq7`y~tJskw*Fz>;C zh1T%P@Q?+Ac8JME)3FPtZ$gLULDF!JT}bsEhUYP%`Lobha>Gt9U+Xa)kJBNeooNx<5udKu!-oTE7q zM_`o(uY8iwR&HvmOz<_ zmF30%J(e5GLbDgDEI~869)M5Spq3_SI(Xv{X7c{d4-S9Jjw@1_q$ssyrWIf-+ypI? zpnvqv)M=ulgsHKF#62Oe&M_#i9}4V)3g5S5eQ#0H0Yz!Fg-u{nM*b@eQE4`j*gZV6 zD8SeR@x}1&gAe+LyCP5+a7Ym|CL;H{)^6)xY$BtCnPO|5=9MKRX*|tiz^6PPy;YC5 zQqaW1&Sl2Q0O|CYI3IE6-teA>&?0^JkPYeAoX!oy-WGiEzo)%C%yE zR}b3eh~bfgcj-U}70%V-@K@V$MaayLZTN;fo%+++E3M0N`zrpm^Wy+Q)zV1~oq&=S z$KPLnKpRLp1UQn{O?jM2`_$2!{_JC;ZTJNOx*cf*pDkqL0mRfoPOb!|`Uj-(4^D6r zN`sl$ouO?H8HwEbNK5|0!7cglLWmDeXiG%WyS!gW3k_jA9q9G}_TxWw>vHPBB|p#{ z%pUbcj+$3kH6JMtZE%f<*66NBPJMFSNnkyICY%CZAcis1y~5`YF3Q1_=yVB(f6VqS z1)OqleybbrV=Me&bVG?%I$C&3+>iK{lDw8}5=w|_5^f93fELkiJX0`>jER0QA)}mK z&V~-|$t*GG#&^gTCgiL^+U+6k!wzP*_KDKF6>r=#(TUl@r7+nk&XrDprr5{d`xJXW zqK*-y+$ktsI???)U*8-mDEM%+nI!^G70VhaM+OD|BJJ4%&}1QBDn<#o6*Rd8|CbD} zwb+sSMJ~mPV)z5u z>b;*ueY9w_oYO5gUGmViLmXk2C9YO0cSc*mlSGHek2<3k8C-oJS3>WnOJju`9Vv3a zm19Q-V&%bo*5O4cCuX7z5wh#H*1$t-L=NV2-rJHrMg%VzBf{Sg@t)qfVn}yO0T}r? zvKHLAHqr!;DxuqaI)0{UL6I)m8qMuA<~UK#7GmeYhvo2eChr)fLA|TiYbZu=PHgG{ z*}UbA#0PUF@os(1A;t33btrqDL&duXGHj>C9sc%L2H#uMSkh8U+gw^s=zz{?8}ft( z_Av2K0sH&7m~eLD@B{Wk2vnS%Z_VyQy!Li@mO33j0!uFj9?tdsxMJiG)x=FXUCnhvZs0TQe~C<))~AxAqy02F%pT~97JPE( z^bP^JKjNfd>!$bap+^V%)a2nF0Uf4zewq!vsP|B>TOOXVy_@-&X*tJA!O*5shl0p`cd@;U>MZjPTGKslt1+y6~i50R_If4Zm=@j$c@s#jh_NEh6|GQ}QM>yXoy?qD;jveon`)V@^f7PtBJI zUt&hkKE3)#OJf8tqtPn^3xQcT@mA>>T)IhU-hPzZ$Z}FE0zn-45PFiYBdrY5OdJ)# zZiQC2;swjC_-)oEv?AX@rzs~r`a1l|>N5PIs{QVIEo!6LEwv^Jt@pz^K~+8pZEYtR z^1ATSDf!kE?P0uUF^9;J<3h(PV&XFVe(NIq+Uqj(vIW1{+98&JvKqhh+JRqc6@^RD z_Db}>6Q4EUT84jq#1x`E+nv0ZURW=wcUV%pcA)N~@!5$VYqr`I#a5~l@~y^yEhJZt zedb8LwBN)RxIM8kI*aVZf7T1BykkE3{mV|eC)=PE3&GI`P~!$jDqSF7Mt%TRLNivr z(|~ba^FjCdDEu0}7=FW^W^>qNQ->5oOvDI0Vc2NM1Q9trltOM9@+SPDzEV7k$P@VU{5PJAiPLas}A6g{Z=+M#L`xmHn z9DzQQEs!*m@pWV`L!>P!5)IRV^%Z4px8tY3BhZbUbqDT@#et$){n(!tyjh#FV>_FZ0iUJNUC(1I? zw5(8o%`b#9h$ENr}c#|Q7QQsfpdV(ngU^YIWMNkycV`B z>az?noUc-Mpxz$L=#M*xY6iA=WIKzwA+mq!3OOut5V9kqjhr~7`*13^0cEn)E8Ppt zIC6v8Y9k|l&?(4FHLup7ays{uUQ{+iqi0P{drCVS&-S1c4nz>l&@+w>&ceb@8@&kY z#i~gPW>0kT$A@wTmMStqk?HJ1Gj`3y;j}0E$1*5{i{JQ z4Wf|Jx{5i(_Z~iMk=ik($+_Wo0F+28U?98$?|FBz&2$+2k=O~)w?FC2A2j#qJq4;g zj(<^sCKJ(PpiW146=tuQ{B79V<>G+Ab;Hf8$5Z*w;9mt;R>di2+{4i)Dg zO1JcmCG8+bYj%mP*->8%`=DF2^hzx%y?)3oT3V$Rl~(aRgwC9uYE`^D-9*E&@TFbxS?$=w-dWH(OA9_lVA-q9c)JVQc+v)*nwBfE+(B4j_HyKJgGdzP^}&%@Aq2%u z+fj;QorMse;uiaWBD0!~V3+9&Nw=tPNp`KVBCCY&3oOCB@H7*d9EOL>dajw-q^F4nirY_(FU zHdJqYZ7ACgC{m%gl0rkNlz7Hc=Z823q+=24Bpu#44NgXc;~yDPOlj>W4%LPoguk2m;4XhFVrY z->i{cwa-1|Zr^gzi`Xg9WT!bK)kEHlB+cG8NAOR6QCYbh(4g992vW^*kgWrs>>V5B z(WRZ0y9zDXrv^=94vR*+?y0OZ`y67t7NtSaI!JvXO^lVnmLS_CiQAf?+5MpP^>EG- zM)zU7GlkJShdx`Nerwb0qc-~-gEUAd6l5XPTMAr6Nba_6TNGWE?2CM?o)6e5pysN`~GqP@s-%F%=a zGdk6@o(GnB3HP-d{p16(;h#E{(+t;1A{{Dzpnn8Z&VhriTBE%OMH})<{PG-&ybhh9 zQwI;HO|o_A6z#5CZIIuh?u+5uvpY10JCr@04lcB;N?ODF70Wv69ouyh^;g-V&Sp{D z*q{zQ0^@6A?3t4cs18rV<9Q@2?l`#8>@!~J)$Q?k*6Jj!%a(y1emEmT5-V7cPM!`) zX?||RjF4i{8UN@7%?eSi#VW#kf}v5%70uDH@!^5jbZf2FM(XX3(U)uF=vniEJRwEi zfhD=&5{YOB1&TlbBotITU)AoYoZi#VqoN zmg(BFWG(pRTTlo0&<9teJy%Ef=->y)SR+Of*~*e`=KptPQRqqPwr0802IbbkUS-J6 ztZN`ApBymSMi8&HgL(I=&a5CKQ=F=vp`!4A4^@*bJGb{Av|W;7>7K`O3TZ5t@*u!k zXfsj4h$Hln-;E=d|KHX0QCQ@mm7KA~;mZ&+vpouV%@js4`wEGskUgT~ z9R}I=i!`Ce)-c8jhOf#NP+sS}cPkjLq`dT{BQm*tl~=to&U9Y$l0&CpR`l62QBW*T zRNC3e+lM($Rb+R|KI$VS*oqxbA#lyb5k8iX+Y5>}sWvgZ-xh+7B;`rdc-^xbu-6v3 zn{;lmW%Y9JM@u(#HCt?20|S_?R^(Ozy3ZJM&1)aAob%)9HnrL^%nZz)C_ejvN^^5FHo zcYXytEg9J8Lq77pw4tF$pQ0L?+1aN!w1CpAcABb;Zir61gYgX)KLBQTf#!*HF3w|3 zYja>ng7SDle(j$2Q#1l=*ipz3hTbrhyDi$dS|J#j82!qF9ZA{;Sk_Wwzr;hGwby;j zu;K4og3<=mT9H?xA?XAxUqvFwTkxqkRI*MDDaMm7WV}s;Jog}>Nsm(hw2dXq7U@9S zRQrHR&SHAm(V8dHjIqgQ3< zte?K}O$R?T4)SG(C}^Zr=Uo6!%SXT1APwNd7pIAZ+=^(N>@)^Jvd+L~sI9=^3$g*0 zNE1Y!IanI9jQ>zu!R+Hy8hHCO-5!ZUYgr8M$sS(m^WRMsmZe$&v9xUG1x^cIx?Btq z-*2t*d=fuylP$7bE8kn?@M~D`$&~Fp24;n0_aKcKMDNhz_Qu zh;+Tvg#nlM1_#;`j<+ATbu0y@xlOx8+o@5UM2A;nUjQDvS0n*5)+Wca)vz`;~ zh^F~m5utgI2!#j@dLp_O3{p}zio?tGU=?MCH-k<06^Dm!)562oxFe!afKo-2D~RHc z2+k}No`?vK6kDthTO1Duy?SxzR6Q6h4xI@oD-U|nT%jn`JjLNPS}=fGz(WK>GBf2& zi$VpdZRCbeMjE0a%O@bg_wc_yL3okg92%MC7Fw{%5PDTGyxAil(To7PQ5+tbjphum z9t;nUpaVf)L`Mw;5CCEiKa65JY6X8D+Nt(&}|Pj#Tq1q$a?8< zn^wj8T7!`Z2E!w#N>x|oFpI2!(zjW?BMk)$ye_6eMEoBbzMVUEdjNHWMq<_Bkuzx^ zrS*Bu_d1ENz8O1!dpbeno!gMunj{C08)t>sHmFV=zp&fhWw(=Ybr;hbjVj=n#kj^iRXc ze$VaIs%bV<2diB^w-Fw>9&=EK*^!+D!!&uMu~|<;xOf1GAqX2o9bm>_ROPUxpUjg+ zT0JBz6c{yVhDVT1eE1ojT(VZu$xZ@8J{l-YuBu$G5sro3D`cmnU45F$9)^YL7pn6VLF&K{OB^ zf!S!)9*iQW`>Q?Go&v91Iw3iX!C)>%aC$}s;D);Ly#_Qi{Quf}4uGbTZEp%8Ak6@Z z3KBsDrQI|L77%G7f+#40B8DVL4~8IuEs2U^M@8&{y(9KTMG>(#L|yC@yJCfBcmJ7O z0zut%|J(O=_rL$5+&gn;?#!7pXUb`FUoqq*4BUW$+h}X6bExl-d{q^08mf?41yG$n z699Sz8S0GSnJ&UADo9?3=0I~G92oa|b+omhXh>n|XhZhv40!`tAETn4gGQp3N169E?6}Hrnx41V!k3d%( zR@GU8Kv%`fRM*oCCg4mpE0>{`pky@S&_qzC4{U8?8hQ&u*e2jCgB!qQz{C(Km9(f9 zdLEU+P?SRsTWuYLOkynOprHz#l>?oEo)FYUTvgCrMG(Ls1j>UhhM|nAQ$0h7m0xYe zq!AMlgw>R1pfT5|!s>DfNONoufwh3(`vB-`Q-B)OErFL2It(!ifdUkPMzw=pRA*7& zi4;}N#zBXg52OJYMAT8&u4%4)5f(RTCa+?AH z7>Hz&xtX47#5O)6hA+{9dO(f@Gz`UcJ8gK6cn)_}e?ot#{+Gc6v@#=D5M`+bo1z+# zBD`OQxoeqOZ0pzU()etWuj8HI)4l5pAS6horXK+yu!{o&1qpeMW zIINKn@uKg~7%{XRwH~i-8qma&%-)n7*&p8i!cnMk>LXI!NDFZjEZ3-__z1d z{DoM<67XOsR6>^dIC#J=yFt^3W7l=E~SW)6`V)}Hi`?l7s9jz)jWzR=- z8tss4_Jp-*$6@_EZKp1k6N@CL4L^s?y>f$hZ-DD;Z%^$|Yy{Ny&!=~X-je72 zks7-HK?r`_g3cHfmI;gs6pGOZ^A;M?-;Bm+NGOnw(U8Veh*6PU8Z8cFW~u0w1_2r& zSfUX)r6DIpA*Q;?h#TZ2{0a4%Sr$k_5h=Q%)9K-cjK3J_?rL_!gB0Y2$7ucni`vUc zPtz~Y0P)4mZhE?iH6d(g0CMC?s7IXIg?I)j)&^<9kVQO_hBSXs!sL733ZW4$h;T#3 zYtU$9;Y~*l1V~<^rw$;R)kRDwLX#My5sr*BBzQ`~XozhSp&RlgYl9e^Z@*_@(DIWT z6Izaqf9AtGzwayqO%bu$dOhjSwFyXWW~u)iM^kxybB+IheD36TTDF>yws-@H{%1Ja z$+xs@-{0BnMmeD+tpBy3Lt?Q1TF_~F<9%%%_ph^{lNV`H-~TQBfP805*#G`AV|iXn zi2r^fWBKfs5dO7l7I|h%X#OfKi~M*?I0$>IZ$l+w|e$whFVkor&e1bExOt# zzNIP#>534W-fZozPFI_v{qLP=zHS9Ee+>aX>-YJ2w}eMinU3^^ND=&JczVl^wHzVD zp78g#LKEkIRU4$5P55&ha^y8F>-Xt&AG@RMhx>5ny3G@C&9?)YC`na9|R*`+!7vQ|NngqHTwuO z+iCtbwwgImwUxtf9ct6;f8~f|@!%T>8W~XS8=yPVqtoCH>URo_VFZ6BWEvfA>F_rZ z{%qlo34b_fCFNx(tAJ!crjb!JM+c%Rl|&BY;HqMTg#aYhHATxnVoRc9gksS^8wH>Y zP_P-8(?R_fYtBeSW(Ed~SQ=BMve#u&8L^!K?Xf*WzI0z!;CeQ;y7(BQ9&2}*+ z5^!XrF2op26|$KqXsZg^q9Cpc;?SRk$xH=g3K!QBvB-gr~*{bB>)SkFZFfN1Oj(rsvt9B zwSfBMInDMa8o@F;T|Eb(0Gfm7Ft4DC3B?vD&=w3J&}Aas7SdHC4Fal>re%vPAaqsF zRpt&v7BmRp1tz-Kq6-cg0cI$UtjdArS8enbqH;P>#~4+f9LQr%CxQJE`gKGq(hzc+ zP^lm}P?F?5PAE>6#Y&PwVx*F^6cXe^Dpd^YL&ADGJF<9=xFegz#@Q@B3un7H@_0f{ z6xUgR<5A86k$}e%3fWu{hc6Vfc+q@k7a>c) zp(`$Sfd)o9yYO9DViy;VfFCUq^If57e3nSW#o18;XI_*m8)u1}ah@wj?CLD!y0V>l zEHR(&DipFf(JU^DCyt8ZaiRr67StmU<540Gha=>P#Q+M+*@Z1~bz$+v0!ZTv#8Dz# z1ekPTN3(e%zKaNIK!8L?i+HYlv4|@YaCl-aSIBYY3%NWl2X_(k#T-r)pUZY;aXBJ^ zSm+wfb9Lr(oTFV`g#2h1t_u$r^ITncLT9cR`ph+&%M*#Cxz15+0XvGt=DG+(LXIMNlg-YCJ15^Ljav2QbAG*)RE{W zij3s(Fl-nJ3;w5z_Z7>a8@{8at?5oHw%xSi;)yZ0&7IgU?+*+8`J&`$|8(uZUR~*rUghgPnRef1PIKK-+qeu8I|D_>69WBI{g5ZPLilNr^W%|1bxiq z{pbzHWKk3r+|Pr}bH>#5);HFR+UA>j*y%9q=Ia$sHJ(=he)aD;3NzKQmiH=+d>9r9 zL)a@JAwUod--b^SN~B`3qbLCmDuv%KU7(DwQP8rm|5q`f9cZr^hRIttTeZT08O^uP zQNDigHw>0rE3M|YthC@PTx=*73jYO)`g@cTd*{SH%Kd_h!dh|#di zgH?}I7Zq_s2$-10^}IRF3xXsl71;*)sLVcyW1^5R9QuLz3tU4W6^R~GRMzy!6arau z5Wk&NC1ioA0n9&;&jfOu`L?8ysyyh_Y2qIjtUUk+*cEIfyh|J{f~-c6p9vgJ0qsN9 zBIv|#WS4@(jB3jyB8-?;WK`eMeF-u7n#UR-@hf4Fk1T35{bG=)6$u0o#Oeb~n*9d| zmz}Sj=?JeRwaFF}POcI|D>PkbRXzsLBW;`7gv6)lBV!RN zVL(Q_ZG&2)}-0o}=z-XE63c{xrzI z%n`)l$bAAG6+*z+8Qw*`hWvz(We>t?bF2RtY>q$$ssoWRIn+#oQ^Ewk3iO8BIk2%lL@}tHYI;X8M8z14 zhCg<4h`PN&FoTd953)iZoIy5c%~<_DE%~X&4B>-9}}U-$H{^)n03 zj6@1?}K?pIF z5BYnuU=$$w(*fANJ!|i`;X|{?-{gk_mxDmz{7vBbFBpF+24bwCIx-o<;^%^uL-?9`gN8HM|7+U|H6$?LOq;f9*&#SWh?>piO-Q@mk!0FySyz+=l! z&!DJzR^y#t-hI=TH&GJkR6KLP_vVy@r|r#eSzP;AwD9SX4wt!CosMsRHpQSa@ODFO zgwwkI6HdSM%6%8{YQ@nbb4zu}>GMWBxOpexs%e<{jSTjT`KG~B!4CK6_VqVU6_4^t z?fjg+A>?H3tb+5CV|=8(F=wxx&+fLC^SXu;ScyMLEKR88k0%K`83$i84RWJP-5HZc zlkAQi`e}#n#|c|AZ@rRD=#%N^(S6eOzzsJ-1IR$Aq_s-YB)~`pZV7#D(S>S;w`rp0 z0dx|L4z#YNrA?vW7AS)OwGGvTw;;T=$E?cuo%{C%lAm{+;L|p}91lXtt*L&v?>cYX zlhqBkLB!L_SVKZEFj-8<5>i0;BbLe}%)zlj39Aimg0gBE>$5o^&tcnfon1f%LO^7V zAd;K(OA_4=(yCByY3t%*wKs9onN)HP9)ha0qz2&rxL=-co_D4v;?#jrPfJU4OjHXo zRQ!5!e5@on#YrelZ~|iXl!$wV(?uv1c?|uIr`gdP8 zSl>O`J9P0Hq2%g0uMEn+EQSdD`Pc+f~Xui;O{e+y&X@ zd$WsL&pfaTe-Oqzd3o3SR@Zk-E*VOVLae4)41cE>96;$Ewzd}ShV{~*_pMo(!CBGW>q)vNlx?Yj(2t3 zKK8QKaQ`dA-qqHw{AFX;R@XNaAB;McRNpYCJZ-E+*WRmdMa9+4J(C)@$74qLo=qMZ z29_uIqblsS-!NFl2`ijk@zi)8=TWMX8-G}S?5F65;#6~f{M@jLJlh2~EH8DRdzxie zyxnZBfWFZBog`_`KI&UP7NU3=i>wnO_r%iG*V7O8@_S&!-gK1_iz~G=U>S%a zmH=IW!Tigrb&>KFvEYgs|CXs0#I9&aQjEJbPyK@>5)cRieaA+}3I#GT(<4}g@z8$*9KMoJta)8EfPxULBT&macwoCj8MrEs){9{XLJ5RY@C7H1LR%Gd? zi>6OnG^%q#!79HMk7Gt&zPmhlm#%$j!S&5{J2G?%eqJ1QW>kBv$I)XSu?Kf$I6d4- z54yP9Ykx%LaYst()|fYE6W{b0k>94?r>KfA+Lk2ZjoXkXG<2xwv+!N*9c}%qBhuIV zb$h5^oM)U?yr}n!kF|E;MwS6XZP#Q-s~A1@`;DxutMkmBa((=+@tGa2yA{rkc$778 zYWvsuPGR@v_jK678CJI6?F+kNH>G#su7U;pNtaj3?HdAzW_RLsDRoT}O%5(vVYt1W z_0+TVMU>1rZzEq`8hm8-qUnc@c9M08G_&1z&c>GCWr=Hl=Zg~x7wj;%-ncpXnZPox z+SYGnM-3A}u8|vPf^0GW*xYJeZ+T;ksK|X1_-(l5 zduMb_Nv>ji-L*RZhko5Q8ryEzIB~T6!OW;}k-MCx{v5hu#E~>x+gEjorMC0z=k;+J zSW-RBE9W!T<+TK|eSigAZA)ma2C6}wN z&6wRvy&TrTa`+fGqUkj5@=Qro*oa{o>)&@5qjpU%n2@P@9d&`9ME)`GB`v%an(hs$ zsF+OLuxaks!YQx>v{>e(4n4@M`JO+SXa!b3*?5vwZk@%&!_ga-R9K1dfq4OW{+WJ_ zs}QVK-!5~iH4X&oqEsQV62Z8IQ452$X|apMIgxC(YOx!sUff`@8;l3xf$BIcc71yJL5g+w>VGYVN`5+~!R#a50?i?1eB)#^L? zb>{jdRUzr^9V;qjqpg;=THLx?xL|4D#S<^5>&-6_M>^WOy(^WLCr!$74ZTW-V9oApj zYmv6dwdS$tv{&zO8P;!%CvKQ8n=+^VY*(^R_hU1S4zAm*rMJ8;=0l8QPF{ES?(xI? zgqAw7N#RQt-yVYxY)-}sg zwpq=~GKUMpSMBk0)jgqm?8NpR_jg^tX*y$&_b@(tj7|H=h4nV??%4NW#xB_vmKBpE z*|=X;+DD7Ffz;jBP3dkN5Z&tN?tq5sd6Ug0rW3t4j=kTfyLfGB#NepRQVXGTZsy$^ zZ{EFblfTTS`uzIbOV1;O9<{@@S4?-KrP0c1g{hV%#R9?Jm$y!IpcdctIB8(}{Epb^ zS?)jbM=Y+yuI2k24ttZkUdO+m(NekPC9GRn;qvwF-f10qCoZp9vpOTg>O;RA%dH=M zt>q1?-W`eG@1I-qG<972XHQ&~rknZya&5PDOzMMz51(c|Z6$va+q2*kUPm1;_wL=) zL}7OC@|8ma2Og1!TIG*x&F+-(!b7*v{o|%{>mo|>XDkmLGc>TD_tCzmmyaE;EAJQo zIem4>;l#wa(}Pot^)rIbvy`R*xYE=Q*gss6^H(oizsdn>Fr|5lJRByVMxIcI!qRKn z!~>HGd|orl+KOcW`_JaMDelz#B9&!DWs)X27=&%`zPI!G1iM6?CC1@v+O5N@mDi`< ze{oPeIc^Wm)p%Wx)fMlY$B-L=#2LxnWH9fk4xY<5kn1&$Xc;JcnVJI)STU*+JbnEV zwE|b>a)i1o^M{o`iv-R@|v)7gNXXaQ4s(P4LEx&jzemLK9fc?&z-rL^I znQ~Oyqdl+u=dE);xsLg`XWOo~9}cd)ZhF^u!J04PRTZ7RYdp_Uld;ay zvhH!#M>nk?-znQV?Ec1+>++(P1@c96d8;l5j2)knO&@9cs#D=}){K}FAGVIX;2iw< z;zt={kYmT6ubnBQKj*b;803-BZ{W^ehgKGdk22|%ihcHX>?e*J@AY_br*XHYcB!zp zF{p2Upn6HZl5rnbGOC-^9xt*;j}2VEYulW%RB7KD zT^BMW)Tu2NC35RNN_OIJ2A-Vkd$Ssgqi7Zv z5}PP?2$l&FlbMay4S7lfz#sJ$2w|=_3t>pUE9bp>aECPoJ~j#36JJe&Mnaeg{}u!^ zwv1wI(To5Mh#N&PxJm>Ad@Kt@Fl-)=M~Gmc%NnEqQT+q7{q0s>Q?j#Ni!$Kx#DCa^ zxl>o0#Vxyg&OgJk_qz`F{pay58I(-F&{X#Ghq_DpU)o`N>cbnWN_`)EoTA^%t@*pB zwDs&r8>nD8EnoGfaI5*LxYvoXmbZt*zbaZ?`I_1OldfJlbI7^8oj%WpYrUyIP{i43 zkmqKsee!-4^})O1o3)RJ>3iyoI`(FRRSKurHQxK=%ma&Jo(v0nkM}Hp^W@=|g@Pw9 zI_*+ce_FZrEPJfwQl&#>!_gA4q{9?Sb!P1d)3Bdst(v~C%jQMre%k)f|fiGv@}UUe&7BRs1-&R5GoS1;3`22OSSh5SMS|m?}@~y{nc^Ud%FGB zX0Unh`733AEnzW6E$Bkk!*$hFQ0QL`Ul0v~(&o6q8Q!Gy?dupPhn zqsY-?(L2J{k82w!O#gM_y0sE18mWE5-5Nk&dJJ zuBkp*bz|J@J8Yi1XqL(Ha7i17>i1;Nb`^#R@5|@>Bl>=gv%ouR$CIH2`vvD8EKPL& z_dcP#K$9|TonC_r{y2bRGTgI52dx9*@OA)lW}gthsm*v z;$pFu%IEbk-%R$@jxxdM z>_|mO;l+gm7L**{5K%5LPO?4G{(YwW;9bEdpAs93&Z8O9_MK)H_=~cFq6#BEr&;!X z8JfE7@XWpeeFl{quAsS%p4_GL{v<9??v;6|9oMY+3`O*=`}IMjgy|U1Do@&n)H69Y+$zY&^!mW z(!WrFZBZ=174ur~+X}q5dj11`oAs+xY>>Yn!EAd51v`QHp&&Iu_B*)kpcdRVGA{XD z+_v_E8H4m|PE;*%SB#f%E}>2`yZUW|`F13?J_ak-Td{^^#0j{u>!tf+Xkm}h4}jBz47->UiinE3{2vWdv&(zb+L}J ze(}7pZin`LrdB7fX7{)GJfy(s%f9<_IR~R6m)#8Q^Z3<;rP1?e{}LB9`F2_VR@q%^ zT%Wb;KSsE6e5b_H6>Hb@`Y?Io;<)+aHY8rIUh&@I6Tfm%{fYIui!;|9Ue$gFweOSz zd*#cm_{_as?u(witv@nJ7}muw!_hT#?3yuKXfqA7+7t;kwm!S8(!h6_yzJ8Xjh9|b zobs}|=NO&45way#bis|CK^-NBUsYpwAF{O9E$s1D>^tt!yG{MJzP%%zB#4)!ZC0G! zsI$%W;Ik8FE0ues=Pl|FOe1xaf9#OeJ;Zg_@EfP}hb+yQp3;;4V2Q(%IaM4-Mz@Be zP9Zj(-k#bPc*FKU;pUr*cWvyu=JdsO9syOE@4GKs+d3MrI4EQL-xZE;SUS_G!^uts zVS9Jn^6HfvH0J00%Vk4qWAB8Pl;6RRem?gg;G_PLh=Gq+c5KIYI&^WEmg5Wkydd6< z7dkfPS9ee1b)*;FaK2d)Iq!~ah94teNxlF=SkR^dxBV{vKaZVQW33BK)234^ z|L4MW<*>q=9&lL113V2T7ecB4%qEq@a)Pa%ZesyRe5wlf16Q(wumQX|`O7qN0CFZ*aNK8EW?6w@6rDDBgMvcmdif8xmVbYRa2S%eipg?m{XJ!&vC^EjRMF{EX5OC@eo(s z!xe|A%<(sSF(`{J7ST>+Ej&^=QLw`f3z?OCuBW-gd&^9-$J21dlE1-F_&(x5Jcjp~ zX=ldRp1;ZUdcw~B$F4_^ryM+EThO)YO$n>y$<42gGmxNbRDbQ|JIm&jTkNG*>!@^hcupB|rH8~I?Z%eko=d))hJ)|Rb%3JyKY_3;SW5M8pHtO(FE zG;t5jj@c#dCyuPDI;Wr(Mp+|vnbeRO7SFReA~4;aThLq>hFKVdC0JHy^Q;s_e!bQ9 0) + { + UpdateState(ProgressBarStates.spin); + } + else + { + UpdateState(ProgressBarStates.off); + } + } + else if (currentProgressBarState == ProgressBarStates.warning) + { + if ((float)EditorApplication.timeSinceStartup - stTime < animationSpeed) + { + progressWidth = EditorGUIUtility.currentViewWidth; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarWarn"); + } + else if (PlayFabEditor.blockingRequests.Count > 0) + { + UpdateState(ProgressBarStates.spin); + } + else + { + UpdateState(ProgressBarStates.off); + } + } + else if (currentProgressBarState == ProgressBarStates.error) + { + if ((float)EditorApplication.timeSinceStartup - stTime < animationSpeed) + { + progressWidth = EditorGUIUtility.currentViewWidth; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarError"); + } + else if (PlayFabEditor.blockingRequests.Count > 0) + { + UpdateState(ProgressBarStates.spin); + } + else + { + UpdateState(ProgressBarStates.off); + } + } + else + { + + if ((float)EditorApplication.timeSinceStartup - lastUpdateTime > tickRate) + { + lastUpdateTime = (float)EditorApplication.timeSinceStartup; + pbarStyle = PlayFabEditorHelper.uiStyle.GetStyle("progressBarFg"); + + if (currentProgressBarState == ProgressBarStates.on) + { + progressWidth = EditorGUIUtility.currentViewWidth * progress; + } + else if (currentProgressBarState == ProgressBarStates.spin) + { + var currentTime = (float)EditorApplication.timeSinceStartup; + if (currentTime < endTime && !isReveresed) + { + UpdateProgress((currentTime - stTime) / animationSpeed); + progressWidth = EditorGUIUtility.currentViewWidth * progress; + } + else if (currentTime < endTime && isReveresed) + { + UpdateProgress((currentTime - stTime) / animationSpeed); + progressWidth = EditorGUIUtility.currentViewWidth - EditorGUIUtility.currentViewWidth * progress; + } + else + { + isReveresed = !isReveresed; + stTime = (float)EditorApplication.timeSinceStartup; + endTime = stTime + animationSpeed; + } + } + } + + } + + using (new UnityHorizontal(pbarBgStyle)) + { + if (isReveresed) + { + GUILayout.FlexibleSpace(); + } + EditorGUILayout.LabelField("", pbarStyle, GUILayout.Width(progressWidth)); + } + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta new file mode 100644 index 00000000..b0bbc892 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/ProgressBar.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 73c59009a8870444f8f5658099fc86f8 +timeCreated: 1471388208 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs new file mode 100644 index 00000000..914308b4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs @@ -0,0 +1,102 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + //[InitializeOnLoad] + public class SubMenuComponent : UnityEditor.Editor + { + + Dictionary items = new Dictionary(); + GUIStyle selectedStyle; + GUIStyle defaultStyle; + GUIStyle bgStyle; + + public void DrawMenu() + { + selectedStyle = selectedStyle ?? PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + defaultStyle = defaultStyle ?? PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + bgStyle = bgStyle ?? PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"); + + using (new UnityHorizontal(bgStyle, GUILayout.ExpandWidth(true))) + { + foreach (var item in items) + { + var styleToUse = item.Value.isSelected ? selectedStyle : defaultStyle; + var content = new GUIContent(item.Value.displayName); + var size = styleToUse.CalcSize(content); + + if (GUILayout.Button(item.Value.displayName, styleToUse, GUILayout.Width(size.x + 1))) + { + OnMenuItemClicked(item.Key); + } + } + } + } + + public void RegisterMenuItem(string n, System.Action m) + { + if (!items.ContainsKey(n)) + { + var selectState = false; + var activeSubmenu = PlayFabEditorPrefsSO.Instance.curSubMenuIdx; + if (items.Count == 0 && activeSubmenu == 0 || activeSubmenu == items.Count) + selectState = true; + + items.Add(n, new MenuItemContainer() { displayName = n, method = m, isSelected = selectState }); + } + } + + private void OnMenuItemClicked(string key) + { + if (!items.ContainsKey(key)) + return; + + DeselectAll(); + items[key].isSelected = true; + if (items[key].method != null) + { + items[key].method.Invoke(); + } + } + + private void DeselectAll() + { + foreach (var item in items) + { + item.Value.isSelected = false; + } + } + + public SubMenuComponent() + { + if (!PlayFabEditor.IsEventHandlerRegistered(StateUpdateHandler)) + { + PlayFabEditor.EdExStateUpdate += StateUpdateHandler; + } + } + + void StateUpdateHandler(PlayFabEditor.EdExStates state, string status, string json) + { + switch (state) + { + case PlayFabEditor.EdExStates.OnMenuItemClicked: + DeselectAll(); + if (items != null) + foreach (var each in items) + { + each.Value.isSelected = true; // Select the first + break; + } + break; + } + } + } + + public class MenuItemContainer + { + public string displayName; + public System.Action method; + public bool isSelected; + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta new file mode 100644 index 00000000..960ed107 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/SubMenuComponent.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5a2670b1b9ccb4eefa83498d43ab0c8a +timeCreated: 1474667971 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs new file mode 100644 index 00000000..7e9abfd3 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs @@ -0,0 +1,54 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class TitleDataEditor : UnityEditor.EditorWindow + { +#if !UNITY_5_3_OR_NEWER + public GUIContent titleContent; +#endif + + public string key = string.Empty; + public string Value = string.Empty; + public Vector2 scrollPos = Vector2.zero; + + void OnGUI() + { + // The actual window code goes here + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField(string.Format("Editing: {0}", key), PlayFabEditorHelper.uiStyle.GetStyle("orTitle"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + Value = EditorGUILayout.TextArea(Value, PlayFabEditorHelper.uiStyle.GetStyle("editTxt")); + GUILayout.EndScrollView(); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + for (int z = 0; z < PlayFabEditorDataMenu.tdViewer.items.Count; z++) + { + if (PlayFabEditorDataMenu.tdViewer.items[z].Key == key) + { + PlayFabEditorDataMenu.tdViewer.items[z].Value = Value; + PlayFabEditorDataMenu.tdViewer.items[z].isDirty = true; + } + } + Close(); + + } + GUILayout.FlexibleSpace(); + } + + Repaint(); + } + + public void LoadData(string k, string v) + { + key = k; + Value = v; + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta new file mode 100644 index 00000000..1187348e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b7d03dc6e98274816902873adb8ee342 +timeCreated: 1471216768 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs new file mode 100644 index 00000000..37587394 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs @@ -0,0 +1,156 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + // TODO: Clean up the copy paste between this and TitleInternalDataViewer + public class TitleDataViewer : UnityEditor.Editor + { + public readonly List items = new List(); + public static TitleDataEditor tdEditor; + public Vector2 scrollPos = Vector2.zero; + private bool showSave = false; + + // this gets called after the Base draw loop + public void Draw() + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField("TitleData provides Key-Value storage available to all API sets. TitleData is designed to store game-wide configuration data.", PlayFabEditorHelper.uiStyle.GetStyle("genTxt")); + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REFRESH", PlayFabEditorHelper.uiStyle.GetStyle("Button"))) + { + RefreshTitleData(); + } + + if (GUILayout.Button("+", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(25))) + { + AddRecord(); + } + } + + if (items != null && items.Count > 0) + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + var keyInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? 170 : (EditorGUIUtility.currentViewWidth - 100) / 2; + var valueInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? EditorGUIUtility.currentViewWidth - 290 : (EditorGUIUtility.currentViewWidth - 100) / 2; + + for (var z = 0; z < items.Count; z++) + { + items[z].DataEditedCheck(); + if (items[z].isDirty) + { + showSave = true; + } + + if (items[z].Value != null) + { + var keyStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listKey_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listKey"); + var valStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listValue_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listValue"); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + items[z].Key = EditorGUILayout.TextField(items[z].Key, keyStyle, GUILayout.Width(keyInputBoxWidth)); + + EditorGUILayout.LabelField(":", GUILayout.MaxWidth(10)); + EditorGUILayout.LabelField("" + items[z].Value, valStyle, GUILayout.MaxWidth(valueInputBoxWidth), GUILayout.MaxHeight(25)); + + if (GUILayout.Button("EDIT", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(35))) + { + if (tdEditor == null) + { + tdEditor = EditorWindow.GetWindow(); + tdEditor.titleContent = new GUIContent("Title Data"); + tdEditor.minSize = new Vector2(300, 400); + } + + tdEditor.LoadData(items[z].Key, items[z].Value); + tdEditor.Show(); + } + if (GUILayout.Button("X", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(20))) + { + items[z].isDirty = true; + items[z].Value = null; + } + } + } + } + + GUILayout.EndScrollView(); + + if (showSave) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + SaveRecords(); + } + GUILayout.FlexibleSpace(); + } + } + } + } + + private void AddRecord() + { + items.Add(new KvpItem("", "NewValue") { isDirty = true }); + } + + public void RefreshTitleData() + { + Action dataRequest = (result) => + { + items.Clear(); + showSave = false; + foreach (var kvp in result.Data) + items.Add(new KvpItem(kvp.Key, kvp.Value)); + + PlayFabEditorPrefsSO.Instance.TitleDataCache.Clear(); + foreach (var pair in result.Data) + PlayFabEditorPrefsSO.Instance.TitleDataCache.Add(pair.Key, pair.Value); + PlayFabEditorDataService.SaveEnvDetails(); + }; + + PlayFabEditorApi.GetTitleData(dataRequest, PlayFabEditorHelper.SharedErrorCallback); + } + + private void SaveRecords() + { + //reset dirty status. + showSave = false; + Dictionary dirtyItems = new Dictionary(); + foreach (var item in items) + if (item.isDirty) + dirtyItems.Add(item.Key, item.Value); + + if (dirtyItems.Count > 0) + { + var nextSeconds = 1f; + foreach (var di in dirtyItems) + { + EditorCoroutine.Start(SaveItem(di, nextSeconds)); + nextSeconds += 1f; + } + + foreach (var item in items) + item.CleanItem(); + } + } + + private IEnumerator SaveItem(KeyValuePair dirtyItem, float seconds) + { + yield return new EditorCoroutine.EditorWaitForSeconds(seconds); + //Debug.LogFormat("{0} - Co-Start: {1}", dirtyItem.Key, seconds); + var itemToUpdateDic = new Dictionary { { dirtyItem.Key, dirtyItem.Value } }; + PlayFabEditorApi.SetTitleData(itemToUpdateDic, null, PlayFabEditorHelper.SharedErrorCallback); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta new file mode 100644 index 00000000..ad7e0dc9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleDataViewer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 667b18201be5e4597bd623f2314cf2bd +timeCreated: 1468948626 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs new file mode 100644 index 00000000..b0a090bb --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs @@ -0,0 +1,55 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class TitleInternalDataEditor : UnityEditor.EditorWindow + { + public string key = string.Empty; + public string Value = string.Empty; +#if !UNITY_5_3_OR_NEWER + public GUIContent titleContent; +#endif + + public Vector2 scrollPos = Vector2.zero; + + void OnGUI() + { + // The actual window code goes here + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField(string.Format("Editing: {0}", key), PlayFabEditorHelper.uiStyle.GetStyle("orTitle"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + Value = EditorGUILayout.TextArea(Value, PlayFabEditorHelper.uiStyle.GetStyle("editTxt")); + GUILayout.EndScrollView(); + + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Save", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + for (int z = 0; z < PlayFabEditorDataMenu.tdInternalViewer.items.Count; z++) + { + if (PlayFabEditorDataMenu.tdInternalViewer.items[z].Key == key) + { + PlayFabEditorDataMenu.tdInternalViewer.items[z].Value = Value; + PlayFabEditorDataMenu.tdInternalViewer.items[z].isDirty = true; + } + } + Close(); + + } + GUILayout.FlexibleSpace(); + } + + Repaint(); + } + + public void LoadData(string k, string v) + { + key = k; + Value = v; + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta new file mode 100644 index 00000000..fbf55cfe --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: df195403c2c124d3992a79d9622ce809 +timeCreated: 1471216768 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs new file mode 100644 index 00000000..833535e0 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs @@ -0,0 +1,147 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + // TODO: Clean up the copy paste between this and TitleDataViewer + public class TitleInternalDataViewer : UnityEditor.Editor + { + public readonly List items = new List(); + public static TitleInternalDataEditor tdEditor; + public Vector2 scrollPos = Vector2.zero; + private bool showSave = false; + + // this gets called after the Base draw loop + public void Draw() + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField("Internal TitleData provides Key-Value storage available only to Admin & Server API sets. This is useful for storing configuration data that should be hidden from players.", PlayFabEditorHelper.uiStyle.GetStyle("genTxt")); + + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REFRESH", PlayFabEditorHelper.uiStyle.GetStyle("Button"))) + { + RefreshInternalTitleData(); + } + + if (GUILayout.Button("+", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(25))) + { + AddRecord(); + } + } + + if (items.Count > 0) + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + var keyInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? 170 : (EditorGUIUtility.currentViewWidth - 100) / 2; + var valueInputBoxWidth = EditorGUIUtility.currentViewWidth > 200 ? EditorGUIUtility.currentViewWidth - 290 : (EditorGUIUtility.currentViewWidth - 100) / 2; + + for (var z = 0; z < items.Count; z++) + { + items[z].DataEditedCheck(); + if (items[z].isDirty) + { + showSave = true; + } + + if (items[z].Value != null) + { + var keyStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listKey_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listKey"); + var valStyle = items[z].isDirty ? PlayFabEditorHelper.uiStyle.GetStyle("listValue_dirty") : PlayFabEditorHelper.uiStyle.GetStyle("listValue"); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + items[z].Key = EditorGUILayout.TextField(items[z].Key, keyStyle, GUILayout.Width(keyInputBoxWidth)); + + EditorGUILayout.LabelField(":", GUILayout.MaxWidth(10)); + EditorGUILayout.LabelField("" + items[z].Value, valStyle, GUILayout.MaxWidth(valueInputBoxWidth), GUILayout.MaxHeight(25)); + + if (GUILayout.Button("EDIT", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(35))) + { + if (tdEditor == null) + { + tdEditor = EditorWindow.GetWindow(); + tdEditor.titleContent = new GUIContent("Internal Title Data"); + tdEditor.minSize = new Vector2(300, 400); + } + + tdEditor.LoadData(items[z].Key, items[z].Value); + tdEditor.Show(); + } + if (GUILayout.Button("X", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxHeight(19), GUILayout.MinWidth(20))) + { + items[z].isDirty = true; + items[z].Value = null; + } + } + } + } + + GUILayout.EndScrollView(); + + if (showSave) + { + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(200))) + { + SaveRecords(); + } + GUILayout.FlexibleSpace(); + } + } + } + } + + public void AddRecord() + { + items.Add(new KvpItem("", "NewValue") { isDirty = true }); + } + + public void RefreshInternalTitleData() + { + Action cb = (result) => + { + items.Clear(); + showSave = false; + foreach (var kvp in result.Data) + { + items.Add(new KvpItem(kvp.Key, kvp.Value)); + } + + PlayFabEditorPrefsSO.Instance.InternalTitleDataCache.Clear(); + foreach (var pair in result.Data) + PlayFabEditorPrefsSO.Instance.InternalTitleDataCache.Add(pair.Key, pair.Value); + PlayFabEditorDataService.SaveEnvDetails(); + }; + + PlayFabEditorApi.GetTitleInternalData(cb, PlayFabEditorHelper.SharedErrorCallback); + } + + public void SaveRecords() + { + //reset dirty status. + showSave = false; + Dictionary dirtyItems = new Dictionary(); + foreach (var item in items) + if (item.isDirty) + dirtyItems.Add(item.Key, item.Value); + + if (dirtyItems.Count > 0) + { + PlayFabEditorApi.SetTitleInternalData(dirtyItems, (result) => + { + foreach (var item in items) + { + item.CleanItem(); + } + }, PlayFabEditorHelper.SharedErrorCallback); + } + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta new file mode 100644 index 00000000..694ba7b6 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Components/TitleInternalDataViewer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 63d2e11a466c94865aac7fbd7aafd302 +timeCreated: 1473957357 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta new file mode 100644 index 00000000..26c9cd0e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a1c77c7ceb0334bb19f90b5abac164b4 +folderAsset: yes +timeCreated: 1471296116 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs new file mode 100644 index 00000000..dffa5f3d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs @@ -0,0 +1,403 @@ +using Microsoft.Identity.Client; +using PlayFab.PfEditor.EditorModels; +using System; +using System.IdentityModel.Tokens.Jwt; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorAuthenticate : UnityEditor.Editor + { + #region panel variables + private static string _userEmail = string.Empty; + private static string _userPass = string.Empty; + private static string _userPass2 = string.Empty; + private static string _2FaCode = string.Empty; + private static string _studio = string.Empty; + + private static bool isInitialized = false; + + public enum PanelDisplayStates { Register, Login, TwoFactorPrompt } + private static PanelDisplayStates activeState = PanelDisplayStates.Login; + #endregion + + #region draw calls + public static void DrawAuthPanels() + { + //capture enter input for login + var e = Event.current; + if (e.type == EventType.KeyUp && e.keyCode == KeyCode.Return) + { + switch (activeState) + { + case PanelDisplayStates.Login: + OnLoginButtonClicked(); + break; + case PanelDisplayStates.Register: + OnRegisterClicked(); + break; + case PanelDisplayStates.TwoFactorPrompt: + OnContinueButtonClicked(); + break; + } + } + + if (PlayFabEditorHelper.uiStyle == null) + return; + + if (activeState == PanelDisplayStates.TwoFactorPrompt) + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + EditorGUILayout.LabelField("Enter your 2-factor authorization code.", PlayFabEditorHelper.uiStyle.GetStyle("cGenTxt"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + GUILayout.FlexibleSpace(); + _2FaCode = EditorGUILayout.TextField(_2FaCode, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25), GUILayout.MinWidth(200)); + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + var buttonWidth = 100; + GUILayout.FlexibleSpace(); + if (GUILayout.Button("CONTINUE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.MaxWidth(buttonWidth))) + { + OnContinueButtonClicked(); + _2FaCode = string.Empty; + + } + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("CANCEL", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + activeState = PanelDisplayStates.Login; + } + GUILayout.FlexibleSpace(); + } + } + return; + } + + if (!string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.DevAccountEmail) && !isInitialized) + { + _userEmail = PlayFabEditorPrefsSO.Instance.DevAccountEmail; + PlayFabEditorPrefsSO.Save(); + isInitialized = true; + } + else if (!isInitialized) + { + activeState = PanelDisplayStates.Register; + isInitialized = true; + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + EditorGUILayout.LabelField("Welcome to PlayFab!", PlayFabEditorHelper.uiStyle.GetStyle("titleLabel"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + if (activeState == PanelDisplayStates.Login) + { + // login mode, this state either logged out, or did not have auto-login checked. + DrawLogin(); + } + else if (activeState == PanelDisplayStates.Register) + { + // register mode + DrawRegister(); + } + else + { + DrawRegister(); + } + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("VIEW README", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + Application.OpenURL("https://github.com/PlayFab/UnityEditorExtensions#setup"); + } + GUILayout.FlexibleSpace(); + } + } + } + + private static void DrawLogin() + { + float labelWidth = 120; + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (var fwl = new FixedWidthLabel("EMAIL: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userEmail = EditorGUILayout.TextField(_userEmail, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("PASSWORD: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userPass = EditorGUILayout.PasswordField(_userPass, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + if (GUILayout.Button("CREATE AN ACCOUNT", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MaxWidth(100))) + { + activeState = PanelDisplayStates.Register; + } + + var buttonWidth = 200; + GUILayout.Space(EditorGUIUtility.currentViewWidth - buttonWidth * 2); + + if (GUILayout.Button("LOG IN", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.MaxWidth(buttonWidth))) + { + OnLoginButtonClicked(); + } + + if (GUILayout.Button("LOG IN WITH MICROSOFT", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.MaxWidth(buttonWidth))) + { + OnAADLoginButtonClicked(); + } + } + } + } + + private static void DrawRegister() + { + float labelWidth = 150; + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + using (var fwl = new FixedWidthLabel("EMAIL:")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userEmail = EditorGUILayout.TextField(_userEmail, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("PASSWORD:")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userPass = EditorGUILayout.PasswordField(_userPass, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("CONFIRM PASSWORD: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _userPass2 = EditorGUILayout.PasswordField(_userPass2, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel("STUDIO NAME: ")) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + _studio = EditorGUILayout.TextField(_studio, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + if (GUILayout.Button("LOG IN", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32))) + { + activeState = PanelDisplayStates.Login; + } + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button(" CREATE AN ACCOUNT ", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32))) + { + OnRegisterClicked(); + } + } + + } + } + #endregion + + #region menu and helper methods + public static bool IsAuthenticated() + { + return !string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.DevAccountToken); + } + + public static void Logout() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogout); + + PlayFabEditorApi.Logout(new LogoutRequest + { + DeveloperClientToken = PlayFabEditorPrefsSO.Instance.DevAccountToken + }, null, PlayFabEditorHelper.SharedErrorCallback); + + _userPass = string.Empty; + _userPass2 = string.Empty; + + activeState = PanelDisplayStates.Login; + + PlayFabEditorPrefsSO.Instance.StudioList = null; + PlayFabEditorPrefsSO.Instance.DevAccountToken = string.Empty; + PlayFabEditorPrefsSO.Save(); + + PlayFabEditorPrefsSO.Instance.TitleDataCache.Clear(); + PlayFabEditorDataService.SaveEnvDetails(); + } + + private static void OnRegisterClicked() + { + if (_userPass != _userPass2) + { + Debug.LogError("PlayFab developer account passwords must match."); + return; + } + + PlayFabEditorApi.RegisterAccount(new RegisterAccountRequest() + { + DeveloperToolProductName = PlayFabEditorHelper.EDEX_NAME, + DeveloperToolProductVersion = PlayFabEditorHelper.EDEX_VERSION, + Email = _userEmail, + Password = _userPass, + StudioName = _studio + }, (result) => + { + PlayFabEditorPrefsSO.Instance.DevAccountToken = result.DeveloperClientToken; + PlayFabEditorPrefsSO.Instance.DevAccountEmail = _userEmail; + + PlayFabEditorDataService.RefreshStudiosList(); + + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogin); + PlayFabEditorMenu._menuState = PlayFabEditorMenu.MenuStates.Sdks; + PlayFabEditorPrefsSO.Save(); + }, PlayFabEditorHelper.SharedErrorCallback); + } + + private static void OnLoginButtonClicked() + { + PlayFabEditorApi.Login(new LoginRequest() + { + DeveloperToolProductName = PlayFabEditorHelper.EDEX_NAME, + DeveloperToolProductVersion = PlayFabEditorHelper.EDEX_VERSION, + Email = _userEmail, + Password = _userPass + }, (result) => + { + PlayFabEditorPrefsSO.Instance.DevAccountToken = result.DeveloperClientToken; + PlayFabEditorPrefsSO.Instance.DevAccountEmail = _userEmail; + PlayFabEditorDataService.RefreshStudiosList(); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogin); + PlayFabEditorPrefsSO.Save(); + PlayFabEditorMenu._menuState = PlayFabEditorMenu.MenuStates.Sdks; + + }, (error) => + { + if ((int)error.Error == 1246 || error.ErrorMessage.Contains("TwoFactor")) + { + // pop 2FA dialog + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnWarning, "This account requires 2-Factor Authentication."); + activeState = PanelDisplayStates.TwoFactorPrompt; + } + else + { + PlayFabEditorHelper.SharedErrorCallback(error); + } + }); + } + + private static async void OnAADLoginButtonClicked() + { + string[] scopes = new string[] { PlayFabEditorHelper.ED_EX_AAD_SCOPES }; + + AuthenticationResult authResult = null; + + var app = PublicClientApplicationBuilder.Create(PlayFabEditorHelper.ED_EX_AAD_SIGNIN_CLIENTID) + .WithAuthority($"{PlayFabEditorHelper.AAD_SIGNIN_URL}{PlayFabEditorHelper.ED_EX_AAD_SIGNNIN_TENANT}") + .WithRedirectUri("http://localhost") + .Build(); + + var accounts = await app.GetAccountsAsync(); + + var firstAccount = accounts.GetEnumerator().Current; + + try + { + // Always first try to acquire a token silently. + authResult = await app.AcquireTokenSilent(scopes, firstAccount).ExecuteAsync(); + } + catch (MsalUiRequiredException) + { + try + { + SystemWebViewOptions options = new SystemWebViewOptions(); + authResult = await app.AcquireTokenInteractive(scopes).WithSystemWebViewOptions(options).ExecuteAsync(); + } + catch (MsalException msalex) + { + Debug.Log($"Error acquiring Token:{System.Environment.NewLine}{msalex}"); + } + } + catch (Exception ex) + { + Debug.Log($"Error acquiring token silently:{System.Environment.NewLine}{ex}"); + return; + } + + if (authResult != null) + { + var tokenHandler = new JwtSecurityTokenHandler(); + JwtSecurityToken jwtToken = tokenHandler.ReadJwtToken(authResult.AccessToken); + + foreach(var audience in jwtToken.Audiences) + { + if (audience.Contains(PlayFabEditorHelper.ED_EX_AAD_SCOPE)) + { + PlayFabEditorPrefsSO.Instance.AadAuthorization = authResult.AccessToken; + + PlayFabEditorApi.LoginWithAAD(new LoginWithAADRequest() { + DeveloperToolProductName = PlayFabEditorHelper.EDEX_NAME, + DeveloperToolProductVersion = PlayFabEditorHelper.EDEX_VERSION + }, (result) => + { + PlayFabEditorPrefsSO.Instance.DevAccountToken = result.DeveloperClientToken; + PlayFabEditorDataService.RefreshStudiosList(); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogin); + PlayFabEditorPrefsSO.Save(); + PlayFabEditorMenu._menuState = PlayFabEditorMenu.MenuStates.Sdks; + + }, PlayFabEditorHelper.SharedErrorCallback); + } + else + { + Debug.Log($"Token acquired but for wrong audience: {audience}"); + } + } + } + } + + private static void OnContinueButtonClicked() + { + PlayFabEditorApi.Login(new LoginRequest() + { + DeveloperToolProductName = PlayFabEditorHelper.EDEX_NAME, + DeveloperToolProductVersion = PlayFabEditorHelper.EDEX_VERSION, + TwoFactorAuth = _2FaCode, + Email = _userEmail, + Password = _userPass + }, (result) => + { + PlayFabEditorPrefsSO.Instance.DevAccountToken = result.DeveloperClientToken; + PlayFabEditorPrefsSO.Instance.DevAccountEmail = _userEmail; + PlayFabEditorDataService.RefreshStudiosList(); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnLogin); + PlayFabEditorPrefsSO.Save(); + PlayFabEditorMenu._menuState = PlayFabEditorMenu.MenuStates.Sdks; + + }, PlayFabEditorHelper.SharedErrorCallback); + } + #endregion + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta new file mode 100644 index 00000000..212ac762 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorAuthenticate.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5391580e006220946a84ab25acd7096e +timeCreated: 1465867542 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs new file mode 100644 index 00000000..ad499381 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs @@ -0,0 +1,123 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public class PlayFabEditorDataMenu : UnityEditor.Editor + { + #region panel variables + public static TitleDataViewer tdViewer; + public static TitleInternalDataViewer tdInternalViewer; + + public static SubMenuComponent menu = null; + + public enum DataMenuStates { TitleData, TitleDataInternal } + public static DataMenuStates currentState = DataMenuStates.TitleData; + + private static Vector2 scrollPos = Vector2.zero; + + #endregion + + #region draw calls + public static void DrawDataPanel() + { + if (menu == null) + { + RegisterMenu(); + return; + } + + menu.DrawMenu(); + switch ((DataMenuStates)PlayFabEditorPrefsSO.Instance.curSubMenuIdx) + { + case DataMenuStates.TitleData: + if (tdViewer == null) + { + tdViewer = CreateInstance(); + tdViewer.RefreshTitleData(); + } + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + tdViewer.Draw(); + GUILayout.EndScrollView(); + break; + + case DataMenuStates.TitleDataInternal: + if (tdInternalViewer == null) + { + tdInternalViewer = CreateInstance(); + tdInternalViewer.RefreshInternalTitleData(); + } + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + tdInternalViewer.Draw(); + GUILayout.EndScrollView(); + break; + + default: + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + EditorGUILayout.LabelField("Coming Soon!", PlayFabEditorHelper.uiStyle.GetStyle("titleLabel"), GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + } + break; + } + } + #endregion + + #region unity loops + static PlayFabEditorDataMenu() + { + if (!PlayFabEditor.IsEventHandlerRegistered(StateUpdateHandler)) + { + PlayFabEditor.EdExStateUpdate += StateUpdateHandler; + } + + RegisterMenu(); + } + + public void OnDestroy() + { + if (PlayFabEditor.IsEventHandlerRegistered(StateUpdateHandler)) + { + PlayFabEditor.EdExStateUpdate -= StateUpdateHandler; + } + } + #endregion + + #region menu and helper methods + public static void RegisterMenu() + { + if (menu != null) + return; + + menu = CreateInstance(); + menu.RegisterMenuItem("TITLE", OnTitleDataClicked); + menu.RegisterMenuItem("INTERNAL", OnInternalTitleDataClicked); + } + + public static void StateUpdateHandler(PlayFabEditor.EdExStates state, string status, string json) + { + switch (state) + { + case PlayFabEditor.EdExStates.OnMenuItemClicked: + break; + case PlayFabEditor.EdExStates.OnLogout: + if (tdViewer != null) + { + tdViewer.items.Clear(); + } + break; + } + } + + public static void OnTitleDataClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, DataMenuStates.TitleData.ToString(), "" + (int)DataMenuStates.TitleData); + } + + public static void OnInternalTitleDataClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, DataMenuStates.TitleDataInternal.ToString(), "" + (int)DataMenuStates.TitleDataInternal); + } + } + #endregion +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta new file mode 100644 index 00000000..a2ae627f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorDataMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 473b8182a10e24fd0aebe832f98f7779 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs new file mode 100644 index 00000000..1aa5b277 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs @@ -0,0 +1,69 @@ +using UnityEngine; +using UnityEditor; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorHeader : UnityEditor.Editor + { + public static void DrawHeader(float progress = 0f) + { + if (PlayFabEditorHelper.uiStyle == null) + return; + + //using Begin Vertical as our container. + using (new UnityHorizontal(GUILayout.Height(52))) + { + //Set the image in the container + if (EditorGUIUtility.currentViewWidth < 375) + { + EditorGUILayout.LabelField("", PlayFabEditorHelper.uiStyle.GetStyle("pfLogo"), GUILayout.MaxHeight(50), GUILayout.Width(186)); + } + else + { + EditorGUILayout.LabelField("", PlayFabEditorHelper.uiStyle.GetStyle("pfLogo"), GUILayout.MaxHeight(50), GUILayout.Width(466)); + } + + float gmAnchor = EditorGUIUtility.currentViewWidth - 30; + + + if (EditorGUIUtility.currentViewWidth > 375) + { + gmAnchor = EditorGUIUtility.currentViewWidth - 140; + GUILayout.BeginArea(new Rect(gmAnchor, 10, 140, 42)); + GUILayout.BeginHorizontal(); + if (GUILayout.Button("GAME MANAGER", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MaxWidth(105))) + { + OnDashbaordClicked(); + } + } + else + { + GUILayout.BeginArea(new Rect(gmAnchor, 10, EditorGUIUtility.currentViewWidth * .25f, 42)); + GUILayout.BeginHorizontal(); + } + + if (GUILayout.Button("", PlayFabEditorHelper.uiStyle.GetStyle("gmIcon"))) + { + OnDashbaordClicked(); + } + GUILayout.EndHorizontal(); + GUILayout.EndArea(); + + //end the vertical container + } + + ProgressBar.Draw(); + + } + + + private static void OnDashbaordClicked() + { + Help.BrowseURL(PlayFabEditorDataService.ActiveTitle != null ? PlayFabEditorDataService.ActiveTitle.GameManagerUrl : PlayFabEditorHelper.GAMEMANAGER_URL); + } + + } +} + + + diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta new file mode 100644 index 00000000..f163ed44 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHeader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cd7bce14a0a4b2a4a827a4ffd4d24849 +timeCreated: 1465798284 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs new file mode 100644 index 00000000..5d79fb96 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs @@ -0,0 +1,100 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorHelpMenu : UnityEditor.Editor + { + public static float buttonWidth = 200; + public static Vector2 scrollPos = Vector2.zero; + + public static void DrawHelpPanel() + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + buttonWidth = EditorGUIUtility.currentViewWidth > 400 ? EditorGUIUtility.currentViewWidth / 2 : 200; + + using (new UnityVertical()) + { + EditorGUILayout.LabelField("LEARN PLAYFAB:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("BEGINNERS GUIDE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/index#pivot=documentation&panel=quickstarts"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("RECIPES", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/resources/recipes-and-samples"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("TUTORIALS", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/features/commerce/economy/tutorials"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("API REFERENCE", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/api-references/"); + } + + GUILayout.FlexibleSpace(); + } + } + + using (new UnityVertical()) + { + EditorGUILayout.LabelField("TROUBLESHOOTING:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("ASK QUESTIONS", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("https://community.playfab.com/index.html"); + } + + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("VIEW SERVICE AVAILABILITY", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + Application.OpenURL("http://status.playfab.com/"); + } + + GUILayout.FlexibleSpace(); + } + } + GUILayout.EndScrollView(); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta new file mode 100644 index 00000000..98c17477 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorHelpMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ef5d79e80acc44a588d53dea61dcfc83 +timeCreated: 1470347876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs new file mode 100644 index 00000000..a7570b10 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs @@ -0,0 +1,132 @@ +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorMenu : UnityEditor.Editor + { + #region panel variables + internal enum MenuStates + { + Sdks = 0, + Settings = 1, + Data = 2, + Help = 3, + Tools = 4, + Packages = 5, + Logout = 6 + } + + internal static MenuStates _menuState = MenuStates.Sdks; + #endregion + + public static void DrawMenu() + { + if (PlayFabEditorSDKTools.IsInstalled && PlayFabEditorSDKTools.isSdkSupported) + _menuState = (MenuStates)PlayFabEditorPrefsSO.Instance.curMainMenuIdx; + + var sdksButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var settingsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var dataButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var helpButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var logoutButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var toolsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + var packagesButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton"); + + if (_menuState == MenuStates.Sdks) + sdksButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Settings) + settingsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Logout) + logoutButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Data) + dataButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Help) + helpButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Packages) + packagesButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + if (_menuState == MenuStates.Tools) + toolsButtonStyle = PlayFabEditorHelper.uiStyle.GetStyle("textButton_selected"); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"), GUILayout.Height(25), GUILayout.ExpandWidth(true))) + { + GUILayout.Space(5); + + if (GUILayout.Button("SDK", sdksButtonStyle, GUILayout.MaxWidth(35))) + { + OnSdKsClicked(); + } + + if (PlayFabEditorSDKTools.IsInstalled && PlayFabEditorSDKTools.isSdkSupported) + { + if (GUILayout.Button("SETTINGS", settingsButtonStyle, GUILayout.MaxWidth(65))) + OnSettingsClicked(); + if (GUILayout.Button("DATA", dataButtonStyle, GUILayout.MaxWidth(45))) + OnDataClicked(); + if (GUILayout.Button("TOOLS", toolsButtonStyle, GUILayout.MaxWidth(45))) + OnToolsClicked(); + if(GUILayout.Button("PACKAGES", packagesButtonStyle, GUILayout.MaxWidth(72))) + OnPackagesClicked(); + } + + if (GUILayout.Button("HELP", helpButtonStyle, GUILayout.MaxWidth(45))) + OnHelpClicked(); + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("LOGOUT", logoutButtonStyle, GUILayout.MaxWidth(55))) + OnLogoutClicked(); + } + } + + public static void OnToolsClicked() + { + _menuState = MenuStates.Tools; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Tools.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnDataClicked() + { + _menuState = MenuStates.Data; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Data.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnHelpClicked() + { + _menuState = MenuStates.Help; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Help.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnSdKsClicked() + { + _menuState = MenuStates.Sdks; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Sdks.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnSettingsClicked() + { + _menuState = MenuStates.Settings; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Settings.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnPackagesClicked() + { + _menuState = MenuStates.Packages; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Packages.ToString()); + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + + public static void OnLogoutClicked() + { + _menuState = MenuStates.Logout; + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnMenuItemClicked, MenuStates.Logout.ToString()); + PlayFabEditorAuthenticate.Logout(); + + _menuState = MenuStates.Sdks; + PlayFabEditorPrefsSO.Instance.curMainMenuIdx = (int)_menuState; + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta new file mode 100644 index 00000000..9389a0fd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f299dcbf6b977c446a02dfe5885393bd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs new file mode 100644 index 00000000..30ec2238 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs @@ -0,0 +1,111 @@ +using System; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorPackages : UnityEditor.Editor + { + private const int buttonWidth = 150; + + public static bool IsPubSubPresent { get { return GetIsPubSubTypePresent(); } } + + public static void DrawPackagesMenu() + { +#if ENABLE_PLAYFABPUBSUB_API + var labelStyle = new GUIStyle(PlayFabEditorHelper.uiStyle.GetStyle("label")); + if (Environment.Version.Major < 4) + { + EditorGUILayout.LabelField(" PersistentSockets is only supported with dot Net 4\n\n Please change your Project build settings", labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + } + else if (!IsPubSubPresent) + { + DrawPubSubPrivatePreviewWarning(); + GUILayout.BeginHorizontal(); + GUILayout.Label(" PubSub: "); + if (GUILayout.Button("Install From GitHub", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(buttonWidth), GUILayout.MinHeight(32))) + { + string possibleNewtonsoftPath = ""; + if (GetIsNewtonsoftInstalled(out possibleNewtonsoftPath)) + { + EditorUtility.DisplayDialog("Newtonsoft is already installed.", + "Please delete your version of Netwonsoft.json.dll in \n\n" + possibleNewtonsoftPath + " \n and retry the install.\n\n Compiler conflicts will occur if this package is installed and Newtonsoft already exists.", "Continue", "Cancel"); + } + else + { + ImportPubSubSDK(); + } + } + + GUILayout.EndHorizontal(); + } + else + { + EditorGUILayout.LabelField(" PersistentSockets is Installed", labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + } +#endif + } + + private static void DrawPubSubPrivatePreviewWarning() + { + GUILayout.BeginHorizontal(); + GUILayout.Label(" PUBSUB IS IN PRIVATE PREVIEW."); + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + GUILayout.Label(" If you are a Professional or Enterprise tier customer and wish to try this feature out, Please contact helloplayfab@microsoft.com for more information."); + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + GUILayout.Label(" User MUST be currently signed into GitHub (with their default browser) to successfully install the unitypackage"); + GUILayout.EndHorizontal(); + } + + public static void ImportPubSubSDK() + { + var link = "https://api.playfab.com/downloads/unity-signalr"; + System.Diagnostics.Process.Start(link); + } + + public static bool GetIsNewtonsoftInstalled(out string path) + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in allAssemblies) + { + if (assembly.FullName.Contains("Newtonsoft.Json")) + { + path = assembly.Location; + return true; + } + + foreach (var eachType in assembly.GetTypes()) + { + if (eachType.Name.Contains("Newtonsoft")) + { + path = assembly.Location; + return true; + } + } + } + path = "N/A"; + return false; + } + + // TODO: move this function to a shared location + // and CACHE the results so we don't need to loop multiple times. + public static bool GetIsPubSubTypePresent() + { + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + + foreach (var assembly in allAssemblies) + { + foreach (var eachType in assembly.GetTypes()) + { + if (eachType.Name.Contains("PubSub")) + { + return true; + } + } + } + + return false; + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta new file mode 100644 index 00000000..cf6fa81c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorPackages.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d82ae6e4704d39945b28d49f4f084d9d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs new file mode 100644 index 00000000..c583b2c2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs @@ -0,0 +1,410 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorSDKTools : UnityEditor.Editor + { + private const int buttonWidth = 150; + public static bool IsInstalled { get { return GetPlayFabSettings() != null; } } + + private static Type playFabSettingsType = null; + private static string installedSdkVersion = string.Empty; + private static string latestSdkVersion = string.Empty; + private static UnityEngine.Object sdkFolder; + private static UnityEngine.Object _previousSdkFolderPath; + private static bool isObjectFieldActive; + private static bool isInitialized; //used to check once, gets reset after each compile; + public static bool isSdkSupported = true; + + public static void DrawSdkPanel() + { + if (!isInitialized) + { + //SDK is installed. + CheckSdkVersion(); + isInitialized = true; + GetLatestSdkVersion(); + sdkFolder = FindSdkAsset(); + + if (sdkFolder != null) + { + PlayFabEditorPrefsSO.Instance.SdkPath = AssetDatabase.GetAssetPath(sdkFolder); + PlayFabEditorDataService.SaveEnvDetails(); + } + } + + if (IsInstalled) + ShowSdkInstalledMenu(); + else + ShowSdkNotInstalledMenu(); + } + + private static void ShowSdkInstalledMenu() + { + isObjectFieldActive = sdkFolder == null; + + if (_previousSdkFolderPath != sdkFolder) + { + // something changed, better save the result. + _previousSdkFolderPath = sdkFolder; + + PlayFabEditorPrefsSO.Instance.SdkPath = (AssetDatabase.GetAssetPath(sdkFolder)); + PlayFabEditorDataService.SaveEnvDetails(); + + isObjectFieldActive = false; + } + + var labelStyle = new GUIStyle(PlayFabEditorHelper.uiStyle.GetStyle("titleLabel")); + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + EditorGUILayout.LabelField(string.Format("SDK {0} is installed", string.IsNullOrEmpty(installedSdkVersion) ? "Unknown" : installedSdkVersion), + labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + + if (!isObjectFieldActive) + { + GUI.enabled = false; + } + else + { + EditorGUILayout.LabelField( + "An SDK was detected, but we were unable to find the directory. Drag-and-drop the top-level PlayFab SDK folder below.", + PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + sdkFolder = EditorGUILayout.ObjectField(sdkFolder, typeof(UnityEngine.Object), false, GUILayout.MaxWidth(200)); + GUILayout.FlexibleSpace(); + } + + if (!isObjectFieldActive) + { + // this is a hack to prevent our "block while loading technique" from breaking up at this point. + GUI.enabled = !EditorApplication.isCompiling && PlayFabEditor.blockingRequests.Count == 0; + } + + if (isSdkSupported && sdkFolder != null) + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("REMOVE SDK", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32), GUILayout.MinWidth(200))) + { + RemoveSdk(); + } + + GUILayout.FlexibleSpace(); + } + } + + } + + if (sdkFolder != null) + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + isSdkSupported = false; + string[] versionNumber = !string.IsNullOrEmpty(installedSdkVersion) ? installedSdkVersion.Split('.') : new string[0]; + + var numerical = 0; + if (string.IsNullOrEmpty(installedSdkVersion) || versionNumber == null || versionNumber.Length == 0 || + (versionNumber.Length > 0 && int.TryParse(versionNumber[0], out numerical) && numerical < 2)) + { + //older version of the SDK + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("Most of the Editor Extensions depend on SDK versions >2.0. Consider upgrading to the get most features.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("READ THE UPGRADE GUIDE", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32))) + { + Application.OpenURL("https://github.com/PlayFab/UnitySDK/blob/master/UPGRADE.md"); + } + GUILayout.FlexibleSpace(); + } + } + else if (numerical >= 2) + { + isSdkSupported = true; + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + if (ShowSDKUpgrade() && isSdkSupported) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Upgrade to " + latestSdkVersion, PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32))) + { + UpgradeSdk(); + } + GUILayout.FlexibleSpace(); + } + else if (isSdkSupported) + { + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("You have the latest SDK!", labelStyle, GUILayout.MinHeight(32)); + GUILayout.FlexibleSpace(); + } + } + } + } + + if (isSdkSupported && string.IsNullOrEmpty(PlayFabEditorDataService.SharedSettings.TitleId)) + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + EditorGUILayout.LabelField("Before making PlayFab API calls, the SDK must be configured to your PlayFab Title.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + using (new UnityHorizontal()) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SET MY TITLE", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + { + PlayFabEditorMenu.OnSettingsClicked(); + } + GUILayout.FlexibleSpace(); + } + } + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button("VIEW RELEASE NOTES", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(32), GUILayout.MinWidth(200))) + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/release-notes/"); + } + + GUILayout.FlexibleSpace(); + } + } + + private static void ShowSdkNotInstalledMenu() + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + var labelStyle = new GUIStyle(PlayFabEditorHelper.uiStyle.GetStyle("titleLabel")); + + EditorGUILayout.LabelField("No SDK is installed.", labelStyle, GUILayout.MinWidth(EditorGUIUtility.currentViewWidth)); + GUILayout.Space(20); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Refresh", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(buttonWidth), GUILayout.MinHeight(32))) + playFabSettingsType = null; + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Install PlayFab SDK", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MaxWidth(buttonWidth), GUILayout.MinHeight(32))) + ImportLatestSDK(); + + GUILayout.FlexibleSpace(); + } + } + } + + public static void ImportLatestSDK() + { + PlayFabEditorHttp.MakeDownloadCall("https://aka.ms/PlayFabUnitySdk", (fileName) => + { + Debug.Log("PlayFab SDK Install: Complete"); + AssetDatabase.ImportPackage(fileName, false); + + // attempts to re-import any changed assets (which ImportPackage doesn't implicitly do) + AssetDatabase.Refresh(); + + PlayFabEditorPrefsSO.Instance.SdkPath = PlayFabEditorHelper.DEFAULT_SDK_LOCATION; + PlayFabEditorDataService.SaveEnvDetails(); + + }); + } + + public static Type GetPlayFabSettings() + { + if (playFabSettingsType == typeof(object)) + return null; // Sentinel value to indicate that PlayFabSettings doesn't exist + if (playFabSettingsType != null) + return playFabSettingsType; + + playFabSettingsType = typeof(object); // Sentinel value to indicate that PlayFabSettings doesn't exist + var allAssemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in allAssemblies) + { + Type[] assemblyTypes; + try + { + assemblyTypes = assembly.GetTypes(); + } + catch (ReflectionTypeLoadException e) + { + assemblyTypes = e.Types; + } + + foreach (var eachType in assemblyTypes) + if (eachType != null) + if (eachType.Name == PlayFabEditorHelper.PLAYFAB_SETTINGS_TYPENAME) + playFabSettingsType = eachType; + } + + //if (playFabSettingsType == typeof(object)) + // Debug.LogWarning("Should not have gotten here: " + allAssemblies.Length); + //else + // Debug.Log("Found Settings: " + allAssemblies.Length + ", " + playFabSettingsType.Assembly.FullName); + return playFabSettingsType == typeof(object) ? null : playFabSettingsType; + } + + private static void CheckSdkVersion() + { + if (!string.IsNullOrEmpty(installedSdkVersion)) + return; + + var types = new List(); + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) + { + try + { + foreach (var type in assembly.GetTypes()) + if (type.Name == "PlayFabVersion" || type.Name == PlayFabEditorHelper.PLAYFAB_SETTINGS_TYPENAME) + types.Add(type); + } + catch (ReflectionTypeLoadException) + { + // For this failure, silently skip this assembly unless we have some expectation that it contains PlayFab + if (assembly.FullName.StartsWith("Assembly-CSharp")) // The standard "source-code in unity proj" assembly name + Debug.LogWarning("PlayFab EdEx Error, failed to access the main CSharp assembly that probably contains PlayFab. Please report this on the PlayFab Forums"); + continue; + } + } + + foreach (var type in types) + { + foreach (var property in type.GetProperties()) + if (property.Name == "SdkVersion" || property.Name == "SdkRevision") + installedSdkVersion += property.GetValue(property, null).ToString(); + foreach (var field in type.GetFields()) + if (field.Name == "SdkVersion" || field.Name == "SdkRevision") + installedSdkVersion += field.GetValue(field).ToString(); + } + } + + private static UnityEngine.Object FindSdkAsset() + { + UnityEngine.Object sdkAsset = null; + + // look in editor prefs + if (PlayFabEditorPrefsSO.Instance.SdkPath != null) + { + sdkAsset = AssetDatabase.LoadAssetAtPath(PlayFabEditorPrefsSO.Instance.SdkPath, typeof(UnityEngine.Object)); + } + if (sdkAsset != null) + return sdkAsset; + + sdkAsset = AssetDatabase.LoadAssetAtPath(PlayFabEditorHelper.DEFAULT_SDK_LOCATION, typeof(UnityEngine.Object)); + if (sdkAsset != null) + return sdkAsset; + + var fileList = Directory.GetDirectories(Application.dataPath, "*PlayFabSdk", SearchOption.AllDirectories); + if (fileList.Length == 0) + return null; + + var relPath = fileList[0].Substring(fileList[0].LastIndexOf("Assets")); + return AssetDatabase.LoadAssetAtPath(relPath, typeof(UnityEngine.Object)); + } + + private static bool ShowSDKUpgrade() + { + if (string.IsNullOrEmpty(latestSdkVersion) || latestSdkVersion == "Unknown") + { + return false; + } + + if (string.IsNullOrEmpty(installedSdkVersion) || installedSdkVersion == "Unknown") + { + return true; + } + + string[] currrent = installedSdkVersion.Split('.'); + string[] latest = latestSdkVersion.Split('.'); + + if (int.Parse(currrent[0]) < 2) + { + return false; + } + + return int.Parse(latest[0]) > int.Parse(currrent[0]) + || int.Parse(latest[1]) > int.Parse(currrent[1]) + || int.Parse(latest[2]) > int.Parse(currrent[2]); + } + + private static void UpgradeSdk() + { + if (EditorUtility.DisplayDialog("Confirm SDK Upgrade", "This action will remove the current PlayFab SDK and install the lastet version. Related plug-ins will need to be manually upgraded.", "Confirm", "Cancel")) + { + RemoveSdk(false); + ImportLatestSDK(); + } + } + + private static void RemoveSdk(bool prompt = true) + { + if (prompt && !EditorUtility.DisplayDialog("Confirm SDK Removal", "This action will remove the current PlayFab SDK. Related plug-ins will need to be manually removed.", "Confirm", "Cancel")) + return; + + //try to clean-up the plugin dirs + if (Directory.Exists(Application.dataPath + "/Plugins")) + { + var folders = Directory.GetDirectories(Application.dataPath + "/Plugins", "PlayFabShared", SearchOption.AllDirectories); + foreach (var folder in folders) + FileUtil.DeleteFileOrDirectory(folder); + + //try to clean-up the plugin files (if anything is left) + var files = Directory.GetFiles(Application.dataPath + "/Plugins", "PlayFabErrors.cs", SearchOption.AllDirectories); + foreach (var file in files) + FileUtil.DeleteFileOrDirectory(file); + } + + if (!string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.SdkPath) && FileUtil.DeleteFileOrDirectory(PlayFabEditorPrefsSO.Instance.SdkPath)) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSuccess, "PlayFab SDK Removed!"); + + // HACK for 5.4, AssetDatabase.Refresh(); seems to cause the install to fail. + if (prompt) + { + AssetDatabase.Refresh(); + } + } + else + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "An unknown error occured and the PlayFab SDK could not be removed."); + } + } + + private static void GetLatestSdkVersion() + { + var threshold = PlayFabEditorPrefsSO.Instance.EdSet_lastSdkVersionCheck != DateTime.MinValue ? PlayFabEditorPrefsSO.Instance.EdSet_lastSdkVersionCheck.AddHours(1) : DateTime.MinValue; + + if (DateTime.Today > threshold) + { + PlayFabEditorHttp.MakeGitHubApiCall("https://api.github.com/repos/PlayFab/UnitySDK/git/refs/tags", (version) => + { + latestSdkVersion = version ?? "Unknown"; + PlayFabEditorPrefsSO.Instance.EdSet_latestSdkVersion = latestSdkVersion; + }); + } + else + { + latestSdkVersion = PlayFabEditorPrefsSO.Instance.EdSet_latestSdkVersion; + } + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta new file mode 100644 index 00000000..aee8a927 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSDKTools.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 808d230e8f7859f4a9c84f6653a2ba1c +timeCreated: 1465798472 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs new file mode 100644 index 00000000..bb9dad97 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs @@ -0,0 +1,359 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; +using System.Text; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public class PlayFabEditorSettings : UnityEditor.Editor + { + #region panel variables + public enum SubMenuStates + { + StandardSettings, + TitleSettings, + ApiSettings, + } + + public enum WebRequestType + { +#if !UNITY_2018_2_OR_NEWER // Unity has deprecated Www + UnityWww, // High compatability Unity api calls +#endif + UnityWebRequest, // Modern unity HTTP component + HttpWebRequest, // High performance multi-threaded api calls + CustomHttp //If this is used, you must set the Http to an IPlayFabHttp object. + } + + private static float LABEL_WIDTH = 180; + + private static readonly StringBuilder Sb = new StringBuilder(); + + private static SubMenuComponent _menu = null; + + private static readonly Dictionary StudioFoldOutStates = new Dictionary(); + private static Vector2 _titleScrollPos = Vector2.zero; + #endregion + + #region draw calls + private static void DrawApiSubPanel() + { + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"))) + { + var curDefines = PlayerSettings.GetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup); + var changedFlags = false; + var allFlags = new Dictionary(PlayFabEditorHelper.FLAG_LABELS); + var extraDefines = new HashSet(curDefines.Split(' ', ';')); + foreach (var eachFlag in extraDefines) + if (!string.IsNullOrEmpty(eachFlag) && !allFlags.ContainsKey(eachFlag)) + allFlags.Add(eachFlag, new PfDefineFlag { Flag = eachFlag, Label = eachFlag, Category = PfDefineFlag.FlagCategory.Other, isInverted = false, isSafe = false }); + var allowUnsafe = extraDefines.Contains(PlayFabEditorHelper.ENABLE_BETA_FETURES); + + foreach (PfDefineFlag.FlagCategory activeFlagCategory in Enum.GetValues(typeof(PfDefineFlag.FlagCategory))) + { + if (activeFlagCategory == PfDefineFlag.FlagCategory.Other && !allowUnsafe) + continue; + + using (var fwl = new FixedWidthLabel(activeFlagCategory.ToString())) { } + + foreach (var eachDefinePair in allFlags) + { + PfDefineFlag eachFlag = eachDefinePair.Value; + if (eachFlag.Category == activeFlagCategory && (eachFlag.isSafe || allowUnsafe)) + DisplayDefineToggle(eachFlag.Label + ": ", eachFlag.isInverted, eachFlag.Flag, ref curDefines, ref changedFlags); + } + } + + if (changedFlags) + { + PlayerSettings.SetScriptingDefineSymbolsForGroup(EditorUserBuildSettings.selectedBuildTargetGroup, curDefines); + Debug.Log("Updating Defines: " + curDefines); + AssetDatabase.Refresh(); + } + } + } + + private static void DisplayDefineToggle(string label, bool invertDisplay, string displayedDefine, ref string curDefines, ref bool changedFlag) + { + bool flagSet, flagGet = curDefines.Contains(displayedDefine); + using (var fwl = new FixedWidthLabel(label)) + { + GUILayout.Space(LABEL_WIDTH - fwl.fieldWidth); + flagSet = EditorGUILayout.Toggle(invertDisplay ? !flagGet : flagGet, PlayFabEditorHelper.uiStyle.GetStyle("Toggle"), GUILayout.MinHeight(25)); + if (invertDisplay) + flagSet = !flagSet; + } + changedFlag |= flagSet != flagGet; + + Sb.Length = 0; + if (flagSet && !flagGet) + { + Sb.Append(curDefines); + if (Sb.Length > 0) + Sb.Append(";"); + Sb.Append(displayedDefine); + curDefines = Sb.ToString(); + } + else if (!flagSet && flagGet) + { + Sb.Append(curDefines); + Sb.Replace(displayedDefine, "").Replace(";;", ";"); + if (Sb.Length > 0 && Sb[0] == ';') + Sb.Remove(0, 1); + if (Sb.Length > 0 && Sb[Sb.Length - 1] == ';') + Sb.Remove(Sb.Length - 1, 1); + curDefines = Sb.ToString(); + } + } + + public static void DrawSettingsPanel() + { + if (_menu != null) + { + _menu.DrawMenu(); + switch ((SubMenuStates)PlayFabEditorPrefsSO.Instance.curSubMenuIdx) + { + case SubMenuStates.StandardSettings: + DrawStandardSettingsSubPanel(); + break; + case SubMenuStates.ApiSettings: + DrawApiSubPanel(); + break; + case SubMenuStates.TitleSettings: + DrawTitleSettingsSubPanel(); + break; + } + } + else + { + RegisterMenu(); + } + } + + private static void DrawTitleSettingsSubPanel() + { + float labelWidth = 100; + + if (PlayFabEditorPrefsSO.Instance.StudioList != null && PlayFabEditorPrefsSO.Instance.StudioList.Count != StudioFoldOutStates.Count + 1) + { + StudioFoldOutStates.Clear(); + foreach (var studio in PlayFabEditorPrefsSO.Instance.StudioList) + { + if (string.IsNullOrEmpty(studio.Id)) + continue; + if (!StudioFoldOutStates.ContainsKey(studio.Id)) + StudioFoldOutStates.Add(studio.Id, new StudioDisplaySet { Studio = studio }); + foreach (var title in studio.Titles) + if (!StudioFoldOutStates[studio.Id].titleFoldOutStates.ContainsKey(title.Id)) + StudioFoldOutStates[studio.Id].titleFoldOutStates.Add(title.Id, new TitleDisplaySet { Title = title }); + } + } + + _titleScrollPos = GUILayout.BeginScrollView(_titleScrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("STUDIOS:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("REFRESH", PlayFabEditorHelper.uiStyle.GetStyle("Button"))) + PlayFabEditorDataService.RefreshStudiosList(); + } + + foreach (var studio in StudioFoldOutStates) + { + var style = new GUIStyle(EditorStyles.foldout); + if (studio.Value.isCollapsed) + style.fontStyle = FontStyle.Normal; + + studio.Value.isCollapsed = EditorGUI.Foldout(EditorGUILayout.GetControlRect(), studio.Value.isCollapsed, string.Format("{0} ({1})", studio.Value.Studio.Name, studio.Value.Studio.Titles.Length), true, PlayFabEditorHelper.uiStyle.GetStyle("foldOut_std")); + if (studio.Value.isCollapsed) + continue; + + EditorGUI.indentLevel = 2; + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("TITLES:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + } + GUILayout.Space(5); + + // draw title foldouts + foreach (var title in studio.Value.titleFoldOutStates) + { + title.Value.isCollapsed = EditorGUI.Foldout(EditorGUILayout.GetControlRect(), title.Value.isCollapsed, string.Format("{0} [{1}]", title.Value.Title.Name, title.Value.Title.Id), true, PlayFabEditorHelper.uiStyle.GetStyle("foldOut_std")); + if (title.Value.isCollapsed) + continue; + + EditorGUI.indentLevel = 3; + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("SECRET KEY:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + EditorGUILayout.TextField("" + title.Value.Title.SecretKey); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("URL:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("VIEW IN GAME MANAGER", PlayFabEditorHelper.uiStyle.GetStyle("textButton"))) + Application.OpenURL(title.Value.Title.GameManagerUrl); + GUILayout.FlexibleSpace(); + } + EditorGUI.indentLevel = 2; + } + + EditorGUI.indentLevel = 0; + } + GUILayout.EndScrollView(); + } + + private static Studio GetStudioForTitleId(string titleId) + { + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + return Studio.OVERRIDE; + foreach (var eachStudio in PlayFabEditorPrefsSO.Instance.StudioList) + if (eachStudio.Titles != null) + foreach (var eachTitle in eachStudio.Titles) + if (eachTitle.Id == titleId) + return eachStudio; + return Studio.OVERRIDE; + } + + private static void DrawStandardSettingsSubPanel() + { + float labelWidth = 160; + + using (new UnityVertical(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1"), GUILayout.ExpandWidth(true))) + { + var studio = GetStudioForTitleId(PlayFabEditorDataService.SharedSettings.TitleId); + if (string.IsNullOrEmpty(studio.Id)) + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + EditorGUILayout.LabelField("You are using a TitleId to which you are not a member. A title administrator can approve access for your account.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + + PlayFabGuiFieldHelper.SuperFancyDropdown(labelWidth, "STUDIO: ", studio, PlayFabEditorPrefsSO.Instance.StudioList, eachStudio => eachStudio.Name, OnStudioChange, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear")); + studio = GetStudioForTitleId(PlayFabEditorDataService.SharedSettings.TitleId); // This might have changed above, so refresh it + + if (string.IsNullOrEmpty(studio.Id)) + { + // Override studio lets you set your own titleId + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("TITLE ID: ", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + + var newTitleId = EditorGUILayout.TextField(PlayFabEditorDataService.SharedSettings.TitleId, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + if (newTitleId != PlayFabEditorDataService.SharedSettings.TitleId) + OnTitleIdChange(newTitleId); + } + } + else + { + PlayFabGuiFieldHelper.SuperFancyDropdown(labelWidth, "TITLE ID: ", studio.GetTitle(PlayFabEditorDataService.SharedSettings.TitleId), studio.Titles, GetTitleDisplayString, OnTitleChange, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear")); + } + + DrawPfSharedSettingsOptions(labelWidth); + } + } + + private static string GetTitleDisplayString(Title title) + { + return string.Format("[{0}] {1}", title.Id, title.Name); + } + + private static void DrawPfSharedSettingsOptions(float labelWidth) + { +#if ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFABSERVER_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + // Set the title secret key, if we're using the dropdown + var studio = GetStudioForTitleId(PlayFabEditorDataService.SharedSettings.TitleId); + var correctKey = studio.GetTitleSecretKey(PlayFabEditorDataService.SharedSettings.TitleId); + var setKey = !string.IsNullOrEmpty(studio.Id) && !string.IsNullOrEmpty(correctKey); + if (setKey) + PlayFabEditorDataService.SharedSettings.DeveloperSecretKey = correctKey; + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("DEVELOPER SECRET KEY: ", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + using (new UnityGuiToggler(!setKey)) + PlayFabEditorDataService.SharedSettings.DeveloperSecretKey = EditorGUILayout.TextField(PlayFabEditorDataService.SharedSettings.DeveloperSecretKey, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } +#endif + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("REQUEST TYPE: ", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.MaxWidth(labelWidth)); + PlayFabEditorDataService.SharedSettings.WebRequestType = (WebRequestType)EditorGUILayout.EnumPopup(PlayFabEditorDataService.SharedSettings.WebRequestType, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.Height(25)); + } + + if (PlayFabEditorDataService.SharedSettings.WebRequestType == WebRequestType.HttpWebRequest) + { + using (var fwl = new FixedWidthLabel(new GUIContent("REQUEST TIMEOUT: "), PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + PlayFabEditorDataService.SharedSettings.TimeOut = EditorGUILayout.IntField(PlayFabEditorDataService.SharedSettings.TimeOut, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + } + + using (var fwl = new FixedWidthLabel(new GUIContent("KEEP ALIVE: "), PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"))) + { + GUILayout.Space(labelWidth - fwl.fieldWidth); + PlayFabEditorDataService.SharedSettings.KeepAlive = EditorGUILayout.Toggle(PlayFabEditorDataService.SharedSettings.KeepAlive, PlayFabEditorHelper.uiStyle.GetStyle("Toggle"), GUILayout.MinHeight(25)); + } + } + } + #endregion + + #region menu and helper methods + private static void RegisterMenu() + { + if (_menu != null) + return; + + _menu = CreateInstance(); + _menu.RegisterMenuItem("PROJECT", OnStandardSetttingsClicked); + _menu.RegisterMenuItem("STUDIOS", OnTitleSettingsClicked); + _menu.RegisterMenuItem("API", OnApiSettingsClicked); + } + + private static void OnApiSettingsClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, SubMenuStates.ApiSettings.ToString(), "" + (int)SubMenuStates.ApiSettings); + } + + private static void OnStandardSetttingsClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, SubMenuStates.StandardSettings.ToString(), "" + (int)SubMenuStates.StandardSettings); + } + + private static void OnTitleSettingsClicked() + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSubmenuItemClicked, SubMenuStates.TitleSettings.ToString(), "" + (int)SubMenuStates.TitleSettings); + } + + private static void OnStudioChange(Studio newStudio) + { + var newTitleId = (newStudio.Titles == null || newStudio.Titles.Length == 0) ? "" : newStudio.Titles[0].Id; + OnTitleIdChange(newTitleId); + } + + private static void OnTitleChange(Title newTitle) + { + OnTitleIdChange(newTitle.Id); + } + + private static void OnTitleIdChange(string newTitleId) + { + var studio = GetStudioForTitleId(newTitleId); + PlayFabEditorPrefsSO.Instance.SelectedStudio = studio.Name; + PlayFabEditorDataService.SharedSettings.TitleId = newTitleId; +#if ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFABSERVER_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + PlayFabEditorDataService.SharedSettings.DeveloperSecretKey = studio.GetTitleSecretKey(newTitleId); +#endif + PlayFabEditorPrefsSO.Instance.TitleDataCache.Clear(); + if (PlayFabEditorDataMenu.tdViewer != null) + PlayFabEditorDataMenu.tdViewer.items.Clear(); + PlayFabEditorDataService.SaveEnvDetails(); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnSuccess); + } + #endregion + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta new file mode 100644 index 00000000..48627ff6 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: cab05e4a89850364e8979904f46d0433 +timeCreated: 1466458580 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs new file mode 100644 index 00000000..5a02d10e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs @@ -0,0 +1,184 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorToolsMenu : UnityEditor.Editor + { + public static float buttonWidth = 200; + public static Vector2 scrollPos = Vector2.zero; + + public static void DrawToolsPanel() + { + scrollPos = GUILayout.BeginScrollView(scrollPos, PlayFabEditorHelper.uiStyle.GetStyle("gpStyleGray1")); + buttonWidth = EditorGUIUtility.currentViewWidth > 400 ? EditorGUIUtility.currentViewWidth / 2 : 200; + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField("CLOUD SCRIPT:", PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")); + GUILayout.Space(10); + if (GUILayout.Button("IMPORT", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(30))) + { + ImportCloudScript(); + } + GUILayout.Space(10); + if (File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath)) + { + if (GUILayout.Button("REMOVE", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(30))) + { + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = string.Empty; + PlayFabEditorDataService.SaveEnvDetails(); + } + GUILayout.Space(10); + if (GUILayout.Button("EDIT", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinHeight(30))) + { + EditorUtility.OpenWithDefaultApp(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath); + } + } + } + + if (File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath)) + { + var path = File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) ? PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath : PlayFabEditorHelper.CLOUDSCRIPT_PATH; + var shortPath = "..." + path.Substring(path.LastIndexOf('/')); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + + if (GUILayout.Button(shortPath, PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinWidth(110), GUILayout.MinHeight(20))) + { + EditorUtility.RevealInFinder(path); + } + // GUILayout.Space(10); + // if (GUILayout.Button("EDIT LOCALLY", PlayFabEditorHelper.uiStyle.GetStyle("textButton"), GUILayout.MinWidth(90), GUILayout.MinHeight(20))) + // { + // EditorUtility.OpenWithDefaultApp(path); + // } + GUILayout.FlexibleSpace(); + } + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + if (GUILayout.Button("SAVE TO PLAYFAB", PlayFabEditorHelper.uiStyle.GetStyle("Button"), GUILayout.MinHeight(32), GUILayout.Width(buttonWidth))) + { + if (EditorUtility.DisplayDialog("Deployment Confirmation", "This action will upload your local Cloud Script changes to PlayFab?", "Continue", "Cancel")) + { + BeginCloudScriptUpload(); + } + } + GUILayout.FlexibleSpace(); + } + } + else + { + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + GUILayout.FlexibleSpace(); + EditorGUILayout.LabelField("No Cloud Script files added. Import your file to get started.", PlayFabEditorHelper.uiStyle.GetStyle("orTxt")); + GUILayout.FlexibleSpace(); + } + } + + GUILayout.EndScrollView(); + } + + private static void ImportCloudScript() + { + var dialogResponse = EditorUtility.DisplayDialogComplex("Selcet an Import Option", "What Cloud Script file do you want to import?", "Use my latest PlayFab revision", "Cancel", "Use my local file"); + switch (dialogResponse) + { + case 0: + // use PlayFab + GetCloudScriptRevision(); + break; + case 1: + // cancel + return; + case 2: + //use local + SelectLocalFile(); + break; + } + } + + private static void GetCloudScriptRevision() + { + // empty request object gets latest versions + PlayFabEditorApi.GetCloudScriptRevision(new EditorModels.GetCloudScriptRevisionRequest(), (GetCloudScriptRevisionResult result) => + { + var csPath = PlayFabEditorHelper.CLOUDSCRIPT_PATH; + var location = Path.GetDirectoryName(csPath); + try + { + if (!Directory.Exists(location)) + Directory.CreateDirectory(location); + if (!File.Exists(csPath)) + using (var newfile = File.Create(csPath)) { } + File.WriteAllText(csPath, result.Files[0].FileContents); + Debug.Log("CloudScript uploaded successfully!"); + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = csPath; + PlayFabEditorDataService.SaveEnvDetails(); + AssetDatabase.Refresh(); + } + catch (Exception ex) + { + Debug.LogException(ex); + // PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, ex.Message); + return; + } + }, PlayFabEditorHelper.SharedErrorCallback); + } + + private static void SelectLocalFile() + { + var starterPath = File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) ? Application.dataPath : PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath; + var cloudScriptPath = string.Empty; + cloudScriptPath = EditorUtility.OpenFilePanel("Select your Cloud Script file", starterPath, "js"); + + if (!string.IsNullOrEmpty(cloudScriptPath)) + { + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = cloudScriptPath; + PlayFabEditorDataService.SaveEnvDetails(); + } + } + + private static void BeginCloudScriptUpload() + { + var filePath = File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) ? PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath : PlayFabEditorHelper.CLOUDSCRIPT_PATH; + + if (!File.Exists(PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath) && !File.Exists(PlayFabEditorHelper.CLOUDSCRIPT_PATH)) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "Cloud Script Upload Failed: null or corrupt file at path(" + filePath + ")."); + return; + } + + var s = File.OpenText(filePath); + var contents = s.ReadToEnd(); + s.Close(); + + var request = new UpdateCloudScriptRequest(); + request.Publish = EditorUtility.DisplayDialog("Deployment Options", "Do you want to make this Cloud Script live after uploading?", "Yes", "No"); + request.Files = new List(){ + new CloudScriptFile() { + Filename = PlayFabEditorHelper.CLOUDSCRIPT_FILENAME, + FileContents = contents + } + }; + + PlayFabEditorApi.UpdateCloudScript(request, (UpdateCloudScriptResult result) => + { + PlayFabEditorPrefsSO.Instance.LocalCloudScriptPath = filePath; + PlayFabEditorDataService.SaveEnvDetails(); + + Debug.Log("CloudScript uploaded successfully!"); + + }, PlayFabEditorHelper.SharedErrorCallback); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta new file mode 100644 index 00000000..bb7038fa --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Panels/PlayFabEditorToolsMenu.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 656ebe473a0de47c885424ad7816f408 +timeCreated: 1474039500 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta new file mode 100644 index 00000000..225e3823 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f0a0017f3f4fe3941b7da308a9830c25 +folderAsset: yes +timeCreated: 1468807731 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs new file mode 100644 index 00000000..68f6dc47 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs @@ -0,0 +1,80 @@ +namespace PlayFab.PfEditor.Json +{ + public interface ISerializer + { + T DeserializeObject(string json); + T DeserializeObject(string json, object jsonSerializerStrategy); + object DeserializeObject(string json); + + string SerializeObject(object json); + string SerializeObject(object json, object jsonSerializerStrategy); + } + + public class JsonWrapper + { + private static ISerializer _instance = new SimpleJsonInstance(); + + /// + /// Use this property to override the Serialization for the SDK. + /// + public static ISerializer Instance + { + get { return _instance; } + set { _instance = value; } + } + + public static T DeserializeObject(string json) + { + return _instance.DeserializeObject(json); + } + + public static T DeserializeObject(string json, object jsonSerializerStrategy) + { + return _instance.DeserializeObject(json, jsonSerializerStrategy); + } + + public static object DeserializeObject(string json) + { + return _instance.DeserializeObject(json); + } + + public static string SerializeObject(object json) + { + return _instance.SerializeObject(json); + } + + public static string SerializeObject(object json, object jsonSerializerStrategy) + { + return _instance.SerializeObject(json, jsonSerializerStrategy); + } + } + + public class SimpleJsonInstance : ISerializer + { + public T DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json); + } + + public T DeserializeObject(string json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.DeserializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + + public object DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json); + } + + public string SerializeObject(object json) + { + return PlayFabSimpleJson.SerializeObject(json); + } + + public string SerializeObject(object json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.SerializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + } +} + diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta new file mode 100644 index 00000000..592b6d3b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/ISerializer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f326e8a2f3464f246b1f3b5edd7ea59c +timeCreated: 1467153640 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs new file mode 100644 index 00000000..759a223a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs @@ -0,0 +1,99 @@ +using PlayFab.PfEditor.EditorModels; +using System; +using System.Collections.Generic; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorApi + { + #region FROM EDITOR API SETS ---------------------------------------------------------------------------------------------------------------------------------------- + public static void RegisterAccount(RegisterAccountRequest request, Action resultCallback, Action errorCb) + { + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/RegisterAccount", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void Login(LoginRequest request, Action resultCallback, Action errorCb) + { + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/Login", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void LoginWithAAD(LoginWithAADRequest request, Action resultCallback, Action errorCb) + { + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/LoginWithAAD", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void Logout(LogoutRequest request, Action resultCallback, + Action errorCb) + { + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/Logout", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void GetStudios(GetStudiosRequest request, Action resultCallback, Action errorCb) + { + var token = PlayFabEditorPrefsSO.Instance.DevAccountToken; + request.DeveloperClientToken = token; + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/GetStudios", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + + public static void CreateTitle(CreateTitleRequest request, Action resultCallback, Action errorCb) + { + var token = PlayFabEditorPrefsSO.Instance.DevAccountToken; + request.DeveloperClientToken = token; + PlayFabEditorHttp.MakeApiCall("/DeveloperTools/User/CreateTitle", PlayFabEditorHelper.DEV_API_ENDPOINT, request, resultCallback, errorCb); + } + #endregion + + #region FROM ADMIN / SERVER API SETS ---------------------------------------------------------------------------------------------------------------------------------------- + public static void GetTitleData(Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/GetTitleData", apiEndpoint, new GetTitleDataRequest(), resultCb, errorCb); + } + + public static void SetTitleData(Dictionary keys, Action resultCb, Action errorCb) + { + foreach (var pair in keys) + { + var req = new SetTitleDataRequest { Key = pair.Key, Value = pair.Value }; + + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/SetTitleData", apiEndpoint, req, resultCb, errorCb); + } + } + public static void GetTitleInternalData(Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/GetTitleInternalData", apiEndpoint, new GetTitleDataRequest(), resultCb, errorCb); + } + + public static void SetTitleInternalData(Dictionary keys, Action resultCb, Action errorCb) + { + foreach (var pair in keys) + { + var req = new SetTitleDataRequest { Key = pair.Key, Value = pair.Value }; + + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/SetTitleInternalData", apiEndpoint, req, resultCb, errorCb); + } + } + + public static void UpdateCloudScript(UpdateCloudScriptRequest request, Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/UpdateCloudScript", apiEndpoint, request, resultCb, errorCb); + } + + public static void GetCloudScriptRevision(GetCloudScriptRevisionRequest request, Action resultCb, Action errorCb) + { + var titleId = PlayFabEditorDataService.SharedSettings.TitleId; + var apiEndpoint = "https://" + titleId + PlayFabEditorHelper.TITLE_ENDPOINT; + PlayFabEditorHttp.MakeApiCall("/Admin/GetCloudScriptRevision", apiEndpoint, request, resultCb, errorCb); + } + #endregion + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta new file mode 100644 index 00000000..6d8591e8 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorApi.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 78d90281a98aa9c47af733ae62f11a73 +timeCreated: 1466719777 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs new file mode 100644 index 00000000..f3392843 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs @@ -0,0 +1,246 @@ +using UnityEngine; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using PlayFab.PfEditor.Json; +using PlayFab.PfEditor.EditorModels; +using UnityEngine.Networking; + +namespace PlayFab.PfEditor +{ + public class PlayFabEditorHttp : UnityEditor.Editor + { + internal static void MakeDownloadCall(string url, Action resultCallback) + { +#if UNITY_2018_2_OR_NEWER + UnityWebRequest www = UnityWebRequest.Get(url); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, url, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(PostDownload(www, (response) => { WriteResultFile(url, resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), www); +#else + var www = new WWW(url); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, url, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(PostDownload(www, (response) => { WriteResultFile(url, resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), www); +#endif + } + + private static void WriteResultFile(string url, Action resultCallback, byte[] response) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpRes, url); + + string fileName; + if (url.IndexOf("unity-edex") > -1) + fileName = PlayFabEditorHelper.EDEX_UPGRADE_PATH; + else if (url.IndexOf("unity-via-edex") > -1) + fileName = PlayFabEditorHelper.SDK_DOWNLOAD_PATH; + else + fileName = PlayFabEditorHelper.EDEX_PACKAGES_PATH; + + var fileSaveLocation = PlayFabEditorHelper.EDEX_ROOT + fileName; + var fileSaveDirectory = Path.GetDirectoryName(fileSaveLocation); + Debug.Log("Saving " + response.Length + " bytes to: " + fileSaveLocation); + if (!Directory.Exists(fileSaveDirectory)) + Directory.CreateDirectory(fileSaveDirectory); + File.WriteAllBytes(fileSaveLocation, response); + resultCallback(fileSaveLocation); + } + + internal static void MakeApiCall(string api, string apiEndpoint, TRequestType request, Action resultCallback, Action errorCallback) where TResultType : class + { + var url = apiEndpoint + api; + var req = JsonWrapper.SerializeObject(request, PlayFabEditorUtil.ApiSerializerStrategy); + //Set headers + var headers = new Dictionary + { + {"Content-Type", "application/json"}, + {"X-ReportErrorAsSuccess", "true"}, + {"X-PlayFabSDK", PlayFabEditorHelper.EDEX_NAME + "_" + PlayFabEditorHelper.EDEX_VERSION} + }; + + if (api.Contains("/Server/") || api.Contains("/Admin/")) + { + if (PlayFabEditorDataService.ActiveTitle == null || string.IsNullOrEmpty(PlayFabEditorDataService.ActiveTitle.SecretKey)) + { + PlayFabEditorDataService.RefreshStudiosList(); + return; + } + + headers.Add("X-SecretKey", PlayFabEditorDataService.ActiveTitle.SecretKey); + } + + if(api.Contains("LoginWithAAD")) + { + if(PlayFabEditorPrefsSO.Instance.AadAuthorization == "") + { + Debug.Log("You MUST login through AAD first before calling this api"); + return; + } + + headers.Add("Authorization", "Bearer "+(PlayFabEditorPrefsSO.Instance.AadAuthorization)); + } + + //Encode Payload + var payload = System.Text.Encoding.UTF8.GetBytes(req.Trim()); +#if UNITY_2018_2_OR_NEWER + var www = new UnityWebRequest(url) + { + uploadHandler = new UploadHandlerRaw(payload), + downloadHandler = new DownloadHandlerBuffer(), + method = "POST" + }; + + foreach (var header in headers) + { + if (!string.IsNullOrEmpty(header.Key) && !string.IsNullOrEmpty(header.Value)) + { + www.SetRequestHeader(header.Key, header.Value); + } + else + { + UnityEngine.Debug.LogWarning("Null header"); + } + } + + + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, api, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(Post(www, (response) => { OnWwwSuccess(api, resultCallback, errorCallback, response); }, (error) => { OnWwwError(errorCallback, error); }), www); +#else + var www = new WWW(url, payload, headers); + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpReq, api, PlayFabEditorHelper.MSG_SPIN_BLOCK); + EditorCoroutine.Start(Post(www, (response) => { OnWwwSuccess(api, resultCallback, errorCallback, response); }, (error) => { OnWwwError(errorCallback, error); }), www); +#endif + } + + private static void OnWwwSuccess(string api, Action resultCallback, Action errorCallback, string response) where TResultType : class + { + var httpResult = JsonWrapper.DeserializeObject(response, PlayFabEditorUtil.ApiSerializerStrategy); + if (httpResult.code != 200) + { + OnWwwError(errorCallback, response); + return; + } + + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnHttpRes, api); + if (resultCallback == null) + return; + + TResultType result = null; + var resultAssigned = false; + + var dataJson = JsonWrapper.SerializeObject(httpResult.data, PlayFabEditorUtil.ApiSerializerStrategy); + result = JsonWrapper.DeserializeObject(dataJson, PlayFabEditorUtil.ApiSerializerStrategy); + resultAssigned = true; + + if (resultAssigned) + resultCallback(result); + } + + private static void OnWwwError(Action errorCallback, string error) + { + if (errorCallback != null) + errorCallback(PlayFabEditorHelper.GeneratePlayFabError(error)); + else + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "OnWwwError" + error); + } + + internal static void MakeGitHubApiCall(string url, Action resultCallback) + { +#if UNITY_2018_2_OR_NEWER + UnityWebRequest webReq = UnityWebRequest.Get(url); + EditorCoroutine.Start(Post(webReq, (response) => { OnGitHubSuccess(resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), webReq); +#else + var www = new WWW(url); + EditorCoroutine.Start(Post(www, (response) => { OnGitHubSuccess(resultCallback, response); }, PlayFabEditorHelper.SharedErrorCallback), www); +#endif + } + + private static void OnGitHubSuccess(Action resultCallback, string response) + { + if (resultCallback == null) + return; + + var jsonResponse = JsonWrapper.DeserializeObject>(response); + if (jsonResponse == null || jsonResponse.Count == 0) + return; + + // list seems to come back in ascending order (oldest -> newest) + var latestSdkTag = (JsonObject)jsonResponse[jsonResponse.Count - 1]; + object tag; + if (latestSdkTag.TryGetValue("ref", out tag)) + { + var startIndex = tag.ToString().LastIndexOf('/') + 1; + var length = tag.ToString().Length - startIndex; + resultCallback(tag.ToString().Substring(startIndex, length)); + } + else + { + resultCallback(null); + } + } +#if UNITY_2018_2_OR_NEWER + private static IEnumerator Post(UnityWebRequest www, Action callBack, Action errorCallback) + { + if (www != null) + { + yield return www.SendWebRequest(); + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + callBack(www.downloadHandler.text); + } + else + { + UnityEngine.Debug.Log("UnityWebRequest was null"); + errorCallback("UnityWebRequest Object was null"); + } + } + + private static IEnumerator PostDownload(UnityWebRequest www, Action callBack, Action errorCallback) + { + if (www != null) + { + yield return www.SendWebRequest(); + +#if UNITY_2020_1_OR_NEWER + if (!string.IsNullOrEmpty(www.error) || www.result == UnityWebRequest.Result.ProtocolError) +#else + if (!string.IsNullOrEmpty(www.error) || www.isHttpError) +#endif + { + errorCallback(www.error); + } + else + { + callBack(www.downloadHandler.data); + } + } + else + { + UnityEngine.Debug.Log("UnityWebRequest was null"); + errorCallback("UnityWebRequest Object was null"); + } + } +#else + private static IEnumerator Post(WWW www, Action callBack, Action errorCallback) + { + yield return www; + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + callBack(www.text); + } + + private static IEnumerator PostDownload(WWW www, Action callBack, Action errorCallback) + { + yield return www; + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + callBack(www.bytes); + } +#endif + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta new file mode 100644 index 00000000..07e443c5 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorHttp.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f495d2bd2522f354d82ab4c043cbc727 +timeCreated: 1466703757 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs new file mode 100644 index 00000000..2706cb43 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs @@ -0,0 +1,470 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace PlayFab.PfEditor.EditorModels +{ + public class RegisterAccountRequest + { + public string Email; + public string Password; + public string StudioName; + public string DeveloperToolProductName; + public string DeveloperToolProductVersion; + } + + public class RegisterAccountResult + { + public string DeveloperClientToken; + } + + public class LoginRequest + { + public string Email; + public string Password; + public string TwoFactorAuth; + public string DeveloperToolProductName; + public string DeveloperToolProductVersion; + } + + public class LoginWithAADRequest + { + public string DeveloperToolProductName; + public string DeveloperToolProductVersion; + } + + public class LoginResult + { + public string DeveloperClientToken; + } + + public class LogoutRequest + { + public string DeveloperClientToken; + } + + public class LogoutResult + { + } + + public class GetStudiosRequest + { + public string DeveloperClientToken; + } + + public class GetStudiosResult + { + public Studio[] Studios; + } + + public class CreateTitleRequest + { + public string DeveloperClientToken; + public string Name; + public string StudioId; + } + + public class CreateTitleResult + { + public Title Title; + } + + public class Title + { + public string Id; + public string Name; + public string SecretKey; + public string GameManagerUrl; + } + + public class Studio + { + public static Studio OVERRIDE = new Studio { Id = "", Name = PlayFabEditorHelper.STUDIO_OVERRIDE, Titles = null }; + + public string Id; + public string Name; + + public Title[] Titles; + + public Title GetTitle(string titleId) + { + if (Titles == null) + return null; + for (var i = 0; i < Titles.Length; i++) + if (Titles[i].Id == titleId) + return Titles[i]; + return null; + } + + public string GetTitleSecretKey(string titleId) + { + var title = GetTitle(titleId); + return title == null ? "" : title.SecretKey; + } + } + + public class GetTitleDataRequest + { + public List Keys; + } + + public class GetTitleDataResult + { + public Dictionary Data; + } + + public class SetTitleDataRequest + { + public string Key; + public string Value; + } + + public class SetTitleDataResult + { + } + + public class CloudScriptFile + { + public string Filename; + public string FileContents; + } + + public class UpdateCloudScriptRequest + { + public List Files; + public bool Publish; + public string DeveloperPlayFabId; + } + + public class UpdateCloudScriptResult + { + public int Version; + public int Revision; + } + + public class GetCloudScriptRevisionRequest + { + public int? Version; + public int? Revision; + } + + public class GetCloudScriptRevisionResult + { + public int Version; + public int Revision; + public System.DateTime CreatedAt; + public List Files; + public bool IsPublished; + } + + public class PlayFabError + { + public int HttpCode; + public string HttpStatus; + public PlayFabErrorCode Error; + public string ErrorMessage; + public Dictionary> ErrorDetails; + public object CustomData; + public uint? RetryAfterSeconds = null; + + [ThreadStatic] + private static StringBuilder _tempSb; + public string GenerateErrorReport() + { + if (_tempSb == null) + _tempSb = new StringBuilder(); + _tempSb.Length = 0; + _tempSb.Append(ErrorMessage); + if (ErrorDetails != null) + foreach (var pair in ErrorDetails) + foreach (var msg in pair.Value) + _tempSb.Append("\n").Append(pair.Key).Append(": ").Append(msg); + return _tempSb.ToString(); + } + } + + public class HttpResponseObject + { + public int code; + public string status; + public object data; + } + + public enum PlayFabErrorCode + { + Unknown = 1, + Success = 0, + InvalidParams = 1000, + AccountNotFound = 1001, + AccountBanned = 1002, + InvalidUsernameOrPassword = 1003, + InvalidTitleId = 1004, + InvalidEmailAddress = 1005, + EmailAddressNotAvailable = 1006, + InvalidUsername = 1007, + InvalidPassword = 1008, + UsernameNotAvailable = 1009, + InvalidSteamTicket = 1010, + AccountAlreadyLinked = 1011, + LinkedAccountAlreadyClaimed = 1012, + InvalidFacebookToken = 1013, + AccountNotLinked = 1014, + FailedByPaymentProvider = 1015, + CouponCodeNotFound = 1016, + InvalidContainerItem = 1017, + ContainerNotOwned = 1018, + KeyNotOwned = 1019, + InvalidItemIdInTable = 1020, + InvalidReceipt = 1021, + ReceiptAlreadyUsed = 1022, + ReceiptCancelled = 1023, + GameNotFound = 1024, + GameModeNotFound = 1025, + InvalidGoogleToken = 1026, + UserIsNotPartOfDeveloper = 1027, + InvalidTitleForDeveloper = 1028, + TitleNameConflicts = 1029, + UserisNotValid = 1030, + ValueAlreadyExists = 1031, + BuildNotFound = 1032, + PlayerNotInGame = 1033, + InvalidTicket = 1034, + InvalidDeveloper = 1035, + InvalidOrderInfo = 1036, + RegistrationIncomplete = 1037, + InvalidPlatform = 1038, + UnknownError = 1039, + SteamApplicationNotOwned = 1040, + WrongSteamAccount = 1041, + TitleNotActivated = 1042, + RegistrationSessionNotFound = 1043, + NoSuchMod = 1044, + FileNotFound = 1045, + DuplicateEmail = 1046, + ItemNotFound = 1047, + ItemNotOwned = 1048, + ItemNotRecycleable = 1049, + ItemNotAffordable = 1050, + InvalidVirtualCurrency = 1051, + WrongVirtualCurrency = 1052, + WrongPrice = 1053, + NonPositiveValue = 1054, + InvalidRegion = 1055, + RegionAtCapacity = 1056, + ServerFailedToStart = 1057, + NameNotAvailable = 1058, + InsufficientFunds = 1059, + InvalidDeviceID = 1060, + InvalidPushNotificationToken = 1061, + NoRemainingUses = 1062, + InvalidPaymentProvider = 1063, + PurchaseInitializationFailure = 1064, + DuplicateUsername = 1065, + InvalidBuyerInfo = 1066, + NoGameModeParamsSet = 1067, + BodyTooLarge = 1068, + ReservedWordInBody = 1069, + InvalidTypeInBody = 1070, + InvalidRequest = 1071, + ReservedEventName = 1072, + InvalidUserStatistics = 1073, + NotAuthenticated = 1074, + StreamAlreadyExists = 1075, + ErrorCreatingStream = 1076, + StreamNotFound = 1077, + InvalidAccount = 1078, + PurchaseDoesNotExist = 1080, + InvalidPurchaseTransactionStatus = 1081, + APINotEnabledForGameClientAccess = 1082, + NoPushNotificationARNForTitle = 1083, + BuildAlreadyExists = 1084, + BuildPackageDoesNotExist = 1085, + CustomAnalyticsEventsNotEnabledForTitle = 1087, + InvalidSharedGroupId = 1088, + NotAuthorized = 1089, + MissingTitleGoogleProperties = 1090, + InvalidItemProperties = 1091, + InvalidPSNAuthCode = 1092, + InvalidItemId = 1093, + PushNotEnabledForAccount = 1094, + PushServiceError = 1095, + ReceiptDoesNotContainInAppItems = 1096, + ReceiptContainsMultipleInAppItems = 1097, + InvalidBundleID = 1098, + JavascriptException = 1099, + InvalidSessionTicket = 1100, + UnableToConnectToDatabase = 1101, + InternalServerError = 1110, + InvalidReportDate = 1111, + ReportNotAvailable = 1112, + DatabaseThroughputExceeded = 1113, + InvalidLobbyId = 1114, + InvalidGameTicket = 1115, + ExpiredGameTicket = 1116, + GameTicketDoesNotMatchLobby = 1117, + LinkedDeviceAlreadyClaimed = 1118, + DeviceAlreadyLinked = 1119, + DeviceNotLinked = 1120, + PartialFailure = 1121, + PublisherNotSet = 1122, + ServiceUnavailable = 1123, + VersionNotFound = 1124, + RevisionNotFound = 1125, + InvalidPublisherId = 1126, + DownstreamServiceUnavailable = 1127, + APINotIncludedInTitleUsageTier = 1128, + DAULimitExceeded = 1129, + APIRequestLimitExceeded = 1130, + InvalidAPIEndpoint = 1131, + BuildNotAvailable = 1132, + ConcurrentEditError = 1133, + ContentNotFound = 1134, + CharacterNotFound = 1135, + CloudScriptNotFound = 1136, + ContentQuotaExceeded = 1137, + InvalidCharacterStatistics = 1138, + PhotonNotEnabledForTitle = 1139, + PhotonApplicationNotFound = 1140, + PhotonApplicationNotAssociatedWithTitle = 1141, + InvalidEmailOrPassword = 1142, + FacebookAPIError = 1143, + InvalidContentType = 1144, + KeyLengthExceeded = 1145, + DataLengthExceeded = 1146, + TooManyKeys = 1147, + FreeTierCannotHaveVirtualCurrency = 1148, + MissingAmazonSharedKey = 1149, + AmazonValidationError = 1150, + InvalidPSNIssuerId = 1151, + PSNInaccessible = 1152, + ExpiredAuthToken = 1153, + FailedToGetEntitlements = 1154, + FailedToConsumeEntitlement = 1155, + TradeAcceptingUserNotAllowed = 1156, + TradeInventoryItemIsAssignedToCharacter = 1157, + TradeInventoryItemIsBundle = 1158, + TradeStatusNotValidForCancelling = 1159, + TradeStatusNotValidForAccepting = 1160, + TradeDoesNotExist = 1161, + TradeCancelled = 1162, + TradeAlreadyFilled = 1163, + TradeWaitForStatusTimeout = 1164, + TradeInventoryItemExpired = 1165, + TradeMissingOfferedAndAcceptedItems = 1166, + TradeAcceptedItemIsBundle = 1167, + TradeAcceptedItemIsStackable = 1168, + TradeInventoryItemInvalidStatus = 1169, + TradeAcceptedCatalogItemInvalid = 1170, + TradeAllowedUsersInvalid = 1171, + TradeInventoryItemDoesNotExist = 1172, + TradeInventoryItemIsConsumed = 1173, + TradeInventoryItemIsStackable = 1174, + TradeAcceptedItemsMismatch = 1175, + InvalidKongregateToken = 1176, + FeatureNotConfiguredForTitle = 1177, + NoMatchingCatalogItemForReceipt = 1178, + InvalidCurrencyCode = 1179, + NoRealMoneyPriceForCatalogItem = 1180, + TradeInventoryItemIsNotTradable = 1181, + TradeAcceptedCatalogItemIsNotTradable = 1182, + UsersAlreadyFriends = 1183, + LinkedIdentifierAlreadyClaimed = 1184, + CustomIdNotLinked = 1185, + TotalDataSizeExceeded = 1186, + DeleteKeyConflict = 1187, + InvalidXboxLiveToken = 1188, + ExpiredXboxLiveToken = 1189, + ResettableStatisticVersionRequired = 1190, + NotAuthorizedByTitle = 1191, + NoPartnerEnabled = 1192, + InvalidPartnerResponse = 1193, + APINotEnabledForGameServerAccess = 1194, + StatisticNotFound = 1195, + StatisticNameConflict = 1196, + StatisticVersionClosedForWrites = 1197, + StatisticVersionInvalid = 1198, + APIClientRequestRateLimitExceeded = 1199, + InvalidJSONContent = 1200, + InvalidDropTable = 1201, + StatisticVersionAlreadyIncrementedForScheduledInterval = 1202, + StatisticCountLimitExceeded = 1203, + StatisticVersionIncrementRateExceeded = 1204, + ContainerKeyInvalid = 1205, + CloudScriptExecutionTimeLimitExceeded = 1206, + NoWritePermissionsForEvent = 1207, + CloudScriptFunctionArgumentSizeExceeded = 1208, + CloudScriptAPIRequestCountExceeded = 1209, + CloudScriptAPIRequestError = 1210, + CloudScriptHTTPRequestError = 1211, + InsufficientGuildRole = 1212, + GuildNotFound = 1213, + OverLimit = 1214, + EventNotFound = 1215, + InvalidEventField = 1216, + InvalidEventName = 1217, + CatalogNotConfigured = 1218, + OperationNotSupportedForPlatform = 1219, + SegmentNotFound = 1220, + StoreNotFound = 1221, + InvalidStatisticName = 1222, + TitleNotQualifiedForLimit = 1223, + InvalidServiceLimitLevel = 1224, + ServiceLimitLevelInTransition = 1225, + CouponAlreadyRedeemed = 1226, + GameServerBuildSizeLimitExceeded = 1227, + GameServerBuildCountLimitExceeded = 1228, + VirtualCurrencyCountLimitExceeded = 1229, + VirtualCurrencyCodeExists = 1230, + TitleNewsItemCountLimitExceeded = 1231, + InvalidTwitchToken = 1232, + TwitchResponseError = 1233, + ProfaneDisplayName = 1234, + TwoFactorAuthenticationTokenRequired = 1246 + } + + #region Misc UI Models + public class StudioDisplaySet + { + public PlayFab.PfEditor.EditorModels.Studio Studio; + public bool isCollapsed = true; + public Dictionary titleFoldOutStates = new Dictionary(); + } + + public class TitleDisplaySet + { + public PlayFab.PfEditor.EditorModels.Title Title; + public bool isCollapsed = true; + } + + public class KvpItem + { + public string Key; + public string Value; + public string _prvKey; + public string _prvValue; + public bool isDirty; + + public KvpItem(string k, string v) + { + Key = k; + Value = v; + + _prvKey = k; + _prvValue = v; + } + + public void CleanItem() + { + _prvKey = Key; + _prvValue = Value; + isDirty = false; + } + + public void DataEditedCheck() + { + if (Key != _prvKey || Value != _prvValue) + isDirty = true; + } + } + #endregion +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta new file mode 100644 index 00000000..ac216148 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/PlayFabEditorModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9115cedc892e0c845941e0cb3f98bd3b +timeCreated: 1466719838 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs new file mode 100644 index 00000000..05d65f24 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs @@ -0,0 +1,2047 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) 2011, The Outercurve Foundation. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.opensource.org/licenses/mit-license.php +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Nathan Totten (ntotten.com), Jim Zimmerman (jimzimmerman.com) and Prabir Shrestha (prabir.me) +// https://github.com/facebook-csharp-sdk/simple-json +//----------------------------------------------------------------------- + +// VERSION: + +// NOTE: uncomment the following line to make SimpleJson class internal. +//#define SIMPLE_JSON_INTERNAL + +// NOTE: uncomment the following line to make JsonArray and JsonObject class internal. +//#define SIMPLE_JSON_OBJARRAYINTERNAL + +// NOTE: uncomment the following line to enable dynamic support. +//#define SIMPLE_JSON_DYNAMIC + +// NOTE: uncomment the following line to enable DataContract support. +//#define SIMPLE_JSON_DATACONTRACT + +// NOTE: uncomment the following line to enable IReadOnlyCollection and IReadOnlyList support. +//#define SIMPLE_JSON_READONLY_COLLECTIONS + +// NOTE: uncomment the following line if you are compiling under Window Metro style application/library. +// usually already defined in properties +#if UNITY_WSA && UNITY_WP8 +#define NETFX_CORE +#endif + +// If you are targetting WinStore, WP8 and NET4.5+ PCL make sure to +#if UNITY_WP8 || UNITY_WP8_1 || UNITY_WSA +// #define SIMPLE_JSON_TYPEINFO +#endif + +// original json parsing code from http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + +#if NETFX_CORE +#define SIMPLE_JSON_TYPEINFO +#endif + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +#if SIMPLE_JSON_DYNAMIC +using System.Dynamic; +#endif +using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text; + +// ReSharper disable LoopCanBeConvertedToQuery +// ReSharper disable RedundantExplicitArrayCreation +// ReSharper disable SuggestUseVarKeywordEvident +namespace PlayFab.PfEditor.Json +{ + /// + /// Represents the json array. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonArray : List + { + /// + /// Initializes a new instance of the class. + /// + public JsonArray() { } + + /// + /// Initializes a new instance of the class. + /// + /// The capacity of the json array. + public JsonArray(int capacity) : base(capacity) { } + + /// + /// The json representation of the array. + /// + /// The json representation of the array. + public override string ToString() + { + return PlayFabSimpleJson.SerializeObject(this) ?? string.Empty; + } + } + + /// + /// Represents the json object. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonObject : +#if SIMPLE_JSON_DYNAMIC + DynamicObject, +#endif + IDictionary + { + /// + /// The internal member dictionary. + /// + private readonly Dictionary _members; + + /// + /// Initializes a new instance of . + /// + public JsonObject() + { + _members = new Dictionary(); + } + + /// + /// Initializes a new instance of . + /// + /// The implementation to use when comparing keys, or null to use the default for the type of the key. + public JsonObject(IEqualityComparer comparer) + { + _members = new Dictionary(comparer); + } + + /// + /// Gets the at the specified index. + /// + /// + public object this[int index] + { + get { return GetAtIndex(_members, index); } + } + + internal static object GetAtIndex(IDictionary obj, int index) + { + if (obj == null) + throw new ArgumentNullException("obj"); + if (index >= obj.Count) + throw new ArgumentOutOfRangeException("index"); + int i = 0; + foreach (KeyValuePair o in obj) + if (i++ == index) return o.Value; + return null; + } + + /// + /// Adds the specified key. + /// + /// The key. + /// The value. + public void Add(string key, object value) + { + _members.Add(key, value); + } + + /// + /// Determines whether the specified key contains key. + /// + /// The key. + /// + /// true if the specified key contains key; otherwise, false. + /// + public bool ContainsKey(string key) + { + return _members.ContainsKey(key); + } + + /// + /// Gets the keys. + /// + /// The keys. + public ICollection Keys + { + get { return _members.Keys; } + } + + /// + /// Removes the specified key. + /// + /// The key. + /// + public bool Remove(string key) + { + return _members.Remove(key); + } + + /// + /// Tries the get value. + /// + /// The key. + /// The value. + /// + public bool TryGetValue(string key, out object value) + { + return _members.TryGetValue(key, out value); + } + + /// + /// Gets the values. + /// + /// The values. + public ICollection Values + { + get { return _members.Values; } + } + + /// + /// Gets or sets the with the specified key. + /// + /// + public object this[string key] + { + get { return _members[key]; } + set { _members[key] = value; } + } + + /// + /// Adds the specified item. + /// + /// The item. + public void Add(KeyValuePair item) + { + _members.Add(item.Key, item.Value); + } + + /// + /// Clears this instance. + /// + public void Clear() + { + _members.Clear(); + } + + /// + /// Determines whether [contains] [the specified item]. + /// + /// The item. + /// + /// true if [contains] [the specified item]; otherwise, false. + /// + public bool Contains(KeyValuePair item) + { + return _members.ContainsKey(item.Key) && _members[item.Key] == item.Value; + } + + /// + /// Copies to. + /// + /// The array. + /// Index of the array. + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (array == null) throw new ArgumentNullException("array"); + int num = Count; + foreach (KeyValuePair kvp in this) + { + array[arrayIndex++] = kvp; + if (--num <= 0) + return; + } + } + + /// + /// Gets the count. + /// + /// The count. + public int Count + { + get { return _members.Count; } + } + + /// + /// Gets a value indicating whether this instance is read only. + /// + /// + /// true if this instance is read only; otherwise, false. + /// + public bool IsReadOnly + { + get { return false; } + } + + /// + /// Removes the specified item. + /// + /// The item. + /// + public bool Remove(KeyValuePair item) + { + return _members.Remove(item.Key); + } + + /// + /// Gets the enumerator. + /// + /// + public IEnumerator> GetEnumerator() + { + return _members.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + return _members.GetEnumerator(); + } + + /// + /// Returns a json that represents the current . + /// + /// + /// A json that represents the current . + /// + public override string ToString() + { + return PlayFabSimpleJson.SerializeObject(this); + } + +#if SIMPLE_JSON_DYNAMIC + /// + /// Provides implementation for type conversion operations. Classes derived from the class can override this method to specify dynamic behavior for operations that convert an object from one type to another. + /// + /// Provides information about the conversion operation. The binder.Type property provides the type to which the object must be converted. For example, for the statement (String)sampleObject in C# (CType(sampleObject, Type) in Visual Basic), where sampleObject is an instance of the class derived from the class, binder.Type returns the type. The binder.Explicit property provides information about the kind of conversion that occurs. It returns true for explicit conversion and false for implicit conversion. + /// The result of the type conversion operation. + /// + /// Alwasy returns true. + /// + public override bool TryConvert(ConvertBinder binder, out object result) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + Type targetType = binder.Type; + + if ((targetType == typeof(IEnumerable)) || + (targetType == typeof(IEnumerable>)) || + (targetType == typeof(IDictionary)) || + (targetType == typeof(IDictionary))) + { + result = this; + return true; + } + + return base.TryConvert(binder, out result); + } + + /// + /// Provides the implementation for operations that delete an object member. This method is not intended for use in C# or Visual Basic. + /// + /// Provides information about the deletion. + /// + /// Alwasy returns true. + /// + public override bool TryDeleteMember(DeleteMemberBinder binder) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + return _members.Remove(binder.Name); + } + + /// + /// Provides the implementation for operations that get a value by index. Classes derived from the class can override this method to specify dynamic behavior for indexing operations. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] operation in C# (sampleObject(3) in Visual Basic), where sampleObject is derived from the DynamicObject class, is equal to 3. + /// The result of the index operation. + /// + /// Alwasy returns true. + /// + public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + result = ((IDictionary)this)[(string)indexes[0]]; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// Alwasy returns true. + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + object value; + if (_members.TryGetValue(binder.Name, out value)) + { + result = value; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that set a value by index. Classes derived from the class can override this method to specify dynamic behavior for operations that access objects by a specified index. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 3. + /// The value to set to the object that has the specified index. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 10. + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown. + /// + public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + ((IDictionary)this)[(string)indexes[0]] = value; + return true; + } + return base.TrySetIndex(binder, indexes, value); + } + + /// + /// Provides the implementation for operations that set member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as setting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member to which the value is being assigned. For example, for the statement sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The value to set to the member. For example, for sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, the is "Test". + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) + /// + public override bool TrySetMember(SetMemberBinder binder, object value) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + _members[binder.Name] = value; + return true; + } + + /// + /// Returns the enumeration of all dynamic member names. + /// + /// + /// A sequence that contains dynamic member names. + /// + public override IEnumerable GetDynamicMemberNames() + { + foreach (var key in Keys) + yield return key; + } +#endif + } + + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + /// All numbers are parsed to doubles. + /// + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + static class PlayFabSimpleJson + { + private enum TokenType : byte + { + NONE = 0, + CURLY_OPEN = 1, + CURLY_CLOSE = 2, + SQUARED_OPEN = 3, + SQUARED_CLOSE = 4, + COLON = 5, + COMMA = 6, + STRING = 7, + NUMBER = 8, + TRUE = 9, + FALSE = 10, + NULL = 11, + } + private const int BUILDER_INIT = 2000; + + private static readonly char[] EscapeTable; + private static readonly char[] EscapeCharacters = new char[] { '"', '\\', '\b', '\f', '\n', '\r', '\t' }; + // private static readonly string EscapeCharactersString = new string(EscapeCharacters); + internal static readonly List NumberTypes = new List { + typeof(bool), typeof(byte), typeof(ushort), typeof(uint), typeof(ulong), typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(double), typeof(float), typeof(decimal) + }; + + // Performance stuff + [ThreadStatic] + private static StringBuilder _serializeObjectBuilder; + [ThreadStatic] + private static StringBuilder _parseStringBuilder; + + static PlayFabSimpleJson() + { + EscapeTable = new char[93]; + EscapeTable['"'] = '"'; + EscapeTable['\\'] = '\\'; + EscapeTable['\b'] = 'b'; + EscapeTable['\f'] = 'f'; + EscapeTable['\n'] = 'n'; + EscapeTable['\r'] = 'r'; + EscapeTable['\t'] = 't'; + } + + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + public static object DeserializeObject(string json) + { + object obj; + if (TryDeserializeObject(json, out obj)) + return obj; + throw new SerializationException("Invalid JSON string"); + } + + /// + /// Try parsing the json string into a value. + /// + /// + /// A JSON string. + /// + /// + /// The object. + /// + /// + /// Returns true if successfull otherwise false. + /// + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + public static bool TryDeserializeObject(string json, out object obj) + { + bool success = true; + if (json != null) + { + char[] charArray = json.ToCharArray(); + int index = 0; + obj = ParseValue(charArray, ref index, ref success); + } + else + obj = null; + + return success; + } + + public static object DeserializeObject(string json, Type type, IJsonSerializerStrategy jsonSerializerStrategy) + { + object jsonObject = DeserializeObject(json); + return type == null || jsonObject != null && ReflectionUtils.IsAssignableFrom(jsonObject.GetType(), type) + ? jsonObject + : (jsonSerializerStrategy ?? CurrentJsonSerializerStrategy).DeserializeObject(jsonObject, type); + } + + public static object DeserializeObject(string json, Type type) + { + return DeserializeObject(json, type, null); + } + + public static T DeserializeObject(string json, IJsonSerializerStrategy jsonSerializerStrategy) + { + return (T)DeserializeObject(json, typeof(T), jsonSerializerStrategy); + } + + public static T DeserializeObject(string json) + { + return (T)DeserializeObject(json, typeof(T), null); + } + + /// + /// Converts a IDictionary<string,object> / IList<object> object into a JSON string + /// + /// A IDictionary<string,object> / IList<object> + /// Serializer strategy to use + /// A JSON encoded string, or null if object 'json' is not serializable + public static string SerializeObject(object json, IJsonSerializerStrategy jsonSerializerStrategy = null) + { + if (_serializeObjectBuilder == null) + _serializeObjectBuilder = new StringBuilder(BUILDER_INIT); + _serializeObjectBuilder.Length = 0; + + if (jsonSerializerStrategy == null) + jsonSerializerStrategy = CurrentJsonSerializerStrategy; + + bool success = SerializeValue(jsonSerializerStrategy, json, _serializeObjectBuilder); + return (success ? _serializeObjectBuilder.ToString() : null); + } + + public static string EscapeToJavascriptString(string jsonString) + { + if (string.IsNullOrEmpty(jsonString)) + return jsonString; + + StringBuilder sb = new StringBuilder(); + char c; + + for (int i = 0; i < jsonString.Length;) + { + c = jsonString[i++]; + + if (c == '\\') + { + int remainingLength = jsonString.Length - i; + if (remainingLength >= 2) + { + char lookahead = jsonString[i]; + if (lookahead == '\\') + { + sb.Append('\\'); + ++i; + } + else if (lookahead == '"') + { + sb.Append("\""); + ++i; + } + else if (lookahead == 't') + { + sb.Append('\t'); + ++i; + } + else if (lookahead == 'b') + { + sb.Append('\b'); + ++i; + } + else if (lookahead == 'n') + { + sb.Append('\n'); + ++i; + } + else if (lookahead == 'r') + { + sb.Append('\r'); + ++i; + } + } + } + else + { + sb.Append(c); + } + } + return sb.ToString(); + } + + static IDictionary ParseObject(char[] json, ref int index, ref bool success) + { + IDictionary table = new JsonObject(); + TokenType token; + + // { + NextToken(json, ref index); + + bool done = false; + while (!done) + { + token = LookAhead(json, index); + if (token == TokenType.NONE) + { + success = false; + return null; + } + else if (token == TokenType.COMMA) + NextToken(json, ref index); + else if (token == TokenType.CURLY_CLOSE) + { + NextToken(json, ref index); + return table; + } + else + { + // name + string name = ParseString(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + // : + token = NextToken(json, ref index); + if (token != TokenType.COLON) + { + success = false; + return null; + } + // value + object value = ParseValue(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + table[name] = value; + } + } + return table; + } + + static JsonArray ParseArray(char[] json, ref int index, ref bool success) + { + JsonArray array = new JsonArray(); + + // [ + NextToken(json, ref index); + + bool done = false; + while (!done) + { + TokenType token = LookAhead(json, index); + if (token == TokenType.NONE) + { + success = false; + return null; + } + else if (token == TokenType.COMMA) + NextToken(json, ref index); + else if (token == TokenType.SQUARED_CLOSE) + { + NextToken(json, ref index); + break; + } + else + { + object value = ParseValue(json, ref index, ref success); + if (!success) + return null; + array.Add(value); + } + } + return array; + } + + static object ParseValue(char[] json, ref int index, ref bool success) + { + switch (LookAhead(json, index)) + { + case TokenType.STRING: + return ParseString(json, ref index, ref success); + case TokenType.NUMBER: + return ParseNumber(json, ref index, ref success); + case TokenType.CURLY_OPEN: + return ParseObject(json, ref index, ref success); + case TokenType.SQUARED_OPEN: + return ParseArray(json, ref index, ref success); + case TokenType.TRUE: + NextToken(json, ref index); + return true; + case TokenType.FALSE: + NextToken(json, ref index); + return false; + case TokenType.NULL: + NextToken(json, ref index); + return null; + case TokenType.NONE: + break; + } + success = false; + return null; + } + + static string ParseString(char[] json, ref int index, ref bool success) + { + if (_parseStringBuilder == null) + _parseStringBuilder = new StringBuilder(BUILDER_INIT); + _parseStringBuilder.Length = 0; + + EatWhitespace(json, ref index); + + // " + char c = json[index++]; + bool complete = false; + while (!complete) + { + if (index == json.Length) + break; + + c = json[index++]; + if (c == '"') + { + complete = true; + break; + } + else if (c == '\\') + { + if (index == json.Length) + break; + c = json[index++]; + if (c == '"') + _parseStringBuilder.Append('"'); + else if (c == '\\') + _parseStringBuilder.Append('\\'); + else if (c == '/') + _parseStringBuilder.Append('/'); + else if (c == 'b') + _parseStringBuilder.Append('\b'); + else if (c == 'f') + _parseStringBuilder.Append('\f'); + else if (c == 'n') + _parseStringBuilder.Append('\n'); + else if (c == 'r') + _parseStringBuilder.Append('\r'); + else if (c == 't') + _parseStringBuilder.Append('\t'); + else if (c == 'u') + { + int remainingLength = json.Length - index; + if (remainingLength >= 4) + { + // parse the 32 bit hex into an integer codepoint + uint codePoint; + if (!(success = UInt32.TryParse(new string(json, index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint))) + return ""; + + // convert the integer codepoint to a unicode char and add to string + if (0xD800 <= codePoint && codePoint <= 0xDBFF) // if high surrogate + { + index += 4; // skip 4 chars + remainingLength = json.Length - index; + if (remainingLength >= 6) + { + uint lowCodePoint; + if (new string(json, index, 2) == "\\u" && UInt32.TryParse(new string(json, index + 2, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out lowCodePoint)) + { + if (0xDC00 <= lowCodePoint && lowCodePoint <= 0xDFFF) // if low surrogate + { + _parseStringBuilder.Append((char)codePoint); + _parseStringBuilder.Append((char)lowCodePoint); + index += 6; // skip 6 chars + continue; + } + } + } + success = false; // invalid surrogate pair + return ""; + } + _parseStringBuilder.Append(ConvertFromUtf32((int)codePoint)); + // skip 4 chars + index += 4; + } + else + break; + } + } + else + _parseStringBuilder.Append(c); + } + if (!complete) + { + success = false; + return null; + } + return _parseStringBuilder.ToString(); + } + + private static string ConvertFromUtf32(int utf32) + { + // http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System/System/Char.cs.htm + if (utf32 < 0 || utf32 > 0x10FFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must be from 0 to 0x10FFFF."); + if (0xD800 <= utf32 && utf32 <= 0xDFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must not be in surrogate pair range."); + if (utf32 < 0x10000) + return new string((char)utf32, 1); + utf32 -= 0x10000; + return new string(new char[] { (char)((utf32 >> 10) + 0xD800), (char)(utf32 % 0x0400 + 0xDC00) }); + } + + static object ParseNumber(char[] json, ref int index, ref bool success) + { + EatWhitespace(json, ref index); + int lastIndex = GetLastIndexOfNumber(json, index); + int charLength = (lastIndex - index) + 1; + object returnNumber; + string str = new string(json, index, charLength); + if (str.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || str.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) + { + double number; + success = double.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else if (str.IndexOf("-", StringComparison.OrdinalIgnoreCase) == -1) + { + ulong number; + success = ulong.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else + { + long number; + success = long.TryParse(new string(json, index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + index = lastIndex + 1; + return returnNumber; + } + + static int GetLastIndexOfNumber(char[] json, int index) + { + int lastIndex; + for (lastIndex = index; lastIndex < json.Length; lastIndex++) + if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) break; + return lastIndex - 1; + } + + static void EatWhitespace(char[] json, ref int index) + { + for (; index < json.Length; index++) + if (" \t\n\r\b\f".IndexOf(json[index]) == -1) break; + } + + static TokenType LookAhead(char[] json, int index) + { + int saveIndex = index; + return NextToken(json, ref saveIndex); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + static TokenType NextToken(char[] json, ref int index) + { + EatWhitespace(json, ref index); + if (index == json.Length) + return TokenType.NONE; + char c = json[index]; + index++; + switch (c) + { + case '{': + return TokenType.CURLY_OPEN; + case '}': + return TokenType.CURLY_CLOSE; + case '[': + return TokenType.SQUARED_OPEN; + case ']': + return TokenType.SQUARED_CLOSE; + case ',': + return TokenType.COMMA; + case '"': + return TokenType.STRING; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TokenType.NUMBER; + case ':': + return TokenType.COLON; + } + index--; + int remainingLength = json.Length - index; + // false + if (remainingLength >= 5) + { + if (json[index] == 'f' && json[index + 1] == 'a' && json[index + 2] == 'l' && json[index + 3] == 's' && json[index + 4] == 'e') + { + index += 5; + return TokenType.FALSE; + } + } + // true + if (remainingLength >= 4) + { + if (json[index] == 't' && json[index + 1] == 'r' && json[index + 2] == 'u' && json[index + 3] == 'e') + { + index += 4; + return TokenType.TRUE; + } + } + // null + if (remainingLength >= 4) + { + if (json[index] == 'n' && json[index + 1] == 'u' && json[index + 2] == 'l' && json[index + 3] == 'l') + { + index += 4; + return TokenType.NULL; + } + } + return TokenType.NONE; + } + + static bool SerializeValue(IJsonSerializerStrategy jsonSerializerStrategy, object value, StringBuilder builder) + { + bool success = true; + string stringValue = value as string; + if (value == null) + builder.Append("null"); + else if (stringValue != null) + success = SerializeString(stringValue, builder); + else + { + IDictionary dict = value as IDictionary; + Type type = value.GetType(); + Type[] genArgs = ReflectionUtils.GetGenericTypeArguments(type); +#if NETFX_CORE + var isStringKeyDictionary = type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>) && genArgs[0] == typeof(string); +#else + var isStringKeyDictionary = type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>) && genArgs[0] == typeof(string); +#endif + if (isStringKeyDictionary) + { + var strDictValue = value as IDictionary; + success = SerializeObject(jsonSerializerStrategy, strDictValue.Keys, strDictValue.Values, builder); + } + else if (dict != null) + { + success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, builder); + } + else + { + IDictionary stringDictionary = value as IDictionary; + if (stringDictionary != null) + { + success = SerializeObject(jsonSerializerStrategy, stringDictionary.Keys, stringDictionary.Values, builder); + } + else + { + IEnumerable enumerableValue = value as IEnumerable; + if (enumerableValue != null) + success = SerializeArray(jsonSerializerStrategy, enumerableValue, builder); + else if (IsNumeric(value)) + success = SerializeNumber(value, builder); + else if (value is bool) + builder.Append((bool)value ? "true" : "false"); + else + { + object serializedObject; + success = jsonSerializerStrategy.TrySerializeNonPrimitiveObject(value, out serializedObject); + if (success) + SerializeValue(jsonSerializerStrategy, serializedObject, builder); + } + } + } + } + return success; + } + + static bool SerializeObject(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable keys, IEnumerable values, StringBuilder builder) + { + builder.Append("{"); + IEnumerator ke = keys.GetEnumerator(); + IEnumerator ve = values.GetEnumerator(); + bool first = true; + while (ke.MoveNext() && ve.MoveNext()) + { + object key = ke.Current; + object value = ve.Current; + if (!first) + builder.Append(","); + string stringKey = key as string; + if (stringKey != null) + SerializeString(stringKey, builder); + else + if (!SerializeValue(jsonSerializerStrategy, value, builder)) return false; + builder.Append(":"); + if (!SerializeValue(jsonSerializerStrategy, value, builder)) + return false; + first = false; + } + builder.Append("}"); + return true; + } + + static bool SerializeArray(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable anArray, StringBuilder builder) + { + builder.Append("["); + bool first = true; + foreach (object value in anArray) + { + if (!first) + builder.Append(","); + if (!SerializeValue(jsonSerializerStrategy, value, builder)) + return false; + first = false; + } + builder.Append("]"); + return true; + } + + static bool SerializeString(string aString, StringBuilder builder) + { + // Happy path if there's nothing to be escaped. IndexOfAny is highly optimized (and unmanaged) + if (aString.IndexOfAny(EscapeCharacters) == -1) + { + builder.Append('"'); + builder.Append(aString); + builder.Append('"'); + + return true; + } + + builder.Append('"'); + int safeCharacterCount = 0; + char[] charArray = aString.ToCharArray(); + + for (int i = 0; i < charArray.Length; i++) + { + char c = charArray[i]; + + // Non ascii characters are fine, buffer them up and send them to the builder + // in larger chunks if possible. The escape table is a 1:1 translation table + // with \0 [default(char)] denoting a safe character. + if (c >= EscapeTable.Length || EscapeTable[c] == default(char)) + { + safeCharacterCount++; + } + else + { + if (safeCharacterCount > 0) + { + builder.Append(charArray, i - safeCharacterCount, safeCharacterCount); + safeCharacterCount = 0; + } + + builder.Append('\\'); + builder.Append(EscapeTable[c]); + } + } + + if (safeCharacterCount > 0) + { + builder.Append(charArray, charArray.Length - safeCharacterCount, safeCharacterCount); + } + + builder.Append('"'); + return true; + } + + static bool SerializeNumber(object number, StringBuilder builder) + { + if (number is decimal) + builder.Append(((decimal)number).ToString("R", CultureInfo.InvariantCulture)); + else if (number is double) + builder.Append(((double)number).ToString("R", CultureInfo.InvariantCulture)); + else if (number is float) + builder.Append(((float)number).ToString("R", CultureInfo.InvariantCulture)); + else if (NumberTypes.IndexOf(number.GetType()) != -1) + builder.Append(number); + return true; + } + + /// + /// Determines if a given object is numeric in any way + /// (can be integer, double, null, etc). + /// + static bool IsNumeric(object value) + { + if (value is sbyte) return true; + if (value is byte) return true; + if (value is short) return true; + if (value is ushort) return true; + if (value is int) return true; + if (value is uint) return true; + if (value is long) return true; + if (value is ulong) return true; + if (value is float) return true; + if (value is double) return true; + if (value is decimal) return true; + return false; + } + + private static IJsonSerializerStrategy _currentJsonSerializerStrategy; + public static IJsonSerializerStrategy CurrentJsonSerializerStrategy + { + get + { + return _currentJsonSerializerStrategy ?? + (_currentJsonSerializerStrategy = +#if SIMPLE_JSON_DATACONTRACT + DataContractJsonSerializerStrategy +#else + PocoJsonSerializerStrategy +#endif +); + } + set + { + _currentJsonSerializerStrategy = value; + } + } + + private static PocoJsonSerializerStrategy _pocoJsonSerializerStrategy; + [EditorBrowsable(EditorBrowsableState.Advanced)] + public static PocoJsonSerializerStrategy PocoJsonSerializerStrategy + { + get + { + return _pocoJsonSerializerStrategy ?? (_pocoJsonSerializerStrategy = new PocoJsonSerializerStrategy()); + } + } + +#if SIMPLE_JSON_DATACONTRACT + + private static DataContractJsonSerializerStrategy _dataContractJsonSerializerStrategy; + [System.ComponentModel.EditorBrowsable(EditorBrowsableState.Advanced)] + public static DataContractJsonSerializerStrategy DataContractJsonSerializerStrategy + { + get + { + return _dataContractJsonSerializerStrategy ?? (_dataContractJsonSerializerStrategy = new DataContractJsonSerializerStrategy()); + } + } + +#endif + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + interface IJsonSerializerStrategy + { + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + bool TrySerializeNonPrimitiveObject(object input, out object output); + object DeserializeObject(object value, Type type); + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class PocoJsonSerializerStrategy : IJsonSerializerStrategy + { + internal IDictionary ConstructorCache; + internal IDictionary> GetCache; + internal IDictionary>> SetCache; + + internal static readonly Type[] EmptyTypes = new Type[0]; + internal static readonly Type[] ArrayConstructorParameterTypes = new Type[] { typeof(int) }; + + private static readonly string[] Iso8601Format = new string[] + { + @"yyyy-MM-dd\THH:mm:ss.FFFFFFF\Z", + @"yyyy-MM-dd\THH:mm:ss\Z", + @"yyyy-MM-dd\THH:mm:ssK" + }; + + public PocoJsonSerializerStrategy() + { + ConstructorCache = new ReflectionUtils.ThreadSafeDictionary(ContructorDelegateFactory); + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + protected virtual string MapClrMemberNameToJsonFieldName(string clrPropertyName) + { + return clrPropertyName; + } + + internal virtual ReflectionUtils.ConstructorDelegate ContructorDelegateFactory(Type key) + { + return ReflectionUtils.GetContructor(key, key.IsArray ? ArrayConstructorParameterTypes : EmptyTypes); + } + + internal virtual IDictionary GetterValueFactory(Type type) + { + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (getMethod.IsStatic || !getMethod.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal virtual IDictionary> SetterValueFactory(Type type) + { + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (setMethod.IsStatic || !setMethod.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(propertyInfo.Name)] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsInitOnly || fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(fieldInfo.Name)] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + return result; + } + + public virtual bool TrySerializeNonPrimitiveObject(object input, out object output) + { + return TrySerializeKnownTypes(input, out output) || TrySerializeUnknownTypes(input, out output); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + public virtual object DeserializeObject(object value, Type type) + { + if (type == null) throw new ArgumentNullException("type"); + string str = value as string; + + if (type == typeof(Guid) && string.IsNullOrEmpty(str)) + return default(Guid); + + if (value == null) + return null; + + object obj = null; + + if (str != null) + { + if (str.Length != 0) // We know it can't be null now. + { + if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) + return DateTime.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) + return DateTimeOffset.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) + return new Guid(str); + if (type == typeof(Uri)) + { + bool isValid = Uri.IsWellFormedUriString(str, UriKind.RelativeOrAbsolute); + + Uri result; + if (isValid && Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out result)) + return result; + + return null; + } + + if (type == typeof(string)) + return str; + + return Convert.ChangeType(str, type, CultureInfo.InvariantCulture); + } + else + { + if (type == typeof(Guid)) + obj = default(Guid); + else if (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + obj = null; + else + obj = str; + } + // Empty string case + if (!ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + return str; + } + else if (value is bool) + return value; + + bool valueIsLong = value is long; + bool valueIsUlong = value is ulong; + bool valueIsDouble = value is double; + Type nullableType = Nullable.GetUnderlyingType(type); + if (nullableType != null && PlayFabSimpleJson.NumberTypes.IndexOf(nullableType) != -1) + type = nullableType; // Just use the regular type for the conversion + bool isNumberType = PlayFabSimpleJson.NumberTypes.IndexOf(type) != -1; +#if NETFX_CORE + bool isEnumType = type.GetTypeInfo().IsEnum; +#else + bool isEnumType = type.IsEnum; //type.GetType; +#endif + if ((valueIsLong && type == typeof(long)) || (valueIsUlong && type == typeof(ulong)) || (valueIsDouble && type == typeof(double))) + return value; + if ((valueIsLong || valueIsUlong || valueIsDouble) && isEnumType) + return Enum.ToObject(type, Convert.ChangeType(value, Enum.GetUnderlyingType(type), CultureInfo.InvariantCulture)); + if ((valueIsLong || valueIsUlong || valueIsDouble) && isNumberType) + return Convert.ChangeType(value, type, CultureInfo.InvariantCulture); + + IDictionary objects = value as IDictionary; + if (objects != null) + { + IDictionary jsonObject = objects; + + if (ReflectionUtils.IsTypeDictionary(type)) + { + // if dictionary then + Type[] types = ReflectionUtils.GetGenericTypeArguments(type); + Type keyType = types[0]; + Type valueType = types[1]; + + Type genericType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); + + IDictionary dict = (IDictionary)ConstructorCache[genericType](); + + foreach (KeyValuePair kvp in jsonObject) + dict.Add(kvp.Key, DeserializeObject(kvp.Value, valueType)); + + obj = dict; + } + else + { + if (type == typeof(object)) + obj = value; + else + { + obj = ConstructorCache[type](); + foreach (KeyValuePair> setter in SetCache[type]) + { + object jsonValue; + if (jsonObject.TryGetValue(setter.Key, out jsonValue)) + { + jsonValue = DeserializeObject(jsonValue, setter.Value.Key); + setter.Value.Value(obj, jsonValue); + } + } + } + } + } + else + { + IList valueAsList = value as IList; + if (valueAsList != null) + { + IList jsonObject = valueAsList; + IList list = null; + + if (type.IsArray) + { + list = (IList)ConstructorCache[type](jsonObject.Count); + int i = 0; + foreach (object o in jsonObject) + list[i++] = DeserializeObject(o, type.GetElementType()); + } + else if (ReflectionUtils.IsTypeGenericeCollectionInterface(type) || ReflectionUtils.IsAssignableFrom(typeof(IList), type)) + { + Type innerType = ReflectionUtils.GetGenericListElementType(type); + list = (IList)(ConstructorCache[type] ?? ConstructorCache[typeof(List<>).MakeGenericType(innerType)])(); + foreach (object o in jsonObject) + list.Add(DeserializeObject(o, innerType)); + } + obj = list; + } + return obj; + } + if (ReflectionUtils.IsNullableType(type)) + return ReflectionUtils.ToNullableType(obj, type); + return obj; + } + + protected virtual object SerializeEnum(Enum p) + { + return Convert.ToDouble(p, CultureInfo.InvariantCulture); + } + + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeKnownTypes(object input, out object output) + { + bool returnValue = true; + if (input is DateTime) + output = ((DateTime)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is DateTimeOffset) + output = ((DateTimeOffset)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is Guid) + output = ((Guid)input).ToString("D"); + else if (input is Uri) + output = input.ToString(); + else + { + Enum inputEnum = input as Enum; + if (inputEnum != null) + output = SerializeEnum(inputEnum); + else + { + returnValue = false; + output = null; + } + } + return returnValue; + } + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeUnknownTypes(object input, out object output) + { + if (input == null) throw new ArgumentNullException("input"); + output = null; + Type type = input.GetType(); + if (type.FullName == null) + return false; + IDictionary obj = new JsonObject(); + IDictionary getters = GetCache[type]; + foreach (KeyValuePair getter in getters) + { + if (getter.Value != null) + obj.Add(MapClrMemberNameToJsonFieldName(getter.Key), getter.Value(input)); + } + output = obj; + return true; + } + } + +#if SIMPLE_JSON_DATACONTRACT + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class DataContractJsonSerializerStrategy : PocoJsonSerializerStrategy + { + public DataContractJsonSerializerStrategy() + { + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + internal override IDictionary GetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.GetterValueFactory(type); + string jsonKey; + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (!getMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal override IDictionary> SetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.SetterValueFactory(type); + string jsonKey; + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (!setMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsInitOnly && !fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + // todo implement sorting for DATACONTRACT. + return result; + } + + private static bool CanAdd(MemberInfo info, out string jsonKey) + { + jsonKey = null; + if (ReflectionUtils.GetAttribute(info, typeof(IgnoreDataMemberAttribute)) != null) + return false; + DataMemberAttribute dataMemberAttribute = (DataMemberAttribute)ReflectionUtils.GetAttribute(info, typeof(DataMemberAttribute)); + if (dataMemberAttribute == null) + return false; + jsonKey = string.IsNullOrEmpty(dataMemberAttribute.Name) ? info.Name : dataMemberAttribute.Name; + return true; + } + } + +#endif + + // This class is meant to be copied into other libraries. So we want to exclude it from Code Analysis rules + // that might be in place in the target project. + [GeneratedCode("reflection-utils", "1.0.0")] +#if SIMPLE_JSON_REFLECTION_UTILS_PUBLIC + public +#else + internal +#endif + class ReflectionUtils + { + private static readonly object[] EmptyObjects = new object[0]; + + public delegate object GetDelegate(object source); + public delegate void SetDelegate(object source, object value); + public delegate object ConstructorDelegate(params object[] args); + + public delegate TValue ThreadSafeDictionaryValueFactory(TKey key); + + [ThreadStatic] + private static object[] _1ObjArray; + +#if SIMPLE_JSON_TYPEINFO + public static TypeInfo GetTypeInfo(Type type) + { + return type.GetTypeInfo(); + } +#else + public static Type GetTypeInfo(Type type) + { + return type; + } +#endif + + public static Attribute GetAttribute(MemberInfo info, Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (info == null || type == null || !info.IsDefined(type)) + return null; + return info.GetCustomAttribute(type); +#else + if (info == null || type == null || !Attribute.IsDefined(info, type)) + return null; + return Attribute.GetCustomAttribute(info, type); +#endif + } + + public static Type GetGenericListElementType(Type type) + { + IEnumerable interfaces; +#if SIMPLE_JSON_TYPEINFO + interfaces = type.GetTypeInfo().ImplementedInterfaces; +#else + interfaces = type.GetInterfaces(); +#endif + foreach (Type implementedInterface in interfaces) + { + if (IsTypeGeneric(implementedInterface) && + implementedInterface.GetGenericTypeDefinition() == typeof(IList<>)) + { + return GetGenericTypeArguments(implementedInterface)[0]; + } + } + return GetGenericTypeArguments(type)[0]; + } + + public static Attribute GetAttribute(Type objectType, Type attributeType) + { + +#if SIMPLE_JSON_TYPEINFO + if (objectType == null || attributeType == null || !objectType.GetTypeInfo().IsDefined(attributeType)) + return null; + return objectType.GetTypeInfo().GetCustomAttribute(attributeType); +#else + if (objectType == null || attributeType == null || !Attribute.IsDefined(objectType, attributeType)) + return null; + return Attribute.GetCustomAttribute(objectType, attributeType); +#endif + } + + public static Type[] GetGenericTypeArguments(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().GenericTypeArguments; +#else + return type.GetGenericArguments(); +#endif + } + + public static bool IsTypeGeneric(Type type) + { + return GetTypeInfo(type).IsGenericType; + } + + public static bool IsTypeGenericeCollectionInterface(Type type) + { + if (!IsTypeGeneric(type)) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + + return (genericDefinition == typeof(IList<>) + || genericDefinition == typeof(ICollection<>) + || genericDefinition == typeof(IEnumerable<>) +#if SIMPLE_JSON_READONLY_COLLECTIONS + || genericDefinition == typeof(IReadOnlyCollection<>) + || genericDefinition == typeof(IReadOnlyList<>) +#endif +); + } + + public static bool IsAssignableFrom(Type type1, Type type2) + { + return GetTypeInfo(type1).IsAssignableFrom(GetTypeInfo(type2)); + } + + public static bool IsTypeDictionary(Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (typeof(IDictionary<,>).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) + return true; +#else + if (typeof(System.Collections.IDictionary).IsAssignableFrom(type)) + return true; +#endif + if (!GetTypeInfo(type).IsGenericType) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + return genericDefinition == typeof(IDictionary<,>); + } + + public static bool IsNullableType(Type type) + { + return GetTypeInfo(type).IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + + public static object ToNullableType(object obj, Type nullableType) + { + return obj == null ? null : Convert.ChangeType(obj, Nullable.GetUnderlyingType(nullableType), CultureInfo.InvariantCulture); + } + + public static bool IsValueType(Type type) + { + return GetTypeInfo(type).IsValueType; + } + + public static IEnumerable GetConstructors(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().DeclaredConstructors; +#else + return type.GetConstructors(); +#endif + } + + public static ConstructorInfo GetConstructorInfo(Type type, params Type[] argsType) + { + IEnumerable constructorInfos = GetConstructors(type); + int i; + bool matches; + foreach (ConstructorInfo constructorInfo in constructorInfos) + { + ParameterInfo[] parameters = constructorInfo.GetParameters(); + if (argsType.Length != parameters.Length) + continue; + + i = 0; + matches = true; + foreach (ParameterInfo parameterInfo in constructorInfo.GetParameters()) + { + if (parameterInfo.ParameterType != argsType[i]) + { + matches = false; + break; + } + } + + if (matches) + return constructorInfo; + } + + return null; + } + + public static IEnumerable GetProperties(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeProperties(); +#else + return type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static IEnumerable GetFields(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeFields(); +#else + return type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static MethodInfo GetGetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.GetMethod; +#else + return propertyInfo.GetGetMethod(true); +#endif + } + + public static MethodInfo GetSetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.SetMethod; +#else + return propertyInfo.GetSetMethod(true); +#endif + } + + public static ConstructorDelegate GetContructor(ConstructorInfo constructorInfo) + { + return GetConstructorByReflection(constructorInfo); + } + + public static ConstructorDelegate GetContructor(Type type, params Type[] argsType) + { + return GetConstructorByReflection(type, argsType); + } + + public static ConstructorDelegate GetConstructorByReflection(ConstructorInfo constructorInfo) + { + return delegate (object[] args) + { + var x = constructorInfo; + return x.Invoke(args); + }; + } + + public static ConstructorDelegate GetConstructorByReflection(Type type, params Type[] argsType) + { + ConstructorInfo constructorInfo = GetConstructorInfo(type, argsType); + return constructorInfo == null ? null : GetConstructorByReflection(constructorInfo); + } + + public static GetDelegate GetGetMethod(PropertyInfo propertyInfo) + { + return GetGetMethodByReflection(propertyInfo); + } + + public static GetDelegate GetGetMethod(FieldInfo fieldInfo) + { + return GetGetMethodByReflection(fieldInfo); + } + + public static GetDelegate GetGetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetGetterMethodInfo(propertyInfo); + return delegate (object source) { return methodInfo.Invoke(source, EmptyObjects); }; + } + + public static GetDelegate GetGetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source) { return fieldInfo.GetValue(source); }; + } + + public static SetDelegate GetSetMethod(PropertyInfo propertyInfo) + { + return GetSetMethodByReflection(propertyInfo); + } + + public static SetDelegate GetSetMethod(FieldInfo fieldInfo) + { + return GetSetMethodByReflection(fieldInfo); + } + + public static SetDelegate GetSetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetSetterMethodInfo(propertyInfo); + return delegate (object source, object value) + { + if (_1ObjArray == null) + _1ObjArray = new object[1]; + _1ObjArray[0] = value; + methodInfo.Invoke(source, _1ObjArray); + }; + } + + public static SetDelegate GetSetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source, object value) { fieldInfo.SetValue(source, value); }; + } + + public sealed class ThreadSafeDictionary : IDictionary + { + private readonly object _lock = new object(); + private readonly ThreadSafeDictionaryValueFactory _valueFactory; + private Dictionary _dictionary; + + public ThreadSafeDictionary(ThreadSafeDictionaryValueFactory valueFactory) + { + _valueFactory = valueFactory; + } + + private TValue Get(TKey key) + { + if (_dictionary == null) + return AddValue(key); + TValue value; + if (!_dictionary.TryGetValue(key, out value)) + return AddValue(key); + return value; + } + + private TValue AddValue(TKey key) + { + TValue value = _valueFactory(key); + lock (_lock) + { + if (_dictionary == null) + { + _dictionary = new Dictionary(); + _dictionary[key] = value; + } + else + { + TValue val; + if (_dictionary.TryGetValue(key, out val)) + return val; + Dictionary dict = new Dictionary(_dictionary); + dict[key] = value; + _dictionary = dict; + } + } + return value; + } + + public void Add(TKey key, TValue value) + { + throw new NotImplementedException(); + } + + public bool ContainsKey(TKey key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(TKey key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(TKey key, out TValue value) + { + value = this[key]; + return true; + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public TValue this[TKey key] + { + get { return Get(key); } + set { throw new NotImplementedException(); } + } + + public void Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { throw new NotImplementedException(); } + } + + public bool Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + } + } +} + +// ReSharper restore LoopCanBeConvertedToQuery +// ReSharper restore RedundantExplicitArrayCreation +// ReSharper restore SuggestUseVarKeywordEvident diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta new file mode 100644 index 00000000..83a07691 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/PlayFabEditorSDK/SimpleJson.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 0f0d14c9d506300479e2ab23ae3af45f +timeCreated: 1466707367 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta new file mode 100644 index 00000000..e8597d75 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 71cec03dd8d77ee489008fa915e3b3a2 +folderAsset: yes +timeCreated: 1466715484 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs new file mode 100644 index 00000000..d6e14b7b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using UnityEngine.Networking; + +namespace PlayFab.PfEditor +{ + public class EditorCoroutine + { + public string Id; + public class EditorWaitForSeconds : YieldInstruction + { + public float Seconds; + + public EditorWaitForSeconds(float seconds) + { + this.Seconds = seconds; + } + } + + private SortedList shouldRunAfterTimes = new SortedList(); + private const float _tick = .02f; + + public static EditorCoroutine Start(IEnumerator _routine) + { + var coroutine = new EditorCoroutine(_routine); + coroutine.Id = Guid.NewGuid().ToString(); + coroutine.Start(); + return coroutine; + } + +#if UNITY_2018_2_OR_NEWER + public static EditorCoroutine Start(IEnumerator _routine, UnityWebRequest www) + { + var coroutine = new EditorCoroutine(_routine); + coroutine.Id = Guid.NewGuid().ToString(); + coroutine._www = www; + coroutine.Start(); + return coroutine; + } +#else + public static EditorCoroutine Start(IEnumerator _routine, WWW www) + { + var coroutine = new EditorCoroutine(_routine); + coroutine.Id = Guid.NewGuid().ToString(); + coroutine._www = www; + coroutine.Start(); + return coroutine; + } +#endif + + + readonly IEnumerator routine; + + +#if UNITY_2018_2_OR_NEWER + private UnityWebRequest _www; + private bool _sent = false; +#else + private WWW _www; +#endif + + EditorCoroutine(IEnumerator _routine) + { + routine = _routine; + } + + void Start() + { + EditorApplication.update += Update; + } + private void Stop() + { + EditorApplication.update -= Update; + _www.Dispose(); + } + + private float _timeCounter = 0; + void Update() + { + _timeCounter += _tick; + //Debug.LogFormat("ID:{0} TimeCounter:{1}", this.Id, _timeCounter); + + try + { + if (_www != null) + { +#if UNITY_2018_2_OR_NEWER + if (!_sent) + { + try + { + routine.MoveNext(); + _sent = true; + } + catch (ArgumentNullException) + { + } + } +#endif + + if (_www.isDone && !routine.MoveNext()) + { + Stop(); + } + } + else + { + var seconds = routine.Current as EditorWaitForSeconds; + if (seconds != null) + { + var wait = seconds; + shouldRunAfterTimes.Add(_timeCounter + wait.Seconds, routine); + } + else if (!routine.MoveNext()) + { + Stop(); + } + } + + var shouldRun = shouldRunAfterTimes; + var index = 0; + foreach (var runAfterSeconds in shouldRun) + { + if (_timeCounter >= runAfterSeconds.Key) + { + //Debug.LogFormat("RunAfterSeconds: {0} >= {1}", runAfterSeconds.Key, _timeCounter); + shouldRunAfterTimes.RemoveAt(index); + if (!runAfterSeconds.Value.MoveNext()) + { + Stop(); + } + } + index++; + } + } + catch (Exception ex) + { + Debug.LogException(ex); + } + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta new file mode 100644 index 00000000..224da896 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/EditorCoroutine.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4bfb5aeb6a8516445b2f97249ab88f62 +timeCreated: 1466530674 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs new file mode 100644 index 00000000..846e2ab1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs @@ -0,0 +1,208 @@ +using PlayFab.PfEditor.EditorModels; +using PlayFab.PfEditor.Json; +using System.Collections.Generic; +using System.Reflection; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public class PlayFabEditorDataService : UnityEditor.Editor + { + #region EditorPref data classes + public class PlayFab_SharedSettingsProxy + { + private readonly Dictionary _settingProps = new Dictionary(); + private readonly string[] expectedProps = new[] { "titleid", "developersecretkey", "requesttype", "requestkeepalive", "requesttimeout" }; + + public string TitleId { get { return Get("titleid"); } set { Set("titleid", value); } } + public string DeveloperSecretKey { get { return Get("developersecretkey"); } set { Set("developersecretkey", value); } } + public PlayFabEditorSettings.WebRequestType WebRequestType { get { return Get("requesttype"); } set { Set("requesttype", (int)value); } } + public bool KeepAlive { get { return Get("requestkeepalive"); } set { Set("requestkeepalive", value); } } + public int TimeOut { get { return Get("requesttimeout"); } set { Set("requesttimeout", value); } } + + public PlayFab_SharedSettingsProxy() + { + LoadProps(); + } + + private PropertyInfo LoadProps(string name = null) + { + var playFabSettingsType = PlayFabEditorSDKTools.GetPlayFabSettings(); + if (playFabSettingsType == null) + return null; + + if (string.IsNullOrEmpty(name)) + { + for (var i = 0; i < expectedProps.Length; i++) + LoadProps(expectedProps[i]); + return null; + } + else + { + var eachProperty = playFabSettingsType.GetProperty(name, BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Static); + if (eachProperty != null) + _settingProps[name.ToLowerInvariant()] = eachProperty; + return eachProperty; + } + } + + private T Get(string name) + { + PropertyInfo propInfo; + var success = _settingProps.TryGetValue(name.ToLowerInvariant(), out propInfo); + T output = !success ? default(T) : (T)propInfo.GetValue(null, null); + return output; + } + + private void Set(string name, T value) + { + PropertyInfo propInfo; + if (!_settingProps.TryGetValue(name.ToLowerInvariant(), out propInfo)) + propInfo = LoadProps(name); + if (propInfo != null) + propInfo.SetValue(null, value, null); + else + Debug.LogWarning("Could not save " + name + " because PlayFabSettings could not be found."); + } + } + #endregion EditorPref data classes + + public static PlayFab_SharedSettingsProxy SharedSettings = new PlayFab_SharedSettingsProxy(); + + private static string KeyPrefix + { + get + { + var dataPath = Application.dataPath; + var lastIndex = dataPath.LastIndexOf('/'); + var secondToLastIndex = dataPath.LastIndexOf('/', lastIndex - 1); + return dataPath.Substring(secondToLastIndex, lastIndex - secondToLastIndex); + } + } + + public static bool IsDataLoaded = false; + + public static Title ActiveTitle + { + get + { + if (PlayFabEditorPrefsSO.Instance.StudioList != null && PlayFabEditorPrefsSO.Instance.StudioList.Count > 0) + { + if (string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.SelectedStudio) || PlayFabEditorPrefsSO.Instance.SelectedStudio == PlayFabEditorHelper.STUDIO_OVERRIDE) + return new Title { Id = SharedSettings.TitleId, SecretKey = SharedSettings.DeveloperSecretKey, GameManagerUrl = PlayFabEditorHelper.GAMEMANAGER_URL }; + + if (string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.SelectedStudio) || string.IsNullOrEmpty(SharedSettings.TitleId)) + return null; + + int studioIndex; int titleIndex; + if (DoesTitleExistInStudios(SharedSettings.TitleId, out studioIndex, out titleIndex)) + return PlayFabEditorPrefsSO.Instance.StudioList[studioIndex].Titles[titleIndex]; + } + return null; + } + } + + public static void SaveEnvDetails(bool updateToScriptableObj = true) + { + UpdateScriptableObject(); + } + + private static TResult LoadFromEditorPrefs(string key) where TResult : class, new() + { + if (!EditorPrefs.HasKey(KeyPrefix + key)) + return new TResult(); + + var serialized = EditorPrefs.GetString(KeyPrefix + key); + var result = JsonWrapper.DeserializeObject(serialized); + if (result != null) + return JsonWrapper.DeserializeObject(serialized); + return new TResult(); + } + + private static void UpdateScriptableObject() + { + var playfabSettingsType = PlayFabEditorSDKTools.GetPlayFabSettings(); + if (playfabSettingsType == null || !PlayFabEditorSDKTools.IsInstalled || !PlayFabEditorSDKTools.isSdkSupported) + return; + + var props = playfabSettingsType.GetProperties(); + foreach (var property in props) + { + switch (property.Name.ToLowerInvariant()) + { + case "productionenvironmenturl": + property.SetValue(null, PlayFabEditorHelper.TITLE_ENDPOINT, null); break; + } + } + + var getSoMethod = playfabSettingsType.GetMethod("GetSharedSettingsObjectPrivate", BindingFlags.NonPublic | BindingFlags.Static); + if (getSoMethod != null) + { + var so = getSoMethod.Invoke(null, new object[0]) as ScriptableObject; + if (so != null) + EditorUtility.SetDirty(so); + } + PlayFabEditorPrefsSO.Save(); + AssetDatabase.SaveAssets(); + } + + public static bool DoesTitleExistInStudios(string searchFor) //out Studio studio + { + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + return false; + searchFor = searchFor.ToLower(); + foreach (var studio in PlayFabEditorPrefsSO.Instance.StudioList) + if (studio.Titles != null) + foreach (var title in studio.Titles) + if (title.Id.ToLower() == searchFor) + return true; + return false; + } + + private static bool DoesTitleExistInStudios(string searchFor, out int studioIndex, out int titleIndex) //out Studio studio + { + studioIndex = 0; // corresponds to our _OVERRIDE_ + titleIndex = -1; + + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + return false; + + for (var studioIdx = 0; studioIdx < PlayFabEditorPrefsSO.Instance.StudioList.Count; studioIdx++) + { + for (var titleIdx = 0; titleIdx < PlayFabEditorPrefsSO.Instance.StudioList[studioIdx].Titles.Length; titleIdx++) + { + if (PlayFabEditorPrefsSO.Instance.StudioList[studioIdx].Titles[titleIdx].Id.ToLower() == searchFor.ToLower()) + { + studioIndex = studioIdx; + titleIndex = titleIdx; + return true; + } + } + } + + return false; + } + + public static void RefreshStudiosList(bool onlyIfNull = false) + { + if (string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.DevAccountToken)) + return; // Can't load studios when not logged in + if (onlyIfNull && PlayFabEditorPrefsSO.Instance.StudioList != null) + return; // Don't spam load this, only load it the first time + + if (PlayFabEditorPrefsSO.Instance.StudioList != null) + PlayFabEditorPrefsSO.Instance.StudioList.Clear(); + PlayFabEditorApi.GetStudios(new GetStudiosRequest(), (getStudioResult) => + { + if (PlayFabEditorPrefsSO.Instance.StudioList == null) + PlayFabEditorPrefsSO.Instance.StudioList = new List(); + foreach (var eachStudio in getStudioResult.Studios) + PlayFabEditorPrefsSO.Instance.StudioList.Add(eachStudio); + PlayFabEditorPrefsSO.Instance.StudioList.Add(Studio.OVERRIDE); + PlayFabEditorPrefsSO.Save(); + }, PlayFabEditorHelper.SharedErrorCallback); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta new file mode 100644 index 00000000..e237b3e2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorDataService.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c4c398f1711644e79aae821d377e572e +timeCreated: 1470851203 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs new file mode 100644 index 00000000..e4fb37ba --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs @@ -0,0 +1,228 @@ +using UnityEditor; +using UnityEngine; +using System; +using System.Collections.Generic; +using System.IO; +using PlayFab.PfEditor.Json; + +namespace PlayFab.PfEditor +{ + [InitializeOnLoad] + public static partial class PlayFabEditorHelper + { + #region EDITOR_STRINGS + public static string EDEX_NAME = "PlayFab_EditorExtensions"; + public static string EDEX_ROOT = Application.dataPath + "/PlayFabEditorExtensions/Editor"; + public static string DEV_API_ENDPOINT = "https://editor.playfabapi.com"; + public static string TITLE_ENDPOINT = ".playfabapi.com"; + public static string GAMEMANAGER_URL = "https://developer.playfab.com"; + public static string PLAYFAB_SETTINGS_TYPENAME = "PlayFabSettings"; + public static string PLAYFAB_EDEX_MAINFILE = "PlayFabEditor.cs"; + public static string SDK_DOWNLOAD_PATH = "/Resources/PlayFabUnitySdk.unitypackage"; + public static string EDEX_UPGRADE_PATH = "/Resources/PlayFabUnityEditorExtensions.unitypackage"; + public static string EDEX_PACKAGES_PATH = "/Resources/MostRecentPackage.unitypackage"; + + public static string AAD_SIGNIN_URL = "https://login.microsoftonline.com/"; + public static string ED_EX_AAD_SIGNIN_CLIENTID ="2d99511e-13ec-4b59-99c0-9ae8754f84aa"; + public static string ED_EX_AAD_SCOPE = "448adbda-b8d8-4f33-a1b0-ac58cf44d4c1"; + public static string ED_EX_AAD_SCOPES = ED_EX_AAD_SCOPE + "/plugin"; + public static string ED_EX_AAD_SIGNNIN_TENANT = "common"; + + public static string CLOUDSCRIPT_FILENAME = ".CloudScript.js"; //prefixed with a '.' to exclude this code from Unity's compiler + public static string CLOUDSCRIPT_PATH = EDEX_ROOT + "/Resources/" + CLOUDSCRIPT_FILENAME; + + public static string ADMIN_API = "ENABLE_PLAYFABADMIN_API"; + public static string CLIENT_API = "DISABLE_PLAYFABCLIENT_API"; + public static string ENTITY_API = "DISABLE_PLAYFABENTITY_API"; + public static string SERVER_API = "ENABLE_PLAYFABSERVER_API"; + public static string DEBUG_REQUEST_TIMING = "PLAYFAB_REQUEST_TIMING"; + public static string ENABLE_PLAYFABPLAYSTREAM_API = "ENABLE_PLAYFABPLAYSTREAM_API"; + public static string ENABLE_BETA_FETURES = "ENABLE_PLAYFAB_BETA"; + public static string ENABLE_PLAYFABPUBSUB_API = "ENABLE_PLAYFABPUBSUB_API"; + public static Dictionary FLAG_LABELS = new Dictionary { + { ADMIN_API, new PfDefineFlag { Flag = ADMIN_API, Label = "ENABLE ADMIN API", Category = PfDefineFlag.FlagCategory.Api, isInverted = false, isSafe = true } }, + { CLIENT_API, new PfDefineFlag { Flag = CLIENT_API, Label = "ENABLE CLIENT API", Category = PfDefineFlag.FlagCategory.Api, isInverted = true, isSafe = true } }, + { ENTITY_API, new PfDefineFlag { Flag = ENTITY_API, Label = "ENABLE ENTITY API", Category = PfDefineFlag.FlagCategory.Api, isInverted = true, isSafe = true } }, + { SERVER_API, new PfDefineFlag { Flag = SERVER_API, Label = "ENABLE SERVER API", Category = PfDefineFlag.FlagCategory.Api, isInverted = false, isSafe = true } }, + + { DEBUG_REQUEST_TIMING, new PfDefineFlag { Flag = DEBUG_REQUEST_TIMING, Label = "ENABLE REQUEST TIMES", Category = PfDefineFlag.FlagCategory.Feature, isInverted = false, isSafe = true } }, + { ENABLE_BETA_FETURES, new PfDefineFlag { Flag = ENABLE_BETA_FETURES, Label = "ENABLE UNSTABLE FEATURES", Category = PfDefineFlag.FlagCategory.Feature, isInverted = false, isSafe = true } }, + { ENABLE_PLAYFABPUBSUB_API, new PfDefineFlag { Flag = ENABLE_PLAYFABPUBSUB_API, Label = "ENABLE PubSub", Category = PfDefineFlag.FlagCategory.Feature, isInverted = false, isSafe = false } }, + }; + + public static string DEFAULT_SDK_LOCATION = "Assets/PlayFabSdk"; + public static string STUDIO_OVERRIDE = "_OVERRIDE_"; + + public static string MSG_SPIN_BLOCK = "{\"useSpinner\":true, \"blockUi\":true }"; + #endregion + + private static GUISkin _uiStyle; + public static GUISkin uiStyle + { + get + { + if (_uiStyle != null) + return _uiStyle; + _uiStyle = GetUiStyle(); + return _uiStyle; + } + } + + static PlayFabEditorHelper() + { + // scan for changes to the editor folder / structure. + if (uiStyle == null) + { + string[] rootFiles = new string[0]; + bool relocatedEdEx = false; + _uiStyle = null; + + try + { + if (!string.IsNullOrEmpty(PlayFabEditorPrefsSO.Instance.EdExPath)) + EDEX_ROOT = PlayFabEditorPrefsSO.Instance.EdExPath; + rootFiles = Directory.GetDirectories(EDEX_ROOT); + } + catch + { + + if (rootFiles.Length == 0) + { + // this probably means the editor folder was moved. + // see if we can locate the moved root and reload the assets + + var movedRootFiles = Directory.GetFiles(Application.dataPath, PLAYFAB_EDEX_MAINFILE, SearchOption.AllDirectories); + if (movedRootFiles.Length > 0) + { + relocatedEdEx = true; + EDEX_ROOT = movedRootFiles[0].Substring(0, movedRootFiles[0].LastIndexOf(PLAYFAB_EDEX_MAINFILE) - 1); + PlayFabEditorPrefsSO.Instance.EdExPath = EDEX_ROOT; + PlayFabEditorDataService.SaveEnvDetails(); + } + } + } + finally + { + if (relocatedEdEx && rootFiles.Length == 0) + { + Debug.Log("Found new EdEx root: " + EDEX_ROOT); + } + else if (rootFiles.Length == 0) + { + Debug.Log("Could not relocate the PlayFab Editor Extension"); + EDEX_ROOT = string.Empty; + } + } + } + } + + private static GUISkin GetUiStyle() + { + var searchRootAssetFolder = Application.dataPath; + var pfGuiPaths = Directory.GetFiles(searchRootAssetFolder, "PlayFabStyles.guiskin", SearchOption.AllDirectories); + foreach (var eachPath in pfGuiPaths) + { + var loadPath = eachPath.Substring(eachPath.LastIndexOf("Assets")); + return (GUISkin)AssetDatabase.LoadAssetAtPath(loadPath, typeof(GUISkin)); + } + return null; + } + + public static void SharedErrorCallback(EditorModels.PlayFabError error) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, error.GenerateErrorReport()); + } + + public static void SharedErrorCallback(string error) + { + PlayFabEditor.RaiseStateUpdate(PlayFabEditor.EdExStates.OnError, "SharedErrorCallback" + error); + } + + public static EditorModels.PlayFabError GeneratePlayFabError(string json, object customData = null) + { + JsonObject errorDict = null; + Dictionary> errorDetails = null; + try + { + //deserialize the error + errorDict = JsonWrapper.DeserializeObject(json, PlayFabEditorUtil.ApiSerializerStrategy); + + + if (errorDict.ContainsKey("errorDetails")) + { + var ed = JsonWrapper.DeserializeObject>>(errorDict["errorDetails"].ToString()); + errorDetails = ed; + } + } + catch (Exception e) + { + return new EditorModels.PlayFabError() + { + ErrorMessage = e.Message + }; + } + + //create new error object + return new EditorModels.PlayFabError + { + HttpCode = errorDict.ContainsKey("code") ? Convert.ToInt32(errorDict["code"]) : 400, + HttpStatus = errorDict.ContainsKey("status") + ? (string)errorDict["status"] + : "BadRequest", + Error = errorDict.ContainsKey("errorCode") + ? (EditorModels.PlayFabErrorCode)Convert.ToInt32(errorDict["errorCode"]) + : EditorModels.PlayFabErrorCode.ServiceUnavailable, + ErrorMessage = errorDict.ContainsKey("errorMessage") + ? (string)errorDict["errorMessage"] + : string.Empty, + ErrorDetails = errorDetails, + CustomData = customData ?? new object() + }; + } + + #region unused, but could be useful + + /// + /// Tool to create a color background texture + /// + /// + /// + /// + /// Texture2D + public static Texture2D MakeTex(int width, int height, Color col) + { + var pix = new Color[width * height]; + + for (var i = 0; i < pix.Length; i++) + pix[i] = col; + + var result = new Texture2D(width, height); + result.SetPixels(pix); + result.Apply(); + + return result; + } + + public static Vector3 GetColorVector(int colorValue) + { + return new Vector3((colorValue / 255f), (colorValue / 255f), (colorValue / 255f)); + } + #endregion + } + + public class PfDefineFlag + { + public enum FlagCategory + { + Api, + Feature, + Other, + } + + public string Flag; // Also doubles as the dictionary key + public string Label; + public FlagCategory Category; + public bool isInverted; + public bool isSafe; + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta new file mode 100644 index 00000000..98bf0b40 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b7a0580bf951d2f46861fe4785bf74f6 +timeCreated: 1465794484 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs new file mode 100644 index 00000000..8a5cb713 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs @@ -0,0 +1,79 @@ +using PlayFab.PfEditor.EditorModels; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; +using System; +using System.IO; + +namespace PlayFab.PfEditor +{ +#if UNITY_5_3_OR_NEWER + [CreateAssetMenu(fileName = "PlayFabEditorPrefsSO", menuName = "PlayFab/Make Prefs SO", order = 1)] +#endif + public class PlayFabEditorPrefsSO : ScriptableObject + { + private static PlayFabEditorPrefsSO _instance; + public static PlayFabEditorPrefsSO Instance + { + get + { + if (_instance != null) + return _instance; + + var settingsList = Resources.LoadAll("PlayFabEditorPrefsSO"); + if (settingsList.Length == 1) + _instance = settingsList[0]; + if (_instance != null) + return _instance; + + _instance = CreateInstance(); + if (!Directory.Exists(Path.Combine(Application.dataPath, "PlayFabEditorExtensions/Editor/Resources"))) + Directory.CreateDirectory(Path.Combine(Application.dataPath, "PlayFabEditorExtensions/Editor/Resources")); + + // TODO: we know the location of this file will be under PlayFabEditorExtensions/Editor/ + // just need to pull that files path, and append /Resrouces/ and boom you have the below path. + // consider moving this above the if directory exists so we can do the same logic beforehand. + Directory.GetFiles(Application.dataPath, "PlayFabEditor.cs"); + + AssetDatabase.CreateAsset(_instance, "Assets/PlayFabEditorExtensions/Editor/Resources/PlayFabEditorPrefsSO.asset"); + AssetDatabase.SaveAssets(); + Debug.LogWarning("Created missing PlayFabEditorPrefsSO file"); + return _instance; + } + } + + public static void Save() + { + EditorUtility.SetDirty(_instance); + AssetDatabase.SaveAssets(); + } + + public string DevAccountEmail; + public string DevAccountToken; + + public string AadAuthorization; + + public List StudioList = null; // Null means not fetched, empty is a possible return result from GetStudios + public string SelectedStudio; + + public readonly Dictionary TitleDataCache = new Dictionary(); + public readonly Dictionary InternalTitleDataCache = new Dictionary(); + + public string SdkPath; + public string EdExPath; + public string LocalCloudScriptPath; + + private string _latestSdkVersion; + private string _latestEdExVersion; + private DateTime _lastSdkVersionCheck; + private DateTime _lastEdExVersionCheck; + public bool PanelIsShown; + public string EdSet_latestSdkVersion { get { return _latestSdkVersion; } set { _latestSdkVersion = value; _lastSdkVersionCheck = DateTime.UtcNow; } } + public string EdSet_latestEdExVersion { get { return _latestEdExVersion; } set { _latestEdExVersion = value; _lastEdExVersionCheck = DateTime.UtcNow; } } + public DateTime EdSet_lastSdkVersionCheck { get { return _lastSdkVersionCheck; } } + public DateTime EdSet_lastEdExVersionCheck { get { return _lastEdExVersionCheck; } } + + public int curMainMenuIdx; + public int curSubMenuIdx; + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta new file mode 100644 index 00000000..63be678d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorPrefsSO.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5d0199c11aa6f514784c5c69cd8378d8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs new file mode 100644 index 00000000..90e41d5c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs @@ -0,0 +1,118 @@ +using PlayFab.PfEditor.Json; +using System; +using System.Globalization; + +namespace PlayFab.PfEditor +{ + internal static class PlayFabEditorUtil + { + public static readonly string[] _defaultDateTimeFormats = new string[]{ // All parseable ISO 8601 formats for DateTime.[Try]ParseExact - Lets us deserialize any legacy timestamps in one of these formats + // These are the standard format with ISO 8601 UTC markers (T/Z) + "yyyy-MM-ddTHH:mm:ss.FFFFFFZ", + "yyyy-MM-ddTHH:mm:ss.FFFFZ", + "yyyy-MM-ddTHH:mm:ss.FFFZ", // DEFAULT_UTC_OUTPUT_INDEX + "yyyy-MM-ddTHH:mm:ss.FFZ", + "yyyy-MM-ddTHH:mm:ssZ", + + // These are the standard format without ISO 8601 UTC markers (T/Z) + "yyyy-MM-dd HH:mm:ss.FFFFFF", + "yyyy-MM-dd HH:mm:ss.FFFF", + "yyyy-MM-dd HH:mm:ss.FFF", + "yyyy-MM-dd HH:mm:ss.FF", // DEFAULT_LOCAL_OUTPUT_INDEX + "yyyy-MM-dd HH:mm:ss", + + // These are the result of an input bug, which we now have to support as long as the db has entries formatted like this + "yyyy-MM-dd HH:mm.ss.FFFF", + "yyyy-MM-dd HH:mm.ss.FFF", + "yyyy-MM-dd HH:mm.ss.FF", + "yyyy-MM-dd HH:mm.ss", + }; + + public const int DEFAULT_UTC_OUTPUT_INDEX = 2; // The default format everybody should use + public const int DEFAULT_LOCAL_OUTPUT_INDEX = 8; // The default format if you want to use local time (This doesn't have universal support in all PlayFab code) + private static DateTimeStyles _dateTimeStyles = DateTimeStyles.RoundtripKind; + + public static string timeStamp + { + get { return DateTime.Now.ToString(_defaultDateTimeFormats[DEFAULT_LOCAL_OUTPUT_INDEX]); } + } + + + public static string utcTimeStamp + { + get { return DateTime.UtcNow.ToString(_defaultDateTimeFormats[DEFAULT_UTC_OUTPUT_INDEX]); } + } + + public static string Format(string text, params object[] args) + { + return args.Length > 0 ? string.Format(text, args) : text; + } + + public static MyJsonSerializerStrategy ApiSerializerStrategy = new MyJsonSerializerStrategy(); + public class MyJsonSerializerStrategy : PocoJsonSerializerStrategy + { + /// + /// Convert the json value into the destination field/property + /// + public override object DeserializeObject(object value, Type type) + { + string valueStr = value as string; + if (valueStr == null) // For all of our custom conversions, value is a string + return base.DeserializeObject(value, type); + + Type underType = Nullable.GetUnderlyingType(type); + if (underType != null) + return DeserializeObject(value, underType); +#if NETFX_CORE + else if (type.GetTypeInfo().IsEnum) +#else + else if (type.IsEnum) +#endif + return Enum.Parse(type, (string)value, true); + else if (type == typeof(DateTime)) + { + DateTime output; + bool result = DateTime.TryParseExact(valueStr, _defaultDateTimeFormats, CultureInfo.CurrentCulture, _dateTimeStyles, out output); + if (result) + return output; + } + else if (type == typeof(DateTimeOffset)) + { + DateTimeOffset output; + bool result = DateTimeOffset.TryParseExact(valueStr, _defaultDateTimeFormats, CultureInfo.CurrentCulture, _dateTimeStyles, out output); + if (result) + return output; + } + return base.DeserializeObject(value, type); + } + + /// + /// Set output to a string that represents the input object + /// + protected override bool TrySerializeKnownTypes(object input, out object output) + { +#if NETFX_CORE + if (input.GetType().GetTypeInfo().IsEnum) +#else + if (input.GetType().IsEnum) +#endif + { + output = input.ToString(); + return true; + } + else if (input is DateTime) + { + output = ((DateTime)input).ToString(_defaultDateTimeFormats[DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.CurrentCulture); + return true; + } + else if (input is DateTimeOffset) + { + output = ((DateTimeOffset)input).ToString(_defaultDateTimeFormats[DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.CurrentCulture); + return true; + } + return base.TrySerializeKnownTypes(input, out output); + } + } + + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta new file mode 100644 index 00000000..ee8468a1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorUtils.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b422838f8121dc44ca79ceeea8582a50 +timeCreated: 1466715484 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs new file mode 100644 index 00000000..5c22a8ed --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs @@ -0,0 +1 @@ +namespace PlayFab.PfEditor { public static partial class PlayFabEditorHelper { public static string EDEX_VERSION = "2.166.230512"; } } diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta new file mode 100644 index 00000000..5d858a8f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabEditorVersion.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 24ef2cb033a5dfd4588226fe1447bf5a +timeCreated: 1465794484 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs new file mode 100644 index 00000000..ac7bb218 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs @@ -0,0 +1,149 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public static class PlayFabGuiFieldHelper + { + private static int IndexOf(string[] elements, string element) + { + if (elements == null) + return -1; + for (var i = 0; i < elements.Length; i++) + if (elements[i].Equals(element)) + return i; + return -1; + } + + /// + /// Build a dropdown menu from a list of arbitrary elements. + /// + public static void SuperFancyDropdown(float labelWidth, string label, T activeElement, IList elements, Func getElementKey, Action OnChangeTo, GUIStyle style, params GUILayoutOption[] options) + { + if (elements == null || elements.Count == 0) + return; // Nothing to show + + string[] namesList = new string[elements.Count]; + for (var i = 0; i < elements.Count; i++) + namesList[i] = getElementKey(elements[i]); + + using (new UnityHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear"))) + { + EditorGUILayout.LabelField(label, PlayFabEditorHelper.uiStyle.GetStyle("labelStyle"), GUILayout.Width(labelWidth)); + var prevIndex = IndexOf(namesList, getElementKey(activeElement)); + var newIndex = EditorGUILayout.Popup(prevIndex, namesList, PlayFabEditorHelper.uiStyle.GetStyle("TextField"), GUILayout.MinHeight(25)); + if (newIndex != prevIndex) + OnChangeTo(elements[newIndex]); + } + } + } + + /// + /// A disposable wrapper for enabled/disabled which sets it to one way or another and restores when finished + /// + public class UnityGuiToggler : IDisposable + { + private bool previous; + + public UnityGuiToggler(bool isEnabled = false) + { + previous = GUI.enabled; + GUI.enabled = isEnabled; + } + + public void Dispose() + { + GUI.enabled = previous; + } + } + + /// + /// A disposable wrapper for Verticals, to ensure they're paired properly, and to make the code visually block together within them + /// + public class UnityHorizontal : IDisposable + { + public UnityHorizontal(params GUILayoutOption[] options) + { + EditorGUILayout.BeginHorizontal(options); + } + + public UnityHorizontal(GUIStyle style, params GUILayoutOption[] options) + { + EditorGUILayout.BeginHorizontal(style, options); + } + + public void Dispose() + { + EditorGUILayout.EndHorizontal(); + } + } + + /// + /// A disposable wrapper for Horizontals, to ensure they're paired properly, and to make the code visually block together within them + /// + public class UnityVertical : IDisposable + { + public UnityVertical(params GUILayoutOption[] options) + { + EditorGUILayout.BeginVertical(options); + } + + public UnityVertical(GUIStyle style, params GUILayoutOption[] options) + { + EditorGUILayout.BeginVertical(style, options); + } + + public void Dispose() + { + EditorGUILayout.EndVertical(); + } + } + + //FixedWidthLabel class. Extends IDisposable, so that it can be used with the "using" keyword. + public class FixedWidthLabel : IDisposable + { + private readonly ZeroIndent indentReset; //helper class to reset and restore indentation + public float fieldWidth = 0; + + public FixedWidthLabel(GUIContent label, GUIStyle style) // constructor. + { + //state changes are applied here. + + this.fieldWidth = style.CalcSize(label).x + 9 * EditorGUI.indentLevel; + EditorGUILayout.BeginHorizontal(PlayFabEditorHelper.uiStyle.GetStyle("gpStyleClear")); // create a new horizontal group + EditorGUILayout.LabelField(label, style, GUILayout.Width(fieldWidth)); + // indentation from the left side. It's 9 pixels per indent level + + indentReset = new ZeroIndent(); //helper class to have no indentation after the label + } + + public FixedWidthLabel(string label) + : this(new GUIContent(label), PlayFabEditorHelper.uiStyle.GetStyle("labelStyle")) //alternative constructor, if we don't want to deal with GUIContents + { + } + + public void Dispose() //restore GUI state + { + indentReset.Dispose(); //restore indentation + EditorGUILayout.EndHorizontal(); //finish horizontal group + } + } + + class ZeroIndent : IDisposable //helper class to clear indentation + { + private readonly int originalIndent; //the original indentation value before we change the GUI state + + public ZeroIndent() + { + originalIndent = EditorGUI.indentLevel; //save original indentation + EditorGUI.indentLevel = 0; //clear indentation + } + + public void Dispose() + { + EditorGUI.indentLevel = originalIndent; //restore original indentation + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta new file mode 100644 index 00000000..116dfd45 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/Scripts/Utils/PlayFabGuiFieldHelper.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 286b8f4cdeaad154ea11e3bca31b955f +timeCreated: 1465870728 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI.meta new file mode 100644 index 00000000..c23149c3 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: a3ba3e0b8bdd64d44b530b3ba1d603e0 +folderAsset: yes +timeCreated: 1469033493 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta new file mode 100644 index 00000000..fd362577 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 93b8e49ffe6415343be5de01de7c23c1 +folderAsset: yes +timeCreated: 1465800950 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..70cfe31d521228b780f5d889f2991f6d4d756653 GIT binary patch literal 63922 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

Al(wwodhEs< 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

**Qn<1lJWC9yB067v=^4ul=J_YRh5%l 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ë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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta new file mode 100644 index 00000000..b92f5ae2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon Bold.ttf.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 96e17474f840a01459f0cc936c5d4d9b +timeCreated: 1465800940 +licenseType: Pro +TrueTypeFontImporter: + serializedVersion: 3 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 1 + characterPadding: 0 + includeFontData: 1 + fontNames: [] + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..a5e767b9e85b4169cf3a242d2f786172b912743d GIT binary patch literal 51288 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta new file mode 100644 index 00000000..1316245c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Fonts/Avalon.ttf.meta @@ -0,0 +1,19 @@ +fileFormatVersion: 2 +guid: 436664d726292a54fa79d2168f4541ac +timeCreated: 1465800973 +licenseType: Pro +TrueTypeFontImporter: + serializedVersion: 3 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 1 + characterPadding: 0 + includeFontData: 1 + fontNames: [] + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images.meta new file mode 100644 index 00000000..8af8ba0a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: bcd1f2f077e925c418ed3eac3526988c +folderAsset: yes +timeCreated: 1465796980 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png new file mode 100644 index 0000000000000000000000000000000000000000..2c14419c259eebc1c68924523b2fd6c487c8af40 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lxt!{e2B*fI_04E{-7_*OOBc5`LU-V3{FtfgzER Y!BK>fz55cI4Nw7tr>mdKI;Vst01KlYm;e9( literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta new file mode 100644 index 00000000..7b3929bf --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Black.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 66d3ceb5fa86d498891e23dd5303a8f7 +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png new file mode 100644 index 0000000000000000000000000000000000000000..7dfa3aa6c9462ef89fbf159e6470e45a99517a7e GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lz>!E=`ZKKp`Ga7sn8e>&XcVWPm&u21d36;fsJQ N22WQ%mvv4FO#qi$80P>0 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta new file mode 100644 index 00000000..778b4df7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Clear.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: d03222342209e43daaf2ca8d1364e47a +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 1 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png new file mode 100644 index 0000000000000000000000000000000000000000..b32e7a45a234f8393c9775b757de504f7cfddc06 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lz>;`#BHHfkL95E{-7_*ORYYy7cRO1IrAF3k->j Z42csMTaTrhZ38M`@O1TaS?83{1OPI7AlCo@ literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta new file mode 100644 index 00000000..6e6058fa --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_base.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 9427eaf0703a74a008e9f9353562df39 +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png new file mode 100644 index 0000000000000000000000000000000000000000..3f54b0df2fbf36219fd11c97ee08a3862880e8f4 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4ly(B3H+b5fI_04E{-7_*ORAApZ@=R1IrAF3k->j Z43T_{Da-etoeWgK;OXk;vd$@?2>=YIALjr7 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta new file mode 100644 index 00000000..53e9a3bd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_dk1.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 1c8aa345bd7fe44b88cf00b2f6b82579 +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png new file mode 100644 index 0000000000000000000000000000000000000000..eff3d42d5769e65dbcaff472804ea55199dc54a9 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4ly&n+uUloKp`&Z5SkB-!{sT?@cz{bJN Zz;OErbNmqj-W;F`22WQ%mvv4FO#u5o9%ujn literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta new file mode 100644 index 00000000..7c83a6de --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt1.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 2e064f0948b52496983fa0597fa61a0a +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png new file mode 100644 index 0000000000000000000000000000000000000000..7c99ec6ab3ffb19001cdc9dcefe9cbc9ba84d4d3 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4ly(7ZPyO90fodoT^vI=t|$Nb^73*$o63PB4Qw3T a3=Dr9nD6Q@UKIjV!QkoY=d#Wzp$PzWnjyyk literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta new file mode 100644 index 00000000..c3e378e1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Gray_lt2.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 14a4e823a9ef94dc18a71decc8453380 +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png new file mode 100644 index 0000000000000000000000000000000000000000..a7ea8c5b8a620fed39730ec25dfa628b5ea71e2e GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=*pj^6U4S$Y{B+)352QE?JR*x3 z7`TN&n2}-D90{Nxdx@v7EBga>4lz@ySAP~>1`3IKx;Tb#Tu=TpfAxp?jGP9B3m6YE YF|6Qbnp`Zz4YG^D)78&qol`;+06Y30y8r+H literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta new file mode 100644 index 00000000..211ad892 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Orange.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 83fd25cf40b81429ca784df9d37d32ba +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/Square.png new file mode 100644 index 0000000000000000000000000000000000000000..8eb1b1ecc13b6e1d2375151866134cd7a040340c GIT binary patch literal 78 zcmeAS@N?(olHy`uVBq!ia0vp^EFjFm1|(O0oL2{=L_J*`LpWrU|M0W$cr!i aF)*;jval%k4lxtM_~^__Kp`&buq|NmdlrgGp&0~-f7 Z(7;$0mig(aYk?{lJYD@<);T3K0RTMiAK(B0 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta new file mode 100644 index 00000000..f10c123f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/White.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 5f32aedbadeff4790a54248a66f0b89d +timeCreated: 1468018889 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 0 + mipBias: -1 + wrapMode: 0 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 0.001 + alphaIsTransparency: 0 + textureType: 0 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/azure-playfab-logo.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/azure-playfab-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..2d54a307c47dc481dea07663f4cf3f230670bafd GIT binary patch literal 23349 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 H4<7qp3Od%X literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/azure-playfab-logo.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/azure-playfab-logo.png.meta new file mode 100644 index 00000000..9e98c891 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/azure-playfab-logo.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: 3e5835cf7489c55418093b623008b4ed +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png new file mode 100644 index 0000000000000000000000000000000000000000..de1c72b6fb124cdb2519c08f31599bf5ee57e262 GIT binary patch literal 2763 zcmbVOX;f3!7QP7q87v?&J8%h7nUfGQ5CZ`c0uh3dK~S*}$VFnv&?Jz65F3Bdq2ARJZ&gT; z%LzcnKC%}iKY*5b65J*V!0OUJel5VbF zMj^p>5GgMJ`DaoIOcqELiXjl^gZ55EYEG{@S6pg|7hxnn11gtNOh@s-qbi$Ix-*NrvG;A=< z-!BADr(rOm=wKo(ghnUgXudcdAB$b$G6WJSTaXGZ#pUYazUN~9kxQbAA+}T~jui?s zmO6lyE|dx-=|T}mjlqHOTmeTYljslU&%M$hF*gh1(8WSN_^!Gn?%zbm(}`GuE>|2q z1gqb5Fg}DDLdAt*upxd}ItGt?&*l6-6+`KgLFrrLe_CZ}N!Ne+>0gbnbN;$IkU)1| z#JY>|S+#Q~02s|PXu+}ap~)Tm!kRGalX)wlt(thnj)A*w&PS{^y1%JR&v0{XbKJ3o z$Hh5*^~o>0jueJBT77;|deO0oeuj6pvEA`ytye^X_ehIZ#OsCjLTKxy3C;vx&^9|Z zU)7AAA+N4}{O#bw@G8-f(meX9m5ZXfP^F!8$fMp{1}W7u14q<&>^VvtDBDw}k$1bq%v z%+s>!z|D%Y5pYY;>mhPOqWHp>p}P6%#C6Bd5uw-*VaAq5U-So_Yg*-T2tZ7gxp0yk zt;!l109+eC7s1)&FxL^i4uEmo6g-_7cT;%kJ$J>J-g8&f>pc%es^0TZxad94g(01p zOs$3bl1dSvGB0;DXgc1x3t^n>)Vv{f4q~7e)8*AwBx8cQ%ZwxY-P#fWn(=0A z)sQ8)rcY(p%r*^=n3j#LR?p5kfkC7a%Ch@59}O(R;0^U!hdt#?*`kFWIlOLn=*uk* z1;Bpy1-zQk^7CW6Af?u3(Oi9&v*&fr3cbFHs)DtMecw$J{tKuVJh z?NXguRx(V|x*fyzJmypYVK>fe?~D(tzYN0r~zu!Vj&!;UZwuhzLDtngKT zVE(8q|LB&vmq;N#7*LSTTg!*9@0$I|(@nAaiTxr%o$~{we>rh6W&doF%Wj8~VMlqT zu<@1?$Gip=%8ZDcvx_a7F~Anz8N{5=I?Hin&0U-FRwq_cZmr%x38M}+*R$p>e)G9z zojk+pYT=AzYWno0SmN7ft{w|a??2iSEw47rNFr?yfOXo%vSQBlxH3f92k-|X#X(s> zaj}&R1vNDlGPv!L#Q=GOY6JOq=Z*%C1&e-LW-iNCIU@L{S*>@87c<)8L~HMouTxc2mX z{4$qOQd^^lcDQWu^>SF7VdnP@wx5JvC@5=u+WrJFc;+UG13zc{qCpKGIaNBNWsa$; z^X?-OSpP=5k#h?s^Vq5h-o3ciR|SBqC^JE2Q1zz$-eA$Z?Qd@#l9Em~UB6e)WUnE# zuP1Z*_Jmc93V;1>Si=D5Co|GbT!QOM5qGWk3|HqlA&m1s#dY^kirf`zGyN~V=oH~! zV4Rqq+4gone{^1*WPZxIQ)BS(Cufu7WmKLfZ)MQ)@^Lfm0MYc`WO0zP?vti)*5x#c zH9UiNs>Nvdo{{JL%7N~qKF1OLR2y>(!bs0RKTksl$w)lZUCvz7Ea>{IlGUC@@q?p@ z)Tf++5YCsetxiaoed#uPc;D57wPu}%pqoAZiq7T3=7tt;uvU)So+|fA23YKr22p$C z&1JBx3u_bhHov7aQz~}F4H^&K^%8bZY$DsAuKYUlFzIxm;kTDZOm@0PeVRFFl3V8$ zd(IS5IySft|FD;F>IAAP>cN|9JWb;Yuq-U%bSQ_ zSc^YuZ4Oe3H$^UYA5RGLTYvxBw1+ygD{s6bje>`x@3>uY=d9Jl$2EvTfhPCyUuFX@ zcli5la&9(zzDkID`;AplQ-y3OyYPPXe3i-7Cvn~7E8U{cHuPC4SL`yq^4004qZ<){ zLW_x8BSp$Tkj?5nbyoSWUW`q|65Yqwm9krbAO9Lj!cos#BS@YmSh?WV%8bak9cYZU@7R1;=0KU8A#GYYVRP_;XJOvTm}RbQ zZ%^jr7K0mdBL`>54^@n;W8M0B$yE} XwOg*3#dr7Ue=ixKQMB_R$@%{Qf~;TM literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta new file mode 100644 index 00000000..2d3ffec4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: 1f806a850e4ff264eafc4935f65793b8 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png new file mode 100644 index 0000000000000000000000000000000000000000..55b2bf9f60965001f362ff4bea5fbb4775de7cf4 GIT binary patch literal 51228 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta new file mode 100644 index 00000000..330eb127 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_off.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: d20c53c8cad21024091aeed0b9bf2a0e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png new file mode 100644 index 0000000000000000000000000000000000000000..a53beb629d205ca3103c6687a94ab9e743e1d7f9 GIT binary patch literal 55178 zcmc%Qb#PnFwkUWrGc#k%3^B#bc5KJY?3kG?Gc(1^j+r^;m{DeqnVH$r%XjWMck0$u z&CIL!$L!MXEooKP>b(Um^{-Zxs@@hN-tova?z^e7(+o2EqvExEGeROu{DbDBDhNWu@Mou9uiztdx4{M3qoz% z5!EuVMZv%;Xa_qNcLrTqU@*jjxk1ahr;==`tHBPh=?5>4ek%8BqM?2T?H^1v%}WNK z3vM7;Ml}L|zq+nMcP(`{NVgZ7*nsY&b*K7a;|SDBA%vsAnvM&bD__=)L`hjxGr(zI zwU7(GUG;&3;P{|Y?|P&4Qat4|!1iUN5Z%{se^bJMT!+TaY_5{vHg<6K!H5(*&|Tg5 z-7Vr!Al+voGgkJxViIE@kBBM^AQ$v4A?rJ}Y;7VW7ElnLc^I(wfUre)`lQy!+uUe- zCRMQb-lpvMn{>E0U0+qN&)Y}O?czPZot^BZ|PqTgRE{sS++^gG^o1cu`5rTP9Y$27O z#4z6rKoNDXabDZOZMw1C@!-TzX6!Pysr}w*hH#}Os0D&kiYv%73aC^6jwS;{B^!9104LcyRYkd~*3Qweslf z%zhB*?G{-?b$UM_o~I<%)0OUsvD(9KZ4o^kY8ZyHPVNXC)K+Y&8#>eJ4=Eba?U-|v znLG1Ul*YO7W9waT?$uo^uwndLvNe2z5tk^53f2o)I;`56t@5PoZH#fq1B*<5Gl7#X z4ZIO7&n{fz+#4O_JNhuHIwuX$X(Sv|%?-M12;v9|gIb@8Uvk3rR#}V>%woc7zV8ab#|iAZ zf3=+uk7Phfj_#=QpeAGXaN0H<5($OyllpOQg|irYwiN-HeP_4P8~3tZ>d7ej4RBSy zOI9ZHt)tY-mQ6xY5^3B2k%RqSehw^MKMo68vVrRsJP3IPyvF~C?N~- zQ&Y`G35?y2ugZbhY#OqG&F|`FN5@oOsAt!^i$aSTg2#Kqo{z7dUpN#1Jn5~ zg(1wHA`@5Om-e=C%DsZ1&K1X+`r}s`F-`E;SDQGd@)j6QaSW#x$M1JJtKe+7#QK8f z0_zpb&wV^^c%LuowB|uK!zEKjeF-`<+n)xipY3;6R64wMp;FH4EZPaQhv z(@Pf2&46GM1wa2Ty!6KjcsK%#TRRk>e zUMPCl#CBRrz)aUqEp`8VtG}%+_w>{~5WnSqjDd`M>y3<9#(NCwLC|f+Z~G#)S)G5U zCs})2ap~91anL{W+28&DXk#qlDujR#FtE4PQ2#rX`RjPD4>z(Zdywcg3ej2}2<70{ zxC0HI7*{h8k`t&H<<|;n9Fkr3yS#!ZFwZ2(TA7({mUaQX-xmK65XB{h?8Dqd6AjK- z`+fUx|K`r)^sat%_;_IL=X}O$7$48(5GMs#h{GucN(h?RAS&)? zsD75K{zeytc!D`D-h|6bA1+~H+lIqS7bS1WROlV{lG7k|q>CgE>N_gF$90@3M9(&a zN6S-z{uQLODvRo`3cIJgAcw*{v&CJ}iO0HV#pAp4JzKZdad8{OHFcl|? z>?V4YiyB&!!QT_YyP+7r7Q}R}A+(D0_vkp(eKWOre*FGcbMWoF&0#elJA4*x43oPB;_Ih(evF zTJwb5f+5mYGsh@IxnGL$Lk~06!o+{SV&RTzcR*Eq6%3tQbZ7<|mB^V7#y!A=RP-CW z5Gt~U$k|8JoA_iwVXs0Sd^?$DDQ1@X&K^pHQYej5NE$yw=2pl=@aOaO6E+pqiyyYw zG5U6~%B0Ph>+#H-H*iO}4beLrlTY-&bWrVr2#c+6@ zbbb%td*&+Nbw?REj15}BDJ0}6wID3=vZ?OPdf79xP*||Tm8c)sL(i4>LM%3gktw^r z>V8y?(w*2VZ_yfb_KeigiIv=Xr@vo87Gerd{9}wjs4mwaIiq4l;H~37?-^4dX}}kp zGN8oPJ<-k${GKAf2yU1J3G_fPaaj!5xOLrI084BJ7XpCdc{ zK@A0J0<-}1nk_BNjZs|K6zyO)R%0#3cBU#^oYV~>J6CB zaG=DPSWP0MXHE_WqRz8H<{CFpJ`A3{GdA(tDK6exPqr~x=MW%zCD0IPRXRy0$4Lhkt4 zlvOflUo(&fjWB=AD+ZkqJ1gq0d28HQHb65k3$ICgL05h)3PD+GIwq8&f&y!Q!AgIMq@`<^L-dizv=JDKW+;Rfpb-c{dq_0B7JbF(;L8 zL&safawd&aAc$Fv$oQUsnzNImKT^Iebh5B$I;T_fJX(U5>LLW9$W1C`Pc5%9p=coO zv@c9V9@f^<-UpAALR?+iO|O_IVdn*P_$JlWNgF)n7YwT=&6&@ozLY4p~oqtM>2yav9MPmO*XP%JGKY!5IZQ%X=90F zhhXc+zZ)`TO>=(dJm;$swd=fX

dAtBDXWW`;5YjNL9-5#wzOvJ3A%;5e^nE~hCW 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 >Djgq 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 bfn$6w$HaSdvSGm59|TgARe^qxHuU^AhTZ+a literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta new file mode 100644 index 00000000..e4081324 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/checkmark_on.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: a2f13c216f2649d49b892cade7f4e5f0 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..6cbb6c2a1c2e0a748b309b8b9ea7f2af0817f0bc GIT binary patch literal 49180 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta new file mode 100644 index 00000000..04c097ba --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIcon.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: 4f1db872b2efa324c806fcbb54e19e1c +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png new file mode 100644 index 0000000000000000000000000000000000000000..070261ff39f4cb2542460509ab2ce783f0f45eb5 GIT binary patch literal 49499 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 b^)g}n-`SSIG4+*8J9zAOJ7IFHj)ngRKSCF- literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta new file mode 100644 index 00000000..0bdda381 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dashboardIconHover.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: b43817ee9dda16c41a628a705526a021 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png new file mode 100644 index 0000000000000000000000000000000000000000..0722053691a64f96c24746b5438e57a3694beae4 GIT binary patch literal 514 zcmV+d0{#7oP)P000>X1^@s6#OZ}&00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0PH22MZr!t+@aI03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00Cx6L_t(Y$L-a@Y7ok73|uVIQxLl(MRwh-1G%X1H~pq=uWv%C@BNF6E_w@+f6|zMnt=jMAF2~ zv52H3V^VO@4+iF*`u|Y6YH2PD;EP?mWV+EkFkYkxJknznqUpD zv5ij+^zkksPnR^wS!VWOwM6{H2@Y_*1i*D>on*FEC=p-L#xX_<07jY7&P=zE)CFFm zw*aJ<85e&RZy_b(23@@ReU>%V&)#lknKp?M@jcJ;7{eNXVfGwkhC3k%I>$avYd}u1 zpS@;6Qr!ey%>lSdZ}%?4R7i>VfkPb4IJRMW4zov{NtB37wD1w*DVA~WwbH9LB=r`1 z`25$sHp$vvdi*n_M2yhEo4oKQ`3$nwNsmP)Q6j!z2Osi?#`(UJdo$IT^AmlKT|CM4 zZr0|$_vccxsvhBaE?<<0Z};+tYgW}pv#K^8{`L2&Uvf%)yQ%_gE&u=k07*qoM6N<$ Eg7IL~EdT%j literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta new file mode 100644 index 00000000..9dc795e0 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_colored.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: d396473974f984567a8e398f1ebd9ec9 +timeCreated: 1472083701 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/dn_gray.png new file mode 100644 index 0000000000000000000000000000000000000000..a89ecdc1a133b8070b736b896a8d02a02e9fbf08 GIT binary patch literal 506 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 G2>(CT)4wPH literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta new file mode 100644 index 00000000..598213b6 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_O.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: 597788bebb59e4cec8318947e1a3da3e +timeCreated: 1468254721 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 512 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png new file mode 100644 index 0000000000000000000000000000000000000000..e72685fbe8abdd90a58f45df2c50e4b666a313c2 GIT binary patch literal 10717 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 Q!{7j@vX)ZC3+s3P2UbKZWdHyG literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta new file mode 100644 index 00000000..beca62d3 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/pfFullLogo_W.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: b108cf8dccf424419ad69d9354b1d234 +timeCreated: 1468254716 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 512 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png new file mode 100644 index 0000000000000000000000000000000000000000..1e8fa8de5fdb19b6f56c2e854bd5dff4f1e4f774 GIT binary patch literal 75821 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 IHHW+Z3&=RSLI3~& literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta new file mode 100644 index 00000000..d1b78be5 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/playfablogo.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: 77e37f7fe73c7db4d9a1702eb4ad411b +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_colored.png new file mode 100644 index 0000000000000000000000000000000000000000..23034255e4e0ee060ab82781e273bfcdd6f8139c GIT binary patch literal 525 zcmV+o0`mQdP)P000>X1^@s6#OZ}&00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0PH22OONSD1HC{03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00D7HL_t(Y$Gz4+YZXxt zhvDbOfaz4!V6;f3AovGuEKf1DDN+d*wjzkwSc`?7`UONmj0Qm~Z32UCVLC|@LDVLd z7zxovq9n#P000>X1^@s6#OZ}&00006VoOIv00000 z008+zyMF)x010qNS#tmY3ljhU3ljkVnw%H_000McNliru;0PH22myF6SZDwM03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00C)9L_t(Y$Gz6SOIC3d z$MM%=LT(k6WDQORK|iRazaj^RL(t$FL5NFpG_+a&Komrl9LUL*Ky1lPS_;BioFXNv zB`o~Wa)SrC!jqo*ESGz^@ILSRJ?Hzq9Xpbl12~4&i1?)-eJ#(1F^Magd9(u3X)(Eg zY;I@p6dxmEv(jW6n>dXL+{I{S9t@Th*L&Z~)6y$8Q^C9dlU3tBCmWFD8Bk_bY#i{!4xX&BJi$HdggY00000NkvXX Hu0mjfs}I*P literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta new file mode 100644 index 00000000..afec6ead --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/r_gray.png.meta @@ -0,0 +1,59 @@ +fileFormatVersion: 2 +guid: 43f13eb24deac4ae5a86c25189272a74 +timeCreated: 1472083701 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: -1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png new file mode 100644 index 0000000000000000000000000000000000000000..59b2be99a023891bd4244697f79761a7d46e5efa GIT binary patch literal 2860 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta new file mode 100644 index 00000000..43a1aeda --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/red.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: ba384a3c945464600a4046641bb57ca3 +timeCreated: 1470788284 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 64 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png new file mode 100644 index 0000000000000000000000000000000000000000..baf1eb3c6a4934924f0e1aec008dec06f6768849 GIT binary patch literal 2859 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta new file mode 100644 index 00000000..f2af5e33 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/Images/yellow.png.meta @@ -0,0 +1,57 @@ +fileFormatVersion: 2 +guid: a50d8da0637a640dda5e2018b972cade +timeCreated: 1470788288 +licenseType: Pro +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 7 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 64 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + allowsAlphaSplitting: 0 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + outline: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin new file mode 100644 index 00000000..c617784e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin @@ -0,0 +1,3540 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: PlayFabStyles + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 11001, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 83fd25cf40b81429ca784df9d37d32ba, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 2e064f0948b52496983fa0597fa61a0a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 11005, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnHover: + m_Background: {fileID: 11004, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 11002, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: 2800000, guid: d20c53c8cad21024091aeed0b9bf2a0e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.89112896, g: 0.89112896, b: 0.89112896, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d20c53c8cad21024091aeed0b9bf2a0e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d20c53c8cad21024091aeed0b9bf2a0e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: a2f13c216f2649d49b892cade7f4e5f0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8901961, g: 0.8901961, b: 0.8901961, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: a2f13c216f2649d49b892cade7f4e5f0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: a2f13c216f2649d49b892cade7f4e5f0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 15 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 20 + m_FixedHeight: 20 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9, g: 0.9, b: 0.9, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.24264705, g: 0.24264705, b: 0.24264705, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.24264705, g: 0.24264705, b: 0.24264705, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 14a4e823a9ef94dc18a71decc8453380, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.5586207, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 1 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 10 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 8 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 1 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 10 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 8 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: enabledButton + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: textButton + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: textButtonOr + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: textButton_selected + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: pfLogo + m_Normal: + m_Background: {fileID: 2800000, guid: bad3ceedae1d46d4fac0389e8b02d6d3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listDisplay + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 20 + m_Right: 20 + m_Top: 20 + m_Bottom: 20 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listDisplayBox + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 10 + m_Bottom: 10 + m_Padding: + m_Left: 10 + m_Right: 5 + m_Top: 10 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarBg + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 6 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: progressBarFg + m_Normal: + m_Background: {fileID: 2800000, guid: 83fd25cf40b81429ca784df9d37d32ba, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarError + m_Normal: + m_Background: {fileID: 2800000, guid: ba384a3c945464600a4046641bb57ca3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarWarn + m_Normal: + m_Background: {fileID: 2800000, guid: a50d8da0637a640dda5e2018b972cade, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarSuccess + m_Normal: + m_Background: {fileID: 2800000, guid: f30842e29e3a14ecea9b07a2e8f04c55, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 4 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: progressBarClear + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 6 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gmIcon + m_Normal: + m_Background: {fileID: 2800000, guid: 4f1db872b2efa324c806fcbb54e19e1c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 2800000, guid: b43817ee9dda16c41a628a705526a021, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 2800000, guid: b43817ee9dda16c41a628a705526a021, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 25 + m_FixedHeight: 25 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: labelStyle + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: genTxt + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 16 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: editTxt + m_Normal: + m_Background: {fileID: 2800000, guid: 14a4e823a9ef94dc18a71decc8453380, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.24264705, g: 0.24264705, b: 0.24264705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 10 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: listKey + m_Normal: + m_Background: {fileID: 2800000, guid: 14a4e823a9ef94dc18a71decc8453380, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 2e064f0948b52496983fa0597fa61a0a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 5f32aedbadeff4790a54248a66f0b89d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listKey_dirty + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.36764705, g: 0.36764705, b: 0.36764705, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listValue + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 5 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: listValue_dirty + m_Normal: + m_Background: {fileID: 2800000, guid: 9427eaf0703a74a008e9f9353562df39, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: cGenTxt + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 16 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: orTxt + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9921569, g: 0.41960788, b: 0.050980397, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9921569, g: 0.41960788, b: 0.050980397, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: titleLabel + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: orTitle + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 0.427451, b: 0.12941177, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 20 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: versionText + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 436664d726292a54fa79d2168f4541ac, type: 3} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray1 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray2 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray3 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleGray4 + m_Normal: + m_Background: {fileID: 2800000, guid: 1c8aa345bd7fe44b88cf00b2f6b82579, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleClear + m_Normal: + m_Background: {fileID: 2800000, guid: d03222342209e43daaf2ca8d1364e47a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: gpStyleBlur + m_Normal: + m_Background: {fileID: 2800000, guid: 9de03259c3d2e43fc91ef7dc9054b186, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: 96e17474f840a01459f0cc936c5d4d9b, type: 3} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: foldOut_std + m_Normal: + m_Background: {fileID: 2800000, guid: 677a55eab8f234e688ec4c6be70208bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: d396473974f984567a8e398f1ebd9ec9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 677a55eab8f234e688ec4c6be70208bb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: d396473974f984567a8e398f1ebd9ec9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 43f13eb24deac4ae5a86c25189272a74, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 93e56b7e753794953939a50df2c9c323, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 93e56b7e753794953939a50df2c9c323, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} + m_OnFocused: + m_Background: {fileID: 2800000, guid: 93e56b7e753794953939a50df2c9c323, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.09411765, g: 0.7058824, b: 0.7607843, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 15, y: 0} + m_FixedWidth: 10 + m_FixedHeight: 10 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 0, g: 0, b: 0, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 0.58431375, g: 0.6, b: 0.58431375, a: 1} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta new file mode 100644 index 00000000..50ac5747 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabEditorExtensions/Editor/UI/PlayFabStyles.guiskin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: d04ab90b288304956b142858114b4310 +timeCreated: 1468007030 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK.meta new file mode 100644 index 00000000..0f7c1908 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: e53d5e839d5caa945b9b859abe15689b +folderAsset: yes +timeCreated: 1558474635 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin.meta new file mode 100644 index 00000000..a865e687 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: f80b73ed5fc053a409c5e9347d9c609a +folderAsset: yes +timeCreated: 1468524875 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs new file mode 100644 index 00000000..ff56aff2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs @@ -0,0 +1,1558 @@ +#if ENABLE_PLAYFABADMIN_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.AdminModels; +using PlayFab.Internal; + +namespace PlayFab +{ + ///

+ /// APIs for managing title configurations, uploaded Game Server code executables, and user data + /// + public static class PlayFabAdminAPI + { + static PlayFabAdminAPI() {} + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Abort an ongoing task instance. + /// + public static void AbortTaskInstance(AbortTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AbortTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update news item to include localized version + /// + public static void AddLocalizedNews(AddLocalizedNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddLocalizedNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a new news item to the title's news feed + /// + public static void AddNews(AddNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Increments the specified virtual currency by the stated amount + /// + public static void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds one or more virtual currencies to the set defined for the title. Virtual Currencies have a maximum value of + /// 2,147,483,647 when granted to a player. Any value over that will be discarded. + /// + public static void AddVirtualCurrencyTypes(AddVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/AddVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public static void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Checks the global count for the limited edition item. + /// + public static void CheckLimitedEditionItemAvailability(CheckLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CheckLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create an ActionsOnPlayersInSegment task, which iterates through all players in a segment to execute action. + /// + public static void CreateActionsOnPlayersInSegmentTask(CreateActionsOnPlayerSegmentTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateActionsOnPlayersInSegmentTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a CloudScript task, which can run a CloudScript on a schedule. + /// + public static void CreateCloudScriptTask(CreateCloudScriptTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateCloudScriptTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a Insights Scheduled Scaling task, which can scale Insights Performance Units on a schedule + /// + public static void CreateInsightsScheduledScalingTask(CreateInsightsScheduledScalingTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateInsightsScheduledScalingTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers a relationship between a title and an Open ID Connect provider. + /// + public static void CreateOpenIdConnection(CreateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new Player Shared Secret Key. It may take up to 5 minutes for this key to become generally available after + /// this API returns. + /// + public static void CreatePlayerSharedSecret(CreatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a new player statistic configuration to the title, optionally allowing the developer to specify a reset interval + /// and an aggregation method. + /// + public static void CreatePlayerStatisticDefinition(CreatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new player segment by defining the conditions on player properties. Also, create actions to target the player + /// segments for a title. + /// + public static void CreateSegment(CreateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/CreateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a content file from the title. When deleting a file that does not exist, it returns success. + /// + public static void DeleteContent(DeleteContentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteContent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a master player account entirely from all titles and deletes all associated data + /// + public static void DeleteMasterPlayerAccount(DeleteMasterPlayerAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteMasterPlayerAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a player's subscription + /// + public static void DeleteMembershipSubscription(DeleteMembershipSubscriptionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteMembershipSubscription", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a relationship between a title and an OpenID Connect provider. + /// + public static void DeleteOpenIdConnection(DeleteOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public static void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing Player Shared Secret Key. It may take up to 5 minutes for this delete to be reflected after this API + /// returns. + /// + public static void DeletePlayerSharedSecret(DeletePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeletePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing player segment and its associated action(s) for a title. + /// + public static void DeleteSegment(DeleteSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing virtual item store + /// + public static void DeleteStore(DeleteStoreRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteStore", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a task. + /// + public static void DeleteTask(DeleteTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Permanently deletes a title and all associated configuration + /// + public static void DeleteTitle(DeleteTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteTitle", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a specified set of title data overrides. + /// + public static void DeleteTitleDataOverride(DeleteTitleDataOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/DeleteTitleDataOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Exports all associated data of a master player account + /// + public static void ExportMasterPlayerData(ExportMasterPlayerDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ExportMasterPlayerData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Starts an export for the player profiles in a segment. This API creates a snapshot of all the player profiles which + /// match the segment definition at the time of the API call. Profiles which change while an export is in progress will not + /// be reflected in the results. + /// + public static void ExportPlayersInSegment(ExportPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ExportPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get information about a ActionsOnPlayersInSegment task instance. + /// + public static void GetActionsOnPlayersInSegmentTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetActionsOnPlayersInSegmentTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public static void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public static void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the contents and information of a specific Cloud Script revision. + /// + public static void GetCloudScriptRevision(GetCloudScriptRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get detail information about a CloudScript task instance. + /// + public static void GetCloudScriptTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all the current cloud script versions. For each version, information about the current published and latest + /// revisions is also listed. + /// + public static void GetCloudScriptVersions(GetCloudScriptVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all contents of the title and get statistics such as size + /// + public static void GetContentList(GetContentListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetContentList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the pre-signed URL for uploading a content file. A subsequent HTTP PUT to the returned URL uploads the + /// content. Also, please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN + /// rates apply. + /// + public static void GetContentUploadUrl(GetContentUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetContentUploadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a download URL for the requested report + /// + public static void GetDataReport(GetDataReportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetDataReport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the details for a specific completed session, including links to standard out and standard error logs + /// + [Obsolete("Use 'MultiplayerServer/GetMultiplayerSessionLogsBySessionId' instead", true)] + public static void GetMatchmakerGameInfo(GetMatchmakerGameInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetMatchmakerGameInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the details of defined game modes for the specified game server executable + /// + [Obsolete("No longer available", true)] + public static void GetMatchmakerGameModes(GetMatchmakerGameModesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetMatchmakerGameModes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the list of titles that the player has played + /// + public static void GetPlayedTitleList(GetPlayedTitleListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayedTitleList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a player's ID from an auth token. + /// + public static void GetPlayerIdFromAuthToken(GetPlayerIdFromAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerIdFromAuthToken", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the player's profile + /// + public static void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public static void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns all Player Shared Secret Keys including disabled and expired. + /// + public static void GetPlayerSharedSecrets(GetPlayerSharedSecretsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSharedSecrets", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public static void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the configuration information for all player statistics defined in the title, regardless of whether they have + /// a reset interval. + /// + public static void GetPlayerStatisticDefinitions(GetPlayerStatisticDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticDefinitions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public static void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public static void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the requested policy. + /// + public static void GetPolicy(GetPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public static void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the random drop table configuration for the title + /// + public static void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the result of an export started by ExportPlayersInSegment API. If the ExportPlayersInSegment is successful and + /// complete, this API returns the IndexUrl from which the index file can be downloaded. The index file has a list of urls + /// from which the files containing the player profile data can be downloaded. Otherwise, it returns the current 'State' of + /// the export + /// + public static void GetSegmentExport(GetPlayersInSegmentExportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetSegmentExport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get detail information of a segment and its associated definition(s) and action(s) for a title. + /// + public static void GetSegments(GetSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the set of items defined for the specified store, including all prices defined + /// + public static void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Query for task instances by task, status, or time range. + /// + public static void GetTaskInstances(GetTaskInstancesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTaskInstances", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get definition information on a specified task or all tasks within a title. + /// + public static void GetTasks(GetTasksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTasks", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings which can be read by the client + /// + public static void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings which cannot be read by the client + /// + public static void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the relevant details for a specified user, based upon a match against a supplied unique identifier + /// + public static void GetUserAccountInfo(LookupUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets all bans for a user. + /// + public static void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the specified user's current inventory of virtual goods + /// + public static void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public static void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public static void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified items to the specified user inventories + /// + public static void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Increases the global count for the given scarce resource. + /// + public static void IncrementLimitedEditionItemAvailability(IncrementLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/IncrementLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Resets the indicated statistic, removing all player entries for it and backing up the old values. + /// + public static void IncrementPlayerStatisticVersion(IncrementPlayerStatisticVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/IncrementPlayerStatisticVersion", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of all Open ID Connect providers registered to a title. + /// + public static void ListOpenIdConnection(ListOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ListOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retuns the list of all defined virtual currencies for the title + /// + public static void ListVirtualCurrencyTypes(ListVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ListVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the build details for the specified game server executable + /// + [Obsolete("No longer available", true)] + public static void ModifyServerBuild(ModifyServerBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ModifyServerBuild", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Attempts to process an order refund through the original real money payment provider. + /// + public static void RefundPurchase(RefundPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RefundPurchase", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes one or more virtual currencies from the set defined for the title. + /// + public static void RemoveVirtualCurrencyTypes(RemoveVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RemoveVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Completely removes all statistics for the specified character, for the current game + /// + public static void ResetCharacterStatistics(ResetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Reset a player's password for a given title. + /// + public static void ResetPassword(ResetPasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResetPassword", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Completely removes all statistics for the specified user, for the current game + /// + public static void ResetUserStatistics(ResetUserStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResetUserStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Attempts to resolve a dispute with the original order's payment provider. + /// + public static void ResolvePurchaseDispute(ResolvePurchaseDisputeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/ResolvePurchaseDispute", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans for a user. + /// + public static void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public static void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revokes access to an item in a user's inventory + /// + public static void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revokes access for up to 25 items across multiple users and characters. + /// + public static void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Run a task immediately regardless of its schedule. + /// + public static void RunTask(RunTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/RunTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public static void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SendAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates the catalog configuration of all virtual goods for the specified catalog version + /// + public static void SetCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the override expiration for a membership subscription + /// + public static void SetMembershipOverride(SetMembershipOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetMembershipOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets or resets the player's secret. Player secrets are used to sign API requests. + /// + public static void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the currently published revision of a title Cloud Script + /// + public static void SetPublishedRevision(SetPublishedRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetPublishedRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public static void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets all the items in one virtual store + /// + public static void SetStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the key-value store of custom title settings which can be read by the client. For example, a + /// developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. + /// + public static void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Set and delete key-value pairs in a title data override instance. + /// + public static void SetTitleDataAndOverrides(SetTitleDataAndOverridesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetTitleDataAndOverrides", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom title settings which cannot be read by the client. These values can be used to + /// tweak settings used by game servers and Cloud Scripts without the need to update and re-deploy. + /// + public static void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the Amazon Resource Name (ARN) for iOS and Android push notifications. Documentation on the exact restrictions can + /// be found at: http://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html. Currently, Amazon device + /// Messaging is not supported. + /// + public static void SetupPushNotification(SetupPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SetupPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Decrements the specified virtual currency by the stated amount + /// + public static void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public static void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the catalog configuration for virtual goods in the specified catalog version + /// + public static void UpdateCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new Cloud Script revision and uploads source code to it. Note that at this time, only one file should be + /// submitted in the revision. + /// + public static void UpdateCloudScript(UpdateCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Modifies data and credentials for an existing relationship between a title and an Open ID Connect provider + /// + public static void UpdateOpenIdConnection(UpdateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a existing Player Shared Secret Key. It may take up to 5 minutes for this update to become generally available + /// after this API returns. + /// + public static void UpdatePlayerSharedSecret(UpdatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a player statistic configuration for the title, optionally allowing the developer to specify a reset interval. + /// + public static void UpdatePlayerStatisticDefinition(UpdatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Changes a policy for a title + /// + public static void UpdatePolicy(UpdatePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdatePolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the random drop table configuration for the title + /// + public static void UpdateRandomResultTables(UpdateRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates an existing player segment and its associated definition(s) and action(s) for a title. + /// + public static void UpdateSegment(UpdateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates an existing virtual item store with new or modified items + /// + public static void UpdateStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update an existing task. + /// + public static void UpdateTask(UpdateTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title specific display name for a user + /// + public static void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Admin/UpdateUserTitleDisplayName", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta new file mode 100644 index 00000000..ec37b6e1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 98aa7d0b4d53fe24392fc8cc52120845 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs new file mode 100644 index 00000000..89bf1839 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs @@ -0,0 +1,1349 @@ +#if ENABLE_PLAYFABADMIN_API + +using System; +using System.Collections.Generic; +using PlayFab.AdminModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// APIs for managing title configurations, uploaded Game Server code executables, and user data + /// + public class PlayFabAdminInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabAdminInstanceAPI() { } + + public PlayFabAdminInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + } + + public PlayFabAdminInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context; + } + + public PlayFabAdminInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Abort an ongoing task instance. + /// + public void AbortTaskInstance(AbortTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AbortTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update news item to include localized version + /// + public void AddLocalizedNews(AddLocalizedNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddLocalizedNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a new news item to the title's news feed + /// + public void AddNews(AddNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Increments the specified virtual currency by the stated amount + /// + public void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds one or more virtual currencies to the set defined for the title. Virtual Currencies have a maximum value of + /// 2,147,483,647 when granted to a player. Any value over that will be discarded. + /// + public void AddVirtualCurrencyTypes(AddVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/AddVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Checks the global count for the limited edition item. + /// + public void CheckLimitedEditionItemAvailability(CheckLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CheckLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create an ActionsOnPlayersInSegment task, which iterates through all players in a segment to execute action. + /// + public void CreateActionsOnPlayersInSegmentTask(CreateActionsOnPlayerSegmentTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateActionsOnPlayersInSegmentTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a CloudScript task, which can run a CloudScript on a schedule. + /// + public void CreateCloudScriptTask(CreateCloudScriptTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateCloudScriptTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a Insights Scheduled Scaling task, which can scale Insights Performance Units on a schedule + /// + public void CreateInsightsScheduledScalingTask(CreateInsightsScheduledScalingTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateInsightsScheduledScalingTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers a relationship between a title and an Open ID Connect provider. + /// + public void CreateOpenIdConnection(CreateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new Player Shared Secret Key. It may take up to 5 minutes for this key to become generally available after + /// this API returns. + /// + public void CreatePlayerSharedSecret(CreatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a new player statistic configuration to the title, optionally allowing the developer to specify a reset interval + /// and an aggregation method. + /// + public void CreatePlayerStatisticDefinition(CreatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new player segment by defining the conditions on player properties. Also, create actions to target the player + /// segments for a title. + /// + public void CreateSegment(CreateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/CreateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a content file from the title. When deleting a file that does not exist, it returns success. + /// + public void DeleteContent(DeleteContentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteContent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a master player account entirely from all titles and deletes all associated data + /// + public void DeleteMasterPlayerAccount(DeleteMasterPlayerAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteMasterPlayerAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a player's subscription + /// + public void DeleteMembershipSubscription(DeleteMembershipSubscriptionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteMembershipSubscription", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a relationship between a title and an OpenID Connect provider. + /// + public void DeleteOpenIdConnection(DeleteOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing Player Shared Secret Key. It may take up to 5 minutes for this delete to be reflected after this API + /// returns. + /// + public void DeletePlayerSharedSecret(DeletePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeletePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing player segment and its associated action(s) for a title. + /// + public void DeleteSegment(DeleteSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing virtual item store + /// + public void DeleteStore(DeleteStoreRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteStore", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a task. + /// + public void DeleteTask(DeleteTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Permanently deletes a title and all associated configuration + /// + public void DeleteTitle(DeleteTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteTitle", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a specified set of title data overrides. + /// + public void DeleteTitleDataOverride(DeleteTitleDataOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/DeleteTitleDataOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Exports all associated data of a master player account + /// + public void ExportMasterPlayerData(ExportMasterPlayerDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ExportMasterPlayerData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Starts an export for the player profiles in a segment. This API creates a snapshot of all the player profiles which + /// match the segment definition at the time of the API call. Profiles which change while an export is in progress will not + /// be reflected in the results. + /// + public void ExportPlayersInSegment(ExportPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ExportPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get information about a ActionsOnPlayersInSegment task instance. + /// + public void GetActionsOnPlayersInSegmentTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetActionsOnPlayersInSegmentTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the contents and information of a specific Cloud Script revision. + /// + public void GetCloudScriptRevision(GetCloudScriptRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get detail information about a CloudScript task instance. + /// + public void GetCloudScriptTaskInstance(GetTaskInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptTaskInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all the current cloud script versions. For each version, information about the current published and latest + /// revisions is also listed. + /// + public void GetCloudScriptVersions(GetCloudScriptVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetCloudScriptVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all contents of the title and get statistics such as size + /// + public void GetContentList(GetContentListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetContentList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the pre-signed URL for uploading a content file. A subsequent HTTP PUT to the returned URL uploads the + /// content. Also, please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN + /// rates apply. + /// + public void GetContentUploadUrl(GetContentUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetContentUploadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a download URL for the requested report + /// + public void GetDataReport(GetDataReportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetDataReport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the details for a specific completed session, including links to standard out and standard error logs + /// + [Obsolete("Use 'MultiplayerServer/GetMultiplayerSessionLogsBySessionId' instead", true)] + public void GetMatchmakerGameInfo(GetMatchmakerGameInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetMatchmakerGameInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the details of defined game modes for the specified game server executable + /// + [Obsolete("No longer available", true)] + public void GetMatchmakerGameModes(GetMatchmakerGameModesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetMatchmakerGameModes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the list of titles that the player has played + /// + public void GetPlayedTitleList(GetPlayedTitleListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayedTitleList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a player's ID from an auth token. + /// + public void GetPlayerIdFromAuthToken(GetPlayerIdFromAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerIdFromAuthToken", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the player's profile + /// + public void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns all Player Shared Secret Keys including disabled and expired. + /// + public void GetPlayerSharedSecrets(GetPlayerSharedSecretsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerSharedSecrets", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the configuration information for all player statistics defined in the title, regardless of whether they have + /// a reset interval. + /// + public void GetPlayerStatisticDefinitions(GetPlayerStatisticDefinitionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticDefinitions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the requested policy. + /// + public void GetPolicy(GetPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the random drop table configuration for the title + /// + public void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the result of an export started by ExportPlayersInSegment API. If the ExportPlayersInSegment is successful and + /// complete, this API returns the IndexUrl from which the index file can be downloaded. The index file has a list of urls + /// from which the files containing the player profile data can be downloaded. Otherwise, it returns the current 'State' of + /// the export + /// + public void GetSegmentExport(GetPlayersInSegmentExportRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetSegmentExport", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get detail information of a segment and its associated definition(s) and action(s) for a title. + /// + public void GetSegments(GetSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the set of items defined for the specified store, including all prices defined + /// + public void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Query for task instances by task, status, or time range. + /// + public void GetTaskInstances(GetTaskInstancesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTaskInstances", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get definition information on a specified task or all tasks within a title. + /// + public void GetTasks(GetTasksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTasks", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings which can be read by the client + /// + public void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings which cannot be read by the client + /// + public void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the relevant details for a specified user, based upon a match against a supplied unique identifier + /// + public void GetUserAccountInfo(LookupUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets all bans for a user. + /// + public void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the specified user's current inventory of virtual goods + /// + public void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified items to the specified user inventories + /// + public void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Increases the global count for the given scarce resource. + /// + public void IncrementLimitedEditionItemAvailability(IncrementLimitedEditionItemAvailabilityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/IncrementLimitedEditionItemAvailability", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Resets the indicated statistic, removing all player entries for it and backing up the old values. + /// + public void IncrementPlayerStatisticVersion(IncrementPlayerStatisticVersionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/IncrementPlayerStatisticVersion", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of all Open ID Connect providers registered to a title. + /// + public void ListOpenIdConnection(ListOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ListOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retuns the list of all defined virtual currencies for the title + /// + public void ListVirtualCurrencyTypes(ListVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ListVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the build details for the specified game server executable + /// + [Obsolete("No longer available", true)] + public void ModifyServerBuild(ModifyServerBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ModifyServerBuild", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Attempts to process an order refund through the original real money payment provider. + /// + public void RefundPurchase(RefundPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RefundPurchase", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes one or more virtual currencies from the set defined for the title. + /// + public void RemoveVirtualCurrencyTypes(RemoveVirtualCurrencyTypesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RemoveVirtualCurrencyTypes", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Completely removes all statistics for the specified character, for the current game + /// + public void ResetCharacterStatistics(ResetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Reset a player's password for a given title. + /// + public void ResetPassword(ResetPasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResetPassword", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Completely removes all statistics for the specified user, for the current game + /// + public void ResetUserStatistics(ResetUserStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResetUserStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Attempts to resolve a dispute with the original order's payment provider. + /// + public void ResolvePurchaseDispute(ResolvePurchaseDisputeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/ResolvePurchaseDispute", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans for a user. + /// + public void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revokes access to an item in a user's inventory + /// + public void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revokes access for up to 25 items across multiple users and characters. + /// + public void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Run a task immediately regardless of its schedule. + /// + public void RunTask(RunTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/RunTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SendAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates the catalog configuration of all virtual goods for the specified catalog version + /// + public void SetCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the override expiration for a membership subscription + /// + public void SetMembershipOverride(SetMembershipOverrideRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetMembershipOverride", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets or resets the player's secret. Player secrets are used to sign API requests. + /// + public void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the currently published revision of a title Cloud Script + /// + public void SetPublishedRevision(SetPublishedRevisionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetPublishedRevision", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets all the items in one virtual store + /// + public void SetStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the key-value store of custom title settings which can be read by the client. For example, a + /// developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. + /// + public void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Set and delete key-value pairs in a title data override instance. + /// + public void SetTitleDataAndOverrides(SetTitleDataAndOverridesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetTitleDataAndOverrides", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom title settings which cannot be read by the client. These values can be used to + /// tweak settings used by game servers and Cloud Scripts without the need to update and re-deploy. + /// + public void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the Amazon Resource Name (ARN) for iOS and Android push notifications. Documentation on the exact restrictions can + /// be found at: http://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html. Currently, Amazon device + /// Messaging is not supported. + /// + public void SetupPushNotification(SetupPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SetupPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Decrements the specified virtual currency by the stated amount + /// + public void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the catalog configuration for virtual goods in the specified catalog version + /// + public void UpdateCatalogItems(UpdateCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new Cloud Script revision and uploads source code to it. Note that at this time, only one file should be + /// submitted in the revision. + /// + public void UpdateCloudScript(UpdateCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Modifies data and credentials for an existing relationship between a title and an Open ID Connect provider + /// + public void UpdateOpenIdConnection(UpdateOpenIdConnectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateOpenIdConnection", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a existing Player Shared Secret Key. It may take up to 5 minutes for this update to become generally available + /// after this API returns. + /// + public void UpdatePlayerSharedSecret(UpdatePlayerSharedSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerSharedSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a player statistic configuration for the title, optionally allowing the developer to specify a reset interval. + /// + public void UpdatePlayerStatisticDefinition(UpdatePlayerStatisticDefinitionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdatePlayerStatisticDefinition", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Changes a policy for a title + /// + public void UpdatePolicy(UpdatePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdatePolicy", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the random drop table configuration for the title + /// + public void UpdateRandomResultTables(UpdateRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates an existing player segment and its associated definition(s) and action(s) for a title. + /// + public void UpdateSegment(UpdateSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates an existing virtual item store with new or modified items + /// + public void UpdateStoreItems(UpdateStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update an existing task. + /// + public void UpdateTask(UpdateTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateTask", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title specific display name for a user + /// + public void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Admin/UpdateUserTitleDisplayName", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta new file mode 100644 index 00000000..dfaa93b4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 942c3c5d808dfed49b4c4369cc282d49 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs new file mode 100644 index 00000000..c319d2e9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs @@ -0,0 +1,7474 @@ +#if ENABLE_PLAYFABADMIN_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.AdminModels +{ + /// + /// If the task instance has already completed, there will be no-op. + /// + [Serializable] + public class AbortTaskInstanceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ID of a task instance that is being aborted. + /// + public string TaskInstanceId; + } + + [Serializable] + public class ActionsOnPlayersInSegmentTaskParameter : PlayFabBaseModel + { + /// + /// ID of the action to perform on each player in segment. + /// + public string ActionId; + /// + /// ID of the segment to perform actions on. + /// + public string SegmentId; + } + + [Serializable] + public class ActionsOnPlayersInSegmentTaskSummary : PlayFabBaseModel + { + /// + /// UTC timestamp when the task completed. + /// + public DateTime? CompletedAt; + /// + /// Error message for last processing attempt, if an error occured. + /// + public string ErrorMessage; + /// + /// Flag indicating if the error was fatal, if false job will be retried. + /// + public bool? ErrorWasFatal; + /// + /// Estimated time remaining in seconds. + /// + public double? EstimatedSecondsRemaining; + /// + /// Progress represented as percentage. + /// + public double? PercentComplete; + /// + /// If manually scheduled, ID of user who scheduled the task. + /// + public string ScheduledByUserId; + /// + /// UTC timestamp when the task started. + /// + public DateTime StartedAt; + /// + /// Current status of the task instance. + /// + public TaskInstanceStatus? Status; + /// + /// Identifier of the task this instance belongs to. + /// + public NameIdentifier TaskIdentifier; + /// + /// ID of the task instance. + /// + public string TaskInstanceId; + /// + /// Total players in segment when task was started. + /// + public int? TotalPlayersInSegment; + /// + /// Total number of players that have had the actions applied to. + /// + public int? TotalPlayersProcessed; + } + + [Serializable] + public class AdCampaignAttribution : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AdCampaignSegmentFilter : PlayFabBaseModel + { + /// + /// Campaign id. + /// + public string CampaignId; + /// + /// Campaign source. + /// + public string CampaignSource; + /// + /// Campaign comparison. + /// + public SegmentFilterComparison? Comparison; + } + + [Serializable] + public class AddLocalizedNewsRequest : PlayFabRequestCommon + { + /// + /// Localized body text of the news. + /// + public string Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Language of the news item. + /// + public string Language; + /// + /// Unique id of the updated news item. + /// + public string NewsId; + /// + /// Localized title (headline) of the news item. + /// + public string Title; + } + + [Serializable] + public class AddLocalizedNewsResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddNewsRequest : PlayFabRequestCommon + { + /// + /// Default body text of the news. + /// + public string Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Time this news was published. If not set, defaults to now. + /// + public DateTime? Timestamp; + /// + /// Default title (headline) of the news item. + /// + public string Title; + } + + [Serializable] + public class AddNewsResult : PlayFabResultCommon + { + /// + /// Unique id of the new news item + /// + public string NewsId; + } + + /// + /// This API will trigger a player_tag_added event and add a tag with the given TagName and PlayFabID to the corresponding + /// player profile. TagName can be used for segmentation and it is limited to 256 characters. Also there is a limit on the + /// number of tags a title can have. + /// + [Serializable] + public class AddPlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class AddPlayerTagResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the user balance of the specified virtual currency. Maximum VC balance is Int32 (2,147,483,647). + /// Any increase over this value will be discarded. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be increased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + /// + /// This operation is additive. Any new currencies defined in the array will be added to the set of those available for the + /// title, while any CurrencyCode identifiers matching existing ones in the game will be overwritten with the new values. + /// + [Serializable] + public class AddVirtualCurrencyTypesRequest : PlayFabRequestCommon + { + /// + /// List of virtual currencies and their initial deposits (the amount a user is granted when signing in for the first time) + /// to the title + /// + public List VirtualCurrencies; + } + + [Serializable] + public class AllPlayersSegmentFilter : PlayFabBaseModel + { + } + + [Serializable] + public class ApiCondition : PlayFabBaseModel + { + /// + /// Require that API calls contain an RSA encrypted payload or signed headers. + /// + public Conditionals? HasSignatureOrEncryption; + } + + public enum AuthTokenType + { + Email + } + + /// + /// Contains information for a ban. + /// + [Serializable] + public class BanInfo : PlayFabBaseModel + { + /// + /// The active state of this ban. Expired bans may still have this value set to true but they will have no effect. + /// + public bool Active; + /// + /// The unique Ban Id associated with this ban. + /// + public string BanId; + /// + /// The time when this ban was applied. + /// + public DateTime? Created; + /// + /// The time when this ban expires. Permanent bans do not have expiration date. + /// + public DateTime? Expires; + /// + /// The IP address on which the ban was applied. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason why this ban was applied. + /// + public string Reason; + } + + [Serializable] + public class BanPlayerSegmentAction : PlayFabBaseModel + { + /// + /// Ban hours duration. + /// + public uint? BanHours; + /// + /// Reason for ban. + /// + public string ReasonForBan; + } + + /// + /// Represents a single ban request. + /// + [Serializable] + public class BanRequest : PlayFabBaseModel + { + /// + /// The duration in hours for the ban. Leave this blank for a permanent ban. + /// + public uint? DurationInHours; + /// + /// IP address to be banned. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason for this ban. Maximum 140 characters. + /// + public string Reason; + } + + /// + /// The existence of each user will not be verified. When banning by IP or MAC address, multiple players may be affected, so + /// use this feature with caution. Returns information about the new bans. + /// + [Serializable] + public class BanUsersRequest : PlayFabRequestCommon + { + /// + /// List of ban requests to be applied. Maximum 100. + /// + public List Bans; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class BanUsersResult : PlayFabResultCommon + { + /// + /// Information on the bans that were applied + /// + public List BanData; + } + + [Serializable] + public class BlankResult : PlayFabResultCommon + { + } + + /// + /// A purchasable item from the item catalog + /// + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// defines the bundle properties for the item - bundles are items which contain other items, including random drop tables + /// and virtual currencies + /// + public CatalogItemBundleInfo Bundle; + /// + /// if true, then an item instance of this type can be used to grant a character to a user. + /// + public bool CanBecomeCharacter; + /// + /// catalog version for this item + /// + public string CatalogVersion; + /// + /// defines the consumable properties (number of uses, timeout) for the item + /// + public CatalogItemConsumableInfo Consumable; + /// + /// defines the container properties for the item - what items it contains, including random drop tables and virtual + /// currencies, and what item (if any) is required to open it via the UnlockContainerItem API + /// + public CatalogItemContainerInfo Container; + /// + /// game specific custom data + /// + public string CustomData; + /// + /// text description of item, to show in-game + /// + public string Description; + /// + /// text name for the item, to show in-game + /// + public string DisplayName; + /// + /// If the item has IsLImitedEdition set to true, and this is the first time this ItemId has been defined as a limited + /// edition item, this value determines the total number of instances to allocate for the title. Once this limit has been + /// reached, no more instances of this ItemId can be created, and attempts to purchase or grant it will return a Result of + /// false for that ItemId. If the item has already been defined to have a limited edition count, or if this value is less + /// than zero, it will be ignored. + /// + public int InitialLimitedEditionCount; + /// + /// BETA: If true, then only a fixed number can ever be granted. + /// + public bool IsLimitedEdition; + /// + /// if true, then only one item instance of this type will exist and its remaininguses will be incremented instead. + /// RemainingUses will cap out at Int32.Max (2,147,483,647). All subsequent increases will be discarded + /// + public bool IsStackable; + /// + /// if true, then an item instance of this type can be traded between players using the trading APIs + /// + public bool IsTradable; + /// + /// class to which the item belongs + /// + public string ItemClass; + /// + /// unique identifier for this item + /// + public string ItemId; + /// + /// URL to the item image. For Facebook purchase to display the image on the item purchase page, this must be set to an HTTP + /// URL. + /// + public string ItemImageUrl; + /// + /// override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// list of item tags + /// + public List Tags; + /// + /// price of this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + [Serializable] + public class CatalogItemBundleInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory when the bundle is added + /// + public List BundledItems; + /// + /// unique TableId values for all RandomResultTable objects which are part of the bundle (random tables will be resolved and + /// add the relevant items to the player inventory when the bundle is added) + /// + public List BundledResultTables; + /// + /// virtual currency types and balances which will be added to the player inventory when the bundle is added + /// + public Dictionary BundledVirtualCurrencies; + } + + [Serializable] + public class CatalogItemConsumableInfo : PlayFabBaseModel + { + /// + /// number of times this object can be used, after which it will be removed from the player inventory + /// + public uint? UsageCount; + /// + /// duration in seconds for how long the item will remain in the player inventory - once elapsed, the item will be removed + /// (recommended minimum value is 5 seconds, as lower values can cause the item to expire before operations depending on + /// this item's details have completed) + /// + public uint? UsagePeriod; + /// + /// all inventory item instances in the player inventory sharing a non-null UsagePeriodGroup have their UsagePeriod values + /// added together, and share the result - when that period has elapsed, all the items in the group will be removed + /// + public string UsagePeriodGroup; + } + + /// + /// Containers are inventory items that can hold other items defined in the catalog, as well as virtual currency, which is + /// added to the player inventory when the container is unlocked, using the UnlockContainerItem API. The items can be + /// anything defined in the catalog, as well as RandomResultTable objects which will be resolved when the container is + /// unlocked. Containers and their keys should be defined as Consumable (having a limited number of uses) in their catalog + /// defintiions, unless the intent is for the player to be able to re-use them infinitely. + /// + [Serializable] + public class CatalogItemContainerInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory, once the container has been unlocked + /// + public List ItemContents; + /// + /// ItemId for the catalog item used to unlock the container, if any (if not specified, a call to UnlockContainerItem will + /// open the container, adding the contents to the player inventory and currency balances) + /// + public string KeyItemId; + /// + /// unique TableId values for all RandomResultTable objects which are part of the container (once unlocked, random tables + /// will be resolved and add the relevant items to the player inventory) + /// + public List ResultTableContents; + /// + /// virtual currency types and balances which will be added to the player inventory when the container is unlocked + /// + public Dictionary VirtualCurrencyContents; + } + + /// + /// This returns the total number of these items available. + /// + [Serializable] + public class CheckLimitedEditionItemAvailabilityRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being updated. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The item to check for. + /// + public string ItemId; + } + + [Serializable] + public class CheckLimitedEditionItemAvailabilityResult : PlayFabResultCommon + { + /// + /// The amount of the specified resource remaining. + /// + public int Amount; + } + + [Serializable] + public class ChurnPredictionSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// RiskLevel + /// + public ChurnRiskLevel? RiskLevel; + } + + public enum ChurnRiskLevel + { + NoData, + LowRisk, + MediumRisk, + HighRisk + } + + [Serializable] + public class CloudScriptFile : PlayFabBaseModel + { + /// + /// Contents of the Cloud Script javascript. Must be string-escaped javascript. + /// + public string FileContents; + /// + /// Name of the javascript file. These names are not used internally by the server, they are only for developer + /// organizational purposes. + /// + public string Filename; + } + + [Serializable] + public class CloudScriptTaskParameter : PlayFabBaseModel + { + /// + /// Argument to pass to the CloudScript function. + /// + public object Argument; + /// + /// Name of the CloudScript function to execute. + /// + public string FunctionName; + } + + [Serializable] + public class CloudScriptTaskSummary : PlayFabBaseModel + { + /// + /// UTC timestamp when the task completed. + /// + public DateTime? CompletedAt; + /// + /// Estimated time remaining in seconds. + /// + public double? EstimatedSecondsRemaining; + /// + /// Progress represented as percentage. + /// + public double? PercentComplete; + /// + /// Result of CloudScript execution + /// + public ExecuteCloudScriptResult Result; + /// + /// If manually scheduled, ID of user who scheduled the task. + /// + public string ScheduledByUserId; + /// + /// UTC timestamp when the task started. + /// + public DateTime StartedAt; + /// + /// Current status of the task instance. + /// + public TaskInstanceStatus? Status; + /// + /// Identifier of the task this instance belongs to. + /// + public NameIdentifier TaskIdentifier; + /// + /// ID of the task instance. + /// + public string TaskInstanceId; + } + + [Serializable] + public class CloudScriptVersionStatus : PlayFabBaseModel + { + /// + /// Most recent revision for this Cloud Script version + /// + public int LatestRevision; + /// + /// Published code revision for this Cloud Script version + /// + public int PublishedRevision; + /// + /// Version number + /// + public int Version; + } + + public enum Conditionals + { + Any, + True, + False + } + + [Serializable] + public class ContactEmailInfo : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + [Serializable] + public class ContentInfo : PlayFabBaseModel + { + /// + /// Key of the content + /// + public string Key; + /// + /// Last modified time + /// + public DateTime LastModified; + /// + /// Size of the content in bytes + /// + public double Size; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW + } + + /// + /// Task name is unique within a title. Using a task name that's already taken will cause a name conflict error. Too many + /// create-task requests within a short time will cause a create conflict error. + /// + [Serializable] + public class CreateActionsOnPlayerSegmentTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Task details related to segment and action + /// + public ActionsOnPlayersInSegmentTaskParameter Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + } + + /// + /// Task name is unique within a title. Using a task name that's already taken will cause a name conflict error. Too many + /// create-task requests within a short time will cause a create conflict error. + /// + [Serializable] + public class CreateCloudScriptTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Task details related to CloudScript + /// + public CloudScriptTaskParameter Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + } + + /// + /// Task name is unique within a title. Using a task name that's already taken will cause a name conflict error. Too many + /// create-task requests within a short time will cause a create conflict error. + /// + [Serializable] + public class CreateInsightsScheduledScalingTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Task details related to Insights Scaling + /// + public InsightsScalingTaskParameter Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + } + + [Serializable] + public class CreateOpenIdConnectionRequest : PlayFabRequestCommon + { + /// + /// The client ID given by the ID provider. + /// + public string ClientId; + /// + /// The client secret given by the ID provider. + /// + public string ClientSecret; + /// + /// A name for the connection that identifies it within the title. + /// + public string ConnectionId; + /// + /// Ignore 'nonce' claim in identity tokens. + /// + public bool? IgnoreNonce; + /// + /// The discovery document URL to read issuer information from. This must be the absolute URL to the JSON OpenId + /// Configuration document and must be accessible from the internet. If you don't know it, try your issuer URL followed by + /// "/.well-known/openid-configuration". For example, if the issuer is https://example.com, try + /// https://example.com/.well-known/openid-configuration + /// + public string IssuerDiscoveryUrl; + /// + /// Manually specified information for an OpenID Connect issuer. + /// + public OpenIdIssuerInformation IssuerInformation; + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class CreatePlayerSharedSecretRequest : PlayFabRequestCommon + { + /// + /// Friendly name for this key + /// + public string FriendlyName; + } + + [Serializable] + public class CreatePlayerSharedSecretResult : PlayFabResultCommon + { + /// + /// The player shared secret to use when calling Client/GetTitlePublicKey + /// + public string SecretKey; + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The ResetInterval enables + /// automatically resetting leaderboards on a specified interval. Upon reset, the statistic updates to a new version with no + /// values (effectively removing all players from the leaderboard). The previous version's statistic values are also + /// archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via a call to + /// CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on a + /// schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the now-previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). The AggregationMethod determines what action is taken when a new statistic + /// value is submitted - always update with the new value (Last), use the highest of the old and new values (Max), use the + /// smallest (Min), or add them together (Sum). + /// + [Serializable] + public class CreatePlayerStatisticDefinitionRequest : PlayFabRequestCommon + { + /// + /// the aggregation method to use in updating the statistic (defaults to last) + /// + public StatisticAggregationMethod? AggregationMethod; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// interval at which the values of the statistic for all players are reset (resets begin at the next interval boundary) + /// + public StatisticResetIntervalOption? VersionChangeInterval; + } + + [Serializable] + public class CreatePlayerStatisticDefinitionResult : PlayFabResultCommon + { + /// + /// created statistic definition + /// + public PlayerStatisticDefinition Statistic; + } + + /// + /// Send all the segment details part of CreateSegmentRequest + /// + [Serializable] + public class CreateSegmentRequest : PlayFabRequestCommon + { + /// + /// Segment model with all of the segment properties data. + /// + public SegmentModel SegmentModel; + } + + [Serializable] + public class CreateSegmentResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + /// + /// Segment id. + /// + public string SegmentId; + } + + [Serializable] + public class CreateTaskResult : PlayFabResultCommon + { + /// + /// ID of the task + /// + public string TaskId; + } + + public enum Currency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + [Serializable] + public class DeleteContentRequest : PlayFabRequestCommon + { + /// + /// Key of the content item to be deleted + /// + public string Key; + } + + /// + /// Deletes all data associated with the master player account, including data from all titles the player has played, such + /// as statistics, custom data, inventory, purchases, virtual currency balances, characters, group memberships, publisher + /// data, credential data, account linkages, friends list and PlayStream event history. Removes the player from all + /// leaderboards and player search indexes. Note, this API queues the player for deletion and returns a receipt immediately. + /// Record the receipt ID for future reference. It may take some time before all player data is fully deleted. Upon + /// completion of the deletion, an email will be sent to the notification email address configured for the title confirming + /// the deletion. Until the player data is fully deleted, attempts to recreate the player with the same user account in the + /// same title will fail with the 'AccountDeleted' error. It is highly recommended to know the impact of the deletion by + /// calling GetPlayedTitleList, before calling this API. + /// + [Serializable] + public class DeleteMasterPlayerAccountRequest : PlayFabRequestCommon + { + /// + /// Developer created string to identify a user without PlayFab ID + /// + public string MetaData; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class DeleteMasterPlayerAccountResult : PlayFabResultCommon + { + /// + /// A notification email with this job receipt Id will be sent to the title notification email address when deletion is + /// complete. + /// + public string JobReceiptId; + /// + /// List of titles from which the player's data will be deleted. + /// + public List TitleIds; + } + + /// + /// This API lets developers delete a membership subscription. + /// + [Serializable] + public class DeleteMembershipSubscriptionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the membership to apply the override expiration date to. + /// + public string MembershipId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Id of the subscription that should be deleted from the membership. + /// + public string SubscriptionId; + } + + [Serializable] + public class DeleteMembershipSubscriptionResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteOpenIdConnectionRequest : PlayFabRequestCommon + { + /// + /// unique name of the connection + /// + public string ConnectionId; + } + + /// + /// Deletes all data associated with the player, including statistics, custom data, inventory, purchases, virtual currency + /// balances, characters and shared group memberships. Removes the player from all leaderboards and player search indexes. + /// Does not delete PlayStream event history associated with the player. Does not delete the publisher user account that + /// created the player in the title nor associated data such as username, password, email address, account linkages, or + /// friends list. Note, this API queues the player for deletion and returns immediately. It may take several minutes or more + /// before all player data is fully deleted. Until the player data is fully deleted, attempts to recreate the player with + /// the same user account in the same title will fail with the 'AccountDeleted' error. + /// + [Serializable] + public class DeletePlayerRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class DeletePlayerResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeletePlayerSegmentAction : PlayFabBaseModel + { + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class DeletePlayerSharedSecretRequest : PlayFabRequestCommon + { + /// + /// The shared secret key to delete + /// + public string SecretKey; + } + + [Serializable] + public class DeletePlayerSharedSecretResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeletePlayerStatisticSegmentAction : PlayFabBaseModel + { + /// + /// Statistic name. + /// + public string StatisticName; + } + + /// + /// Send segment id planning to delete part of DeleteSegmentRequest object + /// + [Serializable] + public class DeleteSegmentRequest : PlayFabRequestCommon + { + /// + /// Segment id. + /// + public string SegmentId; + } + + [Serializable] + public class DeleteSegmentsResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + } + + /// + /// This non-reversible operation will permanently delete the requested store. + /// + [Serializable] + public class DeleteStoreRequest : PlayFabRequestCommon + { + /// + /// catalog version of the store to delete. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unqiue identifier for the store which is to be deleted + /// + public string StoreId; + } + + [Serializable] + public class DeleteStoreResult : PlayFabResultCommon + { + } + + /// + /// After a task is deleted, for tracking purposes, the task instances belonging to this task will still remain. They will + /// become orphaned and does not belongs to any task. Executions of any in-progress task instances will continue. If the + /// task specified does not exist, the deletion is considered a success. + /// + [Serializable] + public class DeleteTaskRequest : PlayFabRequestCommon + { + /// + /// Specify either the task ID or the name of task to be deleted. + /// + public NameIdentifier Identifier; + } + + /// + /// Will delete all the title data associated with the given override label. + /// + [Serializable] + public class DeleteTitleDataOverrideRequest : PlayFabRequestCommon + { + /// + /// Name of the override. + /// + public string OverrideLabel; + } + + [Serializable] + public class DeleteTitleDataOverrideResult : PlayFabResultCommon + { + } + + /// + /// Deletes all data associated with the title, including catalog, virtual currencies, leaderboard statistics, Cloud Script + /// revisions, segment definitions, event rules, tasks, add-ons, secret keys, data encryption keys, and permission policies. + /// Removes the title from its studio and removes all associated developer roles and permissions. Does not delete PlayStream + /// event history associated with the title. Note, this API queues the title for deletion and returns immediately. It may + /// take several hours or more before all title data is fully deleted. All player accounts in the title must be deleted + /// before deleting the title. If any player accounts exist, the API will return a 'TitleContainsUserAccounts' error. Until + /// the title data is fully deleted, attempts to call APIs with the title will fail with the 'TitleDeleted' error. + /// + [Serializable] + public class DeleteTitleRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class DeleteTitleResult : PlayFabResultCommon + { + } + + public enum EffectType + { + Allow, + Deny + } + + [Serializable] + public class EmailNotificationSegmentAction : PlayFabBaseModel + { + /// + /// Email template id. + /// + public string EmailTemplateId; + /// + /// Email template name. + /// + public string EmailTemplateName; + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class ExecuteAzureFunctionSegmentAction : PlayFabBaseModel + { + /// + /// Azure function. + /// + public string AzureFunction; + /// + /// Azure function parameter. + /// + public object FunctionParameter; + /// + /// Generate play stream event. + /// + public bool GenerateFunctionExecutedEvents; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabBaseModel + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + [Serializable] + public class ExecuteCloudScriptSegmentAction : PlayFabBaseModel + { + /// + /// Cloud script function. + /// + public string CloudScriptFunction; + /// + /// Generate play stream event. + /// + public bool CloudScriptPublishResultsToPlayStream; + /// + /// Cloud script function parameter. + /// + public object FunctionParameter; + /// + /// Cloud script function parameter json text. + /// + public string FunctionParameterJson; + } + + /// + /// Exports all data associated with the master player account, including data from all titles the player has played, such + /// as statistics, custom data, inventory, purchases, virtual currency balances, characters, group memberships, publisher + /// data, credential data, account linkages, friends list and PlayStream event history. Note, this API queues the player for + /// export and returns a receipt immediately. Record the receipt ID for future reference. It may take some time before the + /// export is available for download. Upon completion of the export, an email containing the URL to download the export dump + /// will be sent to the notification email address configured for the title. + /// + [Serializable] + public class ExportMasterPlayerDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ExportMasterPlayerDataResult : PlayFabResultCommon + { + /// + /// An email with this job receipt Id containing the export download link will be sent to the title notification email + /// address when the export is complete. + /// + public string JobReceiptId; + } + + /// + /// Request must contain the Segment ID + /// + [Serializable] + public class ExportPlayersInSegmentRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the requested segment. + /// + public string SegmentId; + } + + [Serializable] + public class ExportPlayersInSegmentResult : PlayFabResultCommon + { + /// + /// Unique identifier of the export for the requested Segment. + /// + public string ExportId; + /// + /// Unique identifier of the requested Segment. + /// + public string SegmentId; + } + + [Serializable] + public class FirstLoginDateSegmentFilter : PlayFabBaseModel + { + /// + /// First player login date comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// First player login date. + /// + public DateTime LogInDate; + } + + [Serializable] + public class FirstLoginTimespanSegmentFilter : PlayFabBaseModel + { + /// + /// First player login duration comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// First player login duration. + /// + public double DurationInMinutes; + } + + public enum GameBuildStatus + { + Available, + Validating, + InvalidBuildPackage, + Processing, + FailedToProcess + } + + [Serializable] + public class GameModeInfo : PlayFabBaseModel + { + /// + /// specific game mode type + /// + public string Gamemode; + /// + /// maximum user count a specific Game Server Instance can support + /// + public uint MaxPlayerCount; + /// + /// minimum user count required for this Game Server Instance to continue (usually 1) + /// + public uint MinPlayerCount; + /// + /// whether to start as an open session, meaning that players can matchmake into it (defaults to true) + /// + public bool? StartOpen; + } + + public enum GenericErrorCodes + { + Success, + UnkownError, + InvalidParams, + AccountNotFound, + AccountBanned, + InvalidUsernameOrPassword, + InvalidTitleId, + InvalidEmailAddress, + EmailAddressNotAvailable, + InvalidUsername, + InvalidPassword, + UsernameNotAvailable, + InvalidSteamTicket, + AccountAlreadyLinked, + LinkedAccountAlreadyClaimed, + InvalidFacebookToken, + AccountNotLinked, + FailedByPaymentProvider, + CouponCodeNotFound, + InvalidContainerItem, + ContainerNotOwned, + KeyNotOwned, + InvalidItemIdInTable, + InvalidReceipt, + ReceiptAlreadyUsed, + ReceiptCancelled, + GameNotFound, + GameModeNotFound, + InvalidGoogleToken, + UserIsNotPartOfDeveloper, + InvalidTitleForDeveloper, + TitleNameConflicts, + UserisNotValid, + ValueAlreadyExists, + BuildNotFound, + PlayerNotInGame, + InvalidTicket, + InvalidDeveloper, + InvalidOrderInfo, + RegistrationIncomplete, + InvalidPlatform, + UnknownError, + SteamApplicationNotOwned, + WrongSteamAccount, + TitleNotActivated, + RegistrationSessionNotFound, + NoSuchMod, + FileNotFound, + DuplicateEmail, + ItemNotFound, + ItemNotOwned, + ItemNotRecycleable, + ItemNotAffordable, + InvalidVirtualCurrency, + WrongVirtualCurrency, + WrongPrice, + NonPositiveValue, + InvalidRegion, + RegionAtCapacity, + ServerFailedToStart, + NameNotAvailable, + InsufficientFunds, + InvalidDeviceID, + InvalidPushNotificationToken, + NoRemainingUses, + InvalidPaymentProvider, + PurchaseInitializationFailure, + DuplicateUsername, + InvalidBuyerInfo, + NoGameModeParamsSet, + BodyTooLarge, + ReservedWordInBody, + InvalidTypeInBody, + InvalidRequest, + ReservedEventName, + InvalidUserStatistics, + NotAuthenticated, + StreamAlreadyExists, + ErrorCreatingStream, + StreamNotFound, + InvalidAccount, + PurchaseDoesNotExist, + InvalidPurchaseTransactionStatus, + APINotEnabledForGameClientAccess, + NoPushNotificationARNForTitle, + BuildAlreadyExists, + BuildPackageDoesNotExist, + CustomAnalyticsEventsNotEnabledForTitle, + InvalidSharedGroupId, + NotAuthorized, + MissingTitleGoogleProperties, + InvalidItemProperties, + InvalidPSNAuthCode, + InvalidItemId, + PushNotEnabledForAccount, + PushServiceError, + ReceiptDoesNotContainInAppItems, + ReceiptContainsMultipleInAppItems, + InvalidBundleID, + JavascriptException, + InvalidSessionTicket, + UnableToConnectToDatabase, + InternalServerError, + InvalidReportDate, + ReportNotAvailable, + DatabaseThroughputExceeded, + InvalidGameTicket, + ExpiredGameTicket, + GameTicketDoesNotMatchLobby, + LinkedDeviceAlreadyClaimed, + DeviceAlreadyLinked, + DeviceNotLinked, + PartialFailure, + PublisherNotSet, + ServiceUnavailable, + VersionNotFound, + RevisionNotFound, + InvalidPublisherId, + DownstreamServiceUnavailable, + APINotIncludedInTitleUsageTier, + DAULimitExceeded, + APIRequestLimitExceeded, + InvalidAPIEndpoint, + BuildNotAvailable, + ConcurrentEditError, + ContentNotFound, + CharacterNotFound, + CloudScriptNotFound, + ContentQuotaExceeded, + InvalidCharacterStatistics, + PhotonNotEnabledForTitle, + PhotonApplicationNotFound, + PhotonApplicationNotAssociatedWithTitle, + InvalidEmailOrPassword, + FacebookAPIError, + InvalidContentType, + KeyLengthExceeded, + DataLengthExceeded, + TooManyKeys, + FreeTierCannotHaveVirtualCurrency, + MissingAmazonSharedKey, + AmazonValidationError, + InvalidPSNIssuerId, + PSNInaccessible, + ExpiredAuthToken, + FailedToGetEntitlements, + FailedToConsumeEntitlement, + TradeAcceptingUserNotAllowed, + TradeInventoryItemIsAssignedToCharacter, + TradeInventoryItemIsBundle, + TradeStatusNotValidForCancelling, + TradeStatusNotValidForAccepting, + TradeDoesNotExist, + TradeCancelled, + TradeAlreadyFilled, + TradeWaitForStatusTimeout, + TradeInventoryItemExpired, + TradeMissingOfferedAndAcceptedItems, + TradeAcceptedItemIsBundle, + TradeAcceptedItemIsStackable, + TradeInventoryItemInvalidStatus, + TradeAcceptedCatalogItemInvalid, + TradeAllowedUsersInvalid, + TradeInventoryItemDoesNotExist, + TradeInventoryItemIsConsumed, + TradeInventoryItemIsStackable, + TradeAcceptedItemsMismatch, + InvalidKongregateToken, + FeatureNotConfiguredForTitle, + NoMatchingCatalogItemForReceipt, + InvalidCurrencyCode, + NoRealMoneyPriceForCatalogItem, + TradeInventoryItemIsNotTradable, + TradeAcceptedCatalogItemIsNotTradable, + UsersAlreadyFriends, + LinkedIdentifierAlreadyClaimed, + CustomIdNotLinked, + TotalDataSizeExceeded, + DeleteKeyConflict, + InvalidXboxLiveToken, + ExpiredXboxLiveToken, + ResettableStatisticVersionRequired, + NotAuthorizedByTitle, + NoPartnerEnabled, + InvalidPartnerResponse, + APINotEnabledForGameServerAccess, + StatisticNotFound, + StatisticNameConflict, + StatisticVersionClosedForWrites, + StatisticVersionInvalid, + APIClientRequestRateLimitExceeded, + InvalidJSONContent, + InvalidDropTable, + StatisticVersionAlreadyIncrementedForScheduledInterval, + StatisticCountLimitExceeded, + StatisticVersionIncrementRateExceeded, + ContainerKeyInvalid, + CloudScriptExecutionTimeLimitExceeded, + NoWritePermissionsForEvent, + CloudScriptFunctionArgumentSizeExceeded, + CloudScriptAPIRequestCountExceeded, + CloudScriptAPIRequestError, + CloudScriptHTTPRequestError, + InsufficientGuildRole, + GuildNotFound, + OverLimit, + EventNotFound, + InvalidEventField, + InvalidEventName, + CatalogNotConfigured, + OperationNotSupportedForPlatform, + SegmentNotFound, + StoreNotFound, + InvalidStatisticName, + TitleNotQualifiedForLimit, + InvalidServiceLimitLevel, + ServiceLimitLevelInTransition, + CouponAlreadyRedeemed, + GameServerBuildSizeLimitExceeded, + GameServerBuildCountLimitExceeded, + VirtualCurrencyCountLimitExceeded, + VirtualCurrencyCodeExists, + TitleNewsItemCountLimitExceeded, + InvalidTwitchToken, + TwitchResponseError, + ProfaneDisplayName, + UserAlreadyAdded, + InvalidVirtualCurrencyCode, + VirtualCurrencyCannotBeDeleted, + IdentifierAlreadyClaimed, + IdentifierNotLinked, + InvalidContinuationToken, + ExpiredContinuationToken, + InvalidSegment, + InvalidSessionId, + SessionLogNotFound, + InvalidSearchTerm, + TwoFactorAuthenticationTokenRequired, + GameServerHostCountLimitExceeded, + PlayerTagCountLimitExceeded, + RequestAlreadyRunning, + ActionGroupNotFound, + MaximumSegmentBulkActionJobsRunning, + NoActionsOnPlayersInSegmentJob, + DuplicateStatisticName, + ScheduledTaskNameConflict, + ScheduledTaskCreateConflict, + InvalidScheduledTaskName, + InvalidTaskSchedule, + SteamNotEnabledForTitle, + LimitNotAnUpgradeOption, + NoSecretKeyEnabledForCloudScript, + TaskNotFound, + TaskInstanceNotFound, + InvalidIdentityProviderId, + MisconfiguredIdentityProvider, + InvalidScheduledTaskType, + BillingInformationRequired, + LimitedEditionItemUnavailable, + InvalidAdPlacementAndReward, + AllAdPlacementViewsAlreadyConsumed, + GoogleOAuthNotConfiguredForTitle, + GoogleOAuthError, + UserNotFriend, + InvalidSignature, + InvalidPublicKey, + GoogleOAuthNoIdTokenIncludedInResponse, + StatisticUpdateInProgress, + LeaderboardVersionNotAvailable, + StatisticAlreadyHasPrizeTable, + PrizeTableHasOverlappingRanks, + PrizeTableHasMissingRanks, + PrizeTableRankStartsAtZero, + InvalidStatistic, + ExpressionParseFailure, + ExpressionInvokeFailure, + ExpressionTooLong, + DataUpdateRateExceeded, + RestrictedEmailDomain, + EncryptionKeyDisabled, + EncryptionKeyMissing, + EncryptionKeyBroken, + NoSharedSecretKeyConfigured, + SecretKeyNotFound, + PlayerSecretAlreadyConfigured, + APIRequestsDisabledForTitle, + InvalidSharedSecretKey, + PrizeTableHasNoRanks, + ProfileDoesNotExist, + ContentS3OriginBucketNotConfigured, + InvalidEnvironmentForReceipt, + EncryptedRequestNotAllowed, + SignedRequestNotAllowed, + RequestViewConstraintParamsNotAllowed, + BadPartnerConfiguration, + XboxBPCertificateFailure, + XboxXASSExchangeFailure, + InvalidEntityId, + StatisticValueAggregationOverflow, + EmailMessageFromAddressIsMissing, + EmailMessageToAddressIsMissing, + SmtpServerAuthenticationError, + SmtpServerLimitExceeded, + SmtpServerInsufficientStorage, + SmtpServerCommunicationError, + SmtpServerGeneralFailure, + EmailClientTimeout, + EmailClientCanceledTask, + EmailTemplateMissing, + InvalidHostForTitleId, + EmailConfirmationTokenDoesNotExist, + EmailConfirmationTokenExpired, + AccountDeleted, + PlayerSecretNotConfigured, + InvalidSignatureTime, + NoContactEmailAddressFound, + InvalidAuthToken, + AuthTokenDoesNotExist, + AuthTokenExpired, + AuthTokenAlreadyUsedToResetPassword, + MembershipNameTooLong, + MembershipNotFound, + GoogleServiceAccountInvalid, + GoogleServiceAccountParseFailure, + EntityTokenMissing, + EntityTokenInvalid, + EntityTokenExpired, + EntityTokenRevoked, + InvalidProductForSubscription, + XboxInaccessible, + SubscriptionAlreadyTaken, + SmtpAddonNotEnabled, + APIConcurrentRequestLimitExceeded, + XboxRejectedXSTSExchangeRequest, + VariableNotDefined, + TemplateVersionNotDefined, + FileTooLarge, + TitleDeleted, + TitleContainsUserAccounts, + TitleDeletionPlayerCleanupFailure, + EntityFileOperationPending, + NoEntityFileOperationPending, + EntityProfileVersionMismatch, + TemplateVersionTooOld, + MembershipDefinitionInUse, + PaymentPageNotConfigured, + FailedLoginAttemptRateLimitExceeded, + EntityBlockedByGroup, + RoleDoesNotExist, + EntityIsAlreadyMember, + DuplicateRoleId, + GroupInvitationNotFound, + GroupApplicationNotFound, + OutstandingInvitationAcceptedInstead, + OutstandingApplicationAcceptedInstead, + RoleIsGroupDefaultMember, + RoleIsGroupAdmin, + RoleNameNotAvailable, + GroupNameNotAvailable, + EmailReportAlreadySent, + EmailReportRecipientBlacklisted, + EventNamespaceNotAllowed, + EventEntityNotAllowed, + InvalidEntityType, + NullTokenResultFromAad, + InvalidTokenResultFromAad, + NoValidCertificateForAad, + InvalidCertificateForAad, + DuplicateDropTableId, + MultiplayerServerError, + MultiplayerServerTooManyRequests, + MultiplayerServerNoContent, + MultiplayerServerBadRequest, + MultiplayerServerUnauthorized, + MultiplayerServerForbidden, + MultiplayerServerNotFound, + MultiplayerServerConflict, + MultiplayerServerInternalServerError, + MultiplayerServerUnavailable, + ExplicitContentDetected, + PIIContentDetected, + InvalidScheduledTaskParameter, + PerEntityEventRateLimitExceeded, + TitleDefaultLanguageNotSet, + EmailTemplateMissingDefaultVersion, + FacebookInstantGamesIdNotLinked, + InvalidFacebookInstantGamesSignature, + FacebookInstantGamesAuthNotConfiguredForTitle, + EntityProfileConstraintValidationFailed, + TelemetryIngestionKeyPending, + TelemetryIngestionKeyNotFound, + StatisticChildNameInvalid, + DataIntegrityError, + VirtualCurrencyCannotBeSetToOlderVersion, + VirtualCurrencyMustBeWithinIntegerRange, + EmailTemplateInvalidSyntax, + EmailTemplateMissingCallback, + PushNotificationTemplateInvalidPayload, + InvalidLocalizedPushNotificationLanguage, + MissingLocalizedPushNotificationMessage, + PushNotificationTemplateMissingPlatformPayload, + PushNotificationTemplatePayloadContainsInvalidJson, + PushNotificationTemplateContainsInvalidIosPayload, + PushNotificationTemplateContainsInvalidAndroidPayload, + PushNotificationTemplateIosPayloadMissingNotificationBody, + PushNotificationTemplateAndroidPayloadMissingNotificationBody, + PushNotificationTemplateNotFound, + PushNotificationTemplateMissingDefaultVersion, + PushNotificationTemplateInvalidSyntax, + PushNotificationTemplateNoCustomPayloadForV1, + NoLeaderboardForStatistic, + TitleNewsMissingDefaultLanguage, + TitleNewsNotFound, + TitleNewsDuplicateLanguage, + TitleNewsMissingTitleOrBody, + TitleNewsInvalidLanguage, + EmailRecipientBlacklisted, + InvalidGameCenterAuthRequest, + GameCenterAuthenticationFailed, + CannotEnablePartiesForTitle, + PartyError, + PartyRequests, + PartyNoContent, + PartyBadRequest, + PartyUnauthorized, + PartyForbidden, + PartyNotFound, + PartyConflict, + PartyInternalServerError, + PartyUnavailable, + PartyTooManyRequests, + PushNotificationTemplateMissingName, + CannotEnableMultiplayerServersForTitle, + WriteAttemptedDuringExport, + MultiplayerServerTitleQuotaCoresExceeded, + AutomationRuleNotFound, + EntityAPIKeyLimitExceeded, + EntityAPIKeyNotFound, + EntityAPIKeyOrSecretInvalid, + EconomyServiceUnavailable, + EconomyServiceInternalError, + QueryRateLimitExceeded, + EntityAPIKeyCreationDisabledForEntity, + ForbiddenByEntityPolicy, + UpdateInventoryRateLimitExceeded, + StudioCreationRateLimited, + StudioCreationInProgress, + DuplicateStudioName, + StudioNotFound, + StudioDeleted, + StudioDeactivated, + StudioActivated, + TitleCreationRateLimited, + TitleCreationInProgress, + DuplicateTitleName, + TitleActivationRateLimited, + TitleActivationInProgress, + TitleDeactivated, + TitleActivated, + CloudScriptAzureFunctionsExecutionTimeLimitExceeded, + CloudScriptAzureFunctionsArgumentSizeExceeded, + CloudScriptAzureFunctionsReturnSizeExceeded, + CloudScriptAzureFunctionsHTTPRequestError, + VirtualCurrencyBetaGetError, + VirtualCurrencyBetaCreateError, + VirtualCurrencyBetaInitialDepositSaveError, + VirtualCurrencyBetaSaveError, + VirtualCurrencyBetaDeleteError, + VirtualCurrencyBetaRestoreError, + VirtualCurrencyBetaSaveConflict, + VirtualCurrencyBetaUpdateError, + InsightsManagementDatabaseNotFound, + InsightsManagementOperationNotFound, + InsightsManagementErrorPendingOperationExists, + InsightsManagementSetPerformanceLevelInvalidParameter, + InsightsManagementSetStorageRetentionInvalidParameter, + InsightsManagementGetStorageUsageInvalidParameter, + InsightsManagementGetOperationStatusInvalidParameter, + DuplicatePurchaseTransactionId, + EvaluationModePlayerCountExceeded, + GetPlayersInSegmentRateLimitExceeded, + CloudScriptFunctionNameSizeExceeded, + PaidInsightsFeaturesNotEnabled, + CloudScriptAzureFunctionsQueueRequestError, + EvaluationModeTitleCountExceeded, + InsightsManagementTitleNotInFlight, + LimitNotFound, + LimitNotAvailableViaAPI, + InsightsManagementSetStorageRetentionBelowMinimum, + InsightsManagementSetStorageRetentionAboveMaximum, + AppleNotEnabledForTitle, + InsightsManagementNewActiveEventExportLimitInvalid, + InsightsManagementSetPerformanceRateLimited, + PartyRequestsThrottledFromRateLimiter, + XboxServiceTooManyRequests, + NintendoSwitchNotEnabledForTitle, + RequestMultiplayerServersThrottledFromRateLimiter, + TitleDataOverrideNotFound, + DuplicateKeys, + WasNotCreatedWithCloudRoot, + LegacyMultiplayerServersDeprecated, + VirtualCurrencyCurrentlyUnavailable, + SteamUserNotFound, + ElasticSearchOperationFailed, + NotImplemented, + PublisherNotFound, + PublisherDeleted, + ApiDisabledForMigration, + ResourceNameUpdateNotAllowed, + ApiNotEnabledForTitle, + DuplicateTitleNameForPublisher, + AzureTitleCreationInProgress, + TitleConstraintsPublisherDeletion, + InvalidPlayerAccountPoolId, + PlayerAccountPoolNotFound, + PlayerAccountPoolDeleted, + TitleCleanupInProgress, + AzureResourceConcurrentOperationInProgress, + TitlePublisherUpdateNotAllowed, + AzureResourceManagerNotSupportedInStamp, + ApiNotIncludedInAzurePlayFabFeatureSet, + GoogleServiceAccountFailedAuth, + GoogleAPIServiceUnavailable, + GoogleAPIServiceUnknownError, + NoValidIdentityForAad, + PlayerIdentityLinkNotFound, + PhotonApplicationIdAlreadyInUse, + CloudScriptUnableToDeleteProductionRevision, + CustomIdNotFound, + AutomationInvalidInput, + AutomationInvalidRuleName, + AutomationRuleAlreadyExists, + AutomationRuleLimitExceeded, + InvalidGooglePlayGamesServerAuthCode, + PlayStreamConnectionFailed, + InvalidEventContents, + InsightsV1Deprecated, + AnalysisSubscriptionNotFound, + AnalysisSubscriptionFailed, + AnalysisSubscriptionFoundAlready, + AnalysisSubscriptionManagementInvalidInput, + InvalidGameCenterId, + InvalidNintendoSwitchAccountId, + EntityAPIKeysNotSupported, + IpAddressBanned, + EntityLineageBanned, + NamespaceMismatch, + InvalidServiceConfiguration, + InvalidNamespaceMismatch, + MatchmakingEntityInvalid, + MatchmakingPlayerAttributesInvalid, + MatchmakingQueueNotFound, + MatchmakingMatchNotFound, + MatchmakingTicketNotFound, + MatchmakingAlreadyJoinedTicket, + MatchmakingTicketAlreadyCompleted, + MatchmakingQueueConfigInvalid, + MatchmakingMemberProfileInvalid, + NintendoSwitchDeviceIdNotLinked, + MatchmakingNotEnabled, + MatchmakingPlayerAttributesTooLarge, + MatchmakingNumberOfPlayersInTicketTooLarge, + MatchmakingAttributeInvalid, + MatchmakingPlayerHasNotJoinedTicket, + MatchmakingRateLimitExceeded, + MatchmakingTicketMembershipLimitExceeded, + MatchmakingUnauthorized, + MatchmakingQueueLimitExceeded, + MatchmakingRequestTypeMismatch, + MatchmakingBadRequest, + PubSubFeatureNotEnabledForTitle, + PubSubTooManyRequests, + PubSubConnectionNotFoundForEntity, + PubSubConnectionHandleInvalid, + PubSubSubscriptionLimitExceeded, + TitleConfigNotFound, + TitleConfigUpdateConflict, + TitleConfigSerializationError, + CatalogApiNotImplemented, + CatalogEntityInvalid, + CatalogTitleIdMissing, + CatalogPlayerIdMissing, + CatalogClientIdentityInvalid, + CatalogOneOrMoreFilesInvalid, + CatalogItemMetadataInvalid, + CatalogItemIdInvalid, + CatalogSearchParameterInvalid, + CatalogFeatureDisabled, + CatalogConfigInvalid, + CatalogItemTypeInvalid, + CatalogBadRequest, + CatalogTooManyRequests, + ExportInvalidStatusUpdate, + ExportInvalidPrefix, + ExportBlobContainerDoesNotExist, + ExportNotFound, + ExportCouldNotUpdate, + ExportInvalidStorageType, + ExportAmazonBucketDoesNotExist, + ExportInvalidBlobStorage, + ExportKustoException, + ExportKustoConnectionFailed, + ExportUnknownError, + ExportCantEditPendingExport, + ExportLimitExports, + ExportLimitEvents, + ExportInvalidPartitionStatusModification, + ExportCouldNotCreate, + ExportNoBackingDatabaseFound, + ExportCouldNotDelete, + ExportCannotDetermineEventQuery, + ExportInvalidQuerySchemaModification, + ExportQuerySchemaMissingRequiredColumns, + ExportCannotParseQuery, + ExportControlCommandsNotAllowed, + ExportQueryMissingTableReference, + ExportInsightsV1Deprecated, + ExplorerBasicInvalidQueryName, + ExplorerBasicInvalidQueryDescription, + ExplorerBasicInvalidQueryConditions, + ExplorerBasicInvalidQueryStartDate, + ExplorerBasicInvalidQueryEndDate, + ExplorerBasicInvalidQueryGroupBy, + ExplorerBasicInvalidQueryAggregateType, + ExplorerBasicInvalidQueryAggregateProperty, + ExplorerBasicLoadQueriesError, + ExplorerBasicLoadQueryError, + ExplorerBasicCreateQueryError, + ExplorerBasicDeleteQueryError, + ExplorerBasicUpdateQueryError, + ExplorerBasicSavedQueriesLimit, + ExplorerBasicSavedQueryNotFound, + TenantShardMapperShardNotFound, + TitleNotEnabledForParty, + PartyVersionNotFound, + MultiplayerServerBuildReferencedByMatchmakingQueue, + MultiplayerServerBuildReferencedByBuildAlias, + MultiplayerServerBuildAliasReferencedByMatchmakingQueue, + ExperimentationExperimentStopped, + ExperimentationExperimentRunning, + ExperimentationExperimentNotFound, + ExperimentationExperimentNeverStarted, + ExperimentationExperimentDeleted, + ExperimentationClientTimeout, + ExperimentationInvalidVariantConfiguration, + ExperimentationInvalidVariableConfiguration, + ExperimentInvalidId, + ExperimentationNoScorecard, + ExperimentationTreatmentAssignmentFailed, + ExperimentationTreatmentAssignmentDisabled, + ExperimentationInvalidDuration, + ExperimentationMaxExperimentsReached, + ExperimentationExperimentSchedulingInProgress, + ExperimentationInvalidEndDate, + ExperimentationInvalidStartDate, + ExperimentationMaxDurationExceeded, + ExperimentationExclusionGroupNotFound, + ExperimentationExclusionGroupInsufficientCapacity, + ExperimentationExclusionGroupCannotDelete, + ExperimentationExclusionGroupInvalidTrafficAllocation, + ExperimentationExclusionGroupInvalidName, + MaxActionDepthExceeded, + TitleNotOnUpdatedPricingPlan, + SegmentManagementTitleNotInFlight, + SegmentManagementNoExpressionTree, + SegmentManagementTriggerActionCountOverLimit, + SegmentManagementSegmentCountOverLimit, + SegmentManagementInvalidSegmentId, + SegmentManagementInvalidInput, + SegmentManagementInvalidSegmentName, + DeleteSegmentRateLimitExceeded, + CreateSegmentRateLimitExceeded, + UpdateSegmentRateLimitExceeded, + GetSegmentsRateLimitExceeded, + AsyncExportNotInFlight, + AsyncExportNotFound, + AsyncExportRateLimitExceeded, + AnalyticsSegmentCountOverLimit, + SnapshotNotFound, + InventoryApiNotImplemented, + LobbyDoesNotExist, + LobbyRateLimitExceeded, + LobbyPlayerAlreadyJoined, + LobbyNotJoinable, + LobbyMemberCannotRejoin, + LobbyCurrentPlayersMoreThanMaxPlayers, + LobbyPlayerNotPresent, + LobbyBadRequest, + LobbyPlayerMaxLobbyLimitExceeded, + LobbyNewOwnerMustBeConnected, + LobbyCurrentOwnerStillConnected, + LobbyMemberIsNotOwner, + EventSamplingInvalidRatio, + EventSamplingInvalidEventNamespace, + EventSamplingInvalidEventName, + EventSamplingRatioNotFound, + TelemetryKeyNotFound, + TelemetryKeyInvalidName, + TelemetryKeyAlreadyExists, + TelemetryKeyInvalid, + TelemetryKeyCountOverLimit, + TelemetryKeyDeactivated, + TelemetryKeyLongInsightsRetentionNotAllowed, + EventSinkConnectionInvalid, + EventSinkConnectionUnauthorized, + EventSinkRegionInvalid, + EventSinkLimitExceeded, + EventSinkSasTokenInvalid, + EventSinkNotFound, + EventSinkNameInvalid, + EventSinkSasTokenPermissionInvalid, + EventSinkSecretInvalid, + EventSinkTenantNotFound, + EventSinkAadNotFound, + EventSinkDatabaseNotFound, + OperationCanceled, + InvalidDisplayNameRandomSuffixLength, + AllowNonUniquePlayerDisplayNamesDisableNotAllowed, + PartitionedEventInvalid, + PartitionedEventCountOverLimit, + PlayerCustomPropertiesPropertyNameTooLong, + PlayerCustomPropertiesPropertyNameIsInvalid, + PlayerCustomPropertiesStringPropertyValueTooLong, + PlayerCustomPropertiesValueIsInvalidType, + PlayerCustomPropertiesVersionMismatch, + PlayerCustomPropertiesPropertyCountTooHigh, + PlayerCustomPropertiesDuplicatePropertyName, + PlayerCustomPropertiesPropertyDoesNotExist + } + + [Serializable] + public class GetActionsOnPlayersInSegmentTaskInstanceResult : PlayFabResultCommon + { + /// + /// Parameter of this task instance + /// + public ActionsOnPlayersInSegmentTaskParameter Parameter; + /// + /// Status summary of the actions-on-players-in-segment task instance + /// + public ActionsOnPlayersInSegmentTaskSummary Summary; + } + + /// + /// Request has no paramaters. + /// + [Serializable] + public class GetAllSegmentsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetAllSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments for this title. + /// + public List Segments; + } + + [Serializable] + public class GetCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being requested. If null, uses the default catalog. + /// + public string CatalogVersion; + } + + [Serializable] + public class GetCatalogItemsResult : PlayFabResultCommon + { + /// + /// Array of items which can be purchased. + /// + public List Catalog; + } + + [Serializable] + public class GetCloudScriptRevisionRequest : PlayFabRequestCommon + { + /// + /// Revision number. If left null, defaults to the latest revision + /// + public int? Revision; + /// + /// Version number. If left null, defaults to the latest version + /// + public int? Version; + } + + [Serializable] + public class GetCloudScriptRevisionResult : PlayFabResultCommon + { + /// + /// Time this revision was created + /// + public DateTime CreatedAt; + /// + /// List of Cloud Script files in this revision. + /// + public List Files; + /// + /// True if this is the currently published revision + /// + public bool IsPublished; + /// + /// Revision number. + /// + public int Revision; + /// + /// Version number. + /// + public int Version; + } + + [Serializable] + public class GetCloudScriptTaskInstanceResult : PlayFabResultCommon + { + /// + /// Parameter of this task instance + /// + public CloudScriptTaskParameter Parameter; + /// + /// Status summary of the CloudScript task instance + /// + public CloudScriptTaskSummary Summary; + } + + [Serializable] + public class GetCloudScriptVersionsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetCloudScriptVersionsResult : PlayFabResultCommon + { + /// + /// List of versions + /// + public List Versions; + } + + [Serializable] + public class GetContentListRequest : PlayFabRequestCommon + { + /// + /// Limits the response to keys that begin with the specified prefix. You can use prefixes to list contents under a folder, + /// or for a specified version, etc. + /// + public string Prefix; + } + + [Serializable] + public class GetContentListResult : PlayFabResultCommon + { + /// + /// List of content items. + /// + public List Contents; + /// + /// Number of content items returned. We currently have a maximum of 1000 items limit. + /// + public int ItemCount; + /// + /// The total size of listed contents in bytes. + /// + public uint TotalSize; + } + + [Serializable] + public class GetContentUploadUrlRequest : PlayFabRequestCommon + { + /// + /// A standard MIME type describing the format of the contents. The same MIME type has to be set in the header when + /// uploading the content. If not specified, the MIME type is 'binary/octet-stream' by default. + /// + public string ContentType; + /// + /// Key of the content item to upload, usually formatted as a path, e.g. images/a.png + /// + public string Key; + } + + [Serializable] + public class GetContentUploadUrlResult : PlayFabResultCommon + { + /// + /// URL for uploading content via HTTP PUT method. The URL requires the 'x-ms-blob-type' header to have the value + /// 'BlockBlob'. The URL will expire in approximately one hour. + /// + public string URL; + } + + /// + /// Gets the download URL for the requested report data (in CSV form). The reports available through this API call are those + /// available in the Game Manager, in the Analytics->Reports tab. + /// + [Serializable] + public class GetDataReportRequest : PlayFabRequestCommon + { + /// + /// Reporting year (UTC) + /// + public int Day; + /// + /// Reporting month (UTC) + /// + public int Month; + /// + /// Report name + /// + public string ReportName; + /// + /// Reporting year (UTC) + /// + public int Year; + } + + [Serializable] + public class GetDataReportResult : PlayFabResultCommon + { + /// + /// The URL where the requested report can be downloaded. This can be any PlayFab generated reports. The full list of + /// reports can be found at: https://docs.microsoft.com/en-us/gaming/playfab/features/analytics/reports/quickstart. + /// + public string DownloadUrl; + } + + [Serializable] + public class GetMatchmakerGameInfoRequest : PlayFabRequestCommon + { + /// + /// unique identifier of the lobby for which info is being requested + /// + public string LobbyId; + } + + [Serializable] + public class GetMatchmakerGameInfoResult : PlayFabResultCommon + { + /// + /// version identifier of the game server executable binary being run + /// + public string BuildVersion; + /// + /// time when Game Server Instance is currently scheduled to end + /// + public DateTime? EndTime; + /// + /// unique identifier of the lobby + /// + public string LobbyId; + /// + /// game mode for this Game Server Instance + /// + public string Mode; + /// + /// array of unique PlayFab identifiers for users currently connected to this Game Server Instance + /// + public List Players; + /// + /// region in which the Game Server Instance is running + /// + public Region? Region; + /// + /// IPV4 address of the server + /// + public string ServerIPV4Address; + /// + /// IPV6 address of the server + /// + public string ServerIPV6Address; + /// + /// communication port for this Game Server Instance + /// + public uint ServerPort; + /// + /// Public DNS name (if any) of the server + /// + public string ServerPublicDNSName; + /// + /// time when the Game Server Instance was created + /// + public DateTime StartTime; + /// + /// unique identifier of the Game Server Instance for this lobby + /// + public string TitleId; + } + + /// + /// These details are used by the PlayFab matchmaking service to determine if an existing Game Server Instance has room for + /// additional users, and by the PlayFab game server management service to determine when a new Game Server Host should be + /// created in order to prevent excess load on existing Hosts. + /// + [Serializable] + public class GetMatchmakerGameModesRequest : PlayFabRequestCommon + { + /// + /// previously uploaded build version for which game modes are being requested + /// + public string BuildVersion; + } + + [Serializable] + public class GetMatchmakerGameModesResult : PlayFabResultCommon + { + /// + /// array of game modes available for the specified build + /// + public List GameModes; + } + + /// + /// Useful for identifying titles of which the player's data will be deleted by DeleteMasterPlayer. + /// + [Serializable] + public class GetPlayedTitleListRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayedTitleListResult : PlayFabResultCommon + { + /// + /// List of titles the player has played + /// + public List TitleIds; + } + + /// + /// Gets a player ID from an auth token. The token expires after 30 minutes and cannot be used to look up a player when + /// expired. + /// + [Serializable] + public class GetPlayerIdFromAuthTokenRequest : PlayFabRequestCommon + { + /// + /// The auth token of the player requesting the password reset. + /// + public string Token; + /// + /// The type of auth token of the player requesting the password reset. + /// + public AuthTokenType TokenType; + } + + [Serializable] + public class GetPlayerIdFromAuthTokenResult : PlayFabResultCommon + { + /// + /// The player ID from the token passed in + /// + public string PlayFabId; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetPlayerProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + } + + [Serializable] + public class GetPlayerProfileResult : PlayFabResultCommon + { + /// + /// The profile of the player. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + } + + [Serializable] + public class GetPlayerSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments the requested player currently belongs to. + /// + public List Segments; + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class GetPlayerSharedSecretsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetPlayerSharedSecretsResult : PlayFabResultCommon + { + /// + /// The player shared secret to use when calling Client/GetTitlePublicKey + /// + public List SharedSecrets; + } + + /// + /// Request must contain the ExportId + /// + [Serializable] + public class GetPlayersInSegmentExportRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the export for the requested Segment. + /// + public string ExportId; + } + + [Serializable] + public class GetPlayersInSegmentExportResponse : PlayFabResultCommon + { + /// + /// Url from which the index file can be downloaded. + /// + public string IndexUrl; + /// + /// Shows the current status of the export + /// + public string State; + } + + /// + /// Initial request must contain at least a Segment ID. Subsequent requests must contain the Segment ID as well as the + /// Continuation Token. Failure to send the Continuation Token will result in a new player segment list being generated. + /// Each time the Continuation Token is passed in the length of the Total Seconds to Live is refreshed. If too much time + /// passes between requests to the point that a subsequent request is past the Total Seconds to Live an error will be + /// returned and paging will be terminated. This API is resource intensive and should not be used in scenarios which might + /// generate high request volumes. Only one request to this API at a time should be made per title. Concurrent requests to + /// the API may be rejected with the APIConcurrentRequestLimitExceeded error. + /// + [Serializable] + public class GetPlayersInSegmentRequest : PlayFabRequestCommon + { + /// + /// Continuation token if retrieving subsequent pages of results. + /// + public string ContinuationToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If set to true, the profiles are loaded asynchronously and the response will include a continuation token and + /// approximate profile count until the first batch of profiles is loaded. Use this parameter to help avoid network + /// timeouts. + /// + public bool? GetProfilesAsync; + /// + /// Maximum is 10,000. The value 0 will prevent loading any profiles and return only the count of profiles matching this + /// segment. + /// + public uint? MaxBatchSize; + /// + /// Number of seconds to keep the continuation token active. After token expiration it is not possible to continue paging + /// results. Default is 300 (5 minutes). Maximum is 5,400 (90 minutes). + /// + public uint? SecondsToLive; + /// + /// Unique identifier for this segment. + /// + public string SegmentId; + } + + [Serializable] + public class GetPlayersInSegmentResult : PlayFabResultCommon + { + /// + /// Continuation token to use to retrieve subsequent pages of results. If token returns null there are no more results. + /// + public string ContinuationToken; + /// + /// Array of player profiles in this segment. + /// + public List PlayerProfiles; + /// + /// Count of profiles matching this segment. + /// + public int ProfilesInSegment; + } + + [Serializable] + public class GetPlayersSegmentsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerStatisticDefinitionsRequest : PlayFabRequestCommon + { + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The ResetInterval defines + /// the period of time at which the leaderboard for the statistic will automatically reset. Upon reset, the statistic + /// updates to a new version with no values (effectively removing all players from the leaderboard). The previous version's + /// statistic values are also archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via + /// a call to CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on + /// a schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). The AggregationMethod defines what action is taken when a new statistic value + /// is submitted - always update with the new value (Last), use the highest of the old and new values (Max), use the + /// smallest (Min), or add them together (Sum). + /// + [Serializable] + public class GetPlayerStatisticDefinitionsResult : PlayFabResultCommon + { + /// + /// the player statistic definitions for the title + /// + public List Statistics; + } + + [Serializable] + public class GetPlayerStatisticVersionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The information returned + /// in the results defines the state of a specific version of a statistic, including when it was or will become the + /// currently active version, when it will (or did) become a previous version, and its archival state if it is no longer the + /// active version. For a statistic which has been reset, once the archival status is Complete, the full set of statistics + /// for all players in the leaderboard for that version may be retrieved via the ArchiveDownloadUrl. Statistics which have + /// not been reset (incremented/versioned) will only have a single version which is not scheduled to reset. + /// + [Serializable] + public class GetPlayerStatisticVersionsResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public List StatisticVersions; + } + + /// + /// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace is not + /// provided, the result is a list of all canonical tags. TagName can be used for segmentation and Namespace is limited to + /// 128 characters. + /// + [Serializable] + public class GetPlayerTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional namespace to filter results by + /// + public string Namespace; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerTagsResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Canonical tags (including namespace and tag's name) for the requested user + /// + public List Tags; + } + + /// + /// Views the requested policy. Today, the only supported policy is 'ApiPolicy'. + /// + [Serializable] + public class GetPolicyRequest : PlayFabRequestCommon + { + /// + /// The name of the policy to read. Only supported name is 'ApiPolicy'. + /// + public string PolicyName; + } + + [Serializable] + public class GetPolicyResponse : PlayFabResultCommon + { + /// + /// The name of the policy read. + /// + public string PolicyName; + /// + /// Policy version. + /// + public int PolicyVersion; + /// + /// The statements in the requested policy. + /// + public List Statements; + } + + /// + /// This API is designed to return publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. For more information email helloplayfab@microsoft.com. This AdminAPI call for + /// getting title data guarantees no delay in between update and retrieval of newly set data. + /// + [Serializable] + public class GetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// array of keys to get back data from the Publisher data blob, set by the admin tools + /// + public List Keys; + } + + [Serializable] + public class GetPublisherDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetRandomResultTablesRequest : PlayFabRequestCommon + { + /// + /// catalog version to fetch tables from. Use default catalog version if null + /// + public string CatalogVersion; + } + + [Serializable] + public class GetRandomResultTablesResult : PlayFabResultCommon + { + /// + /// array of random result tables currently available + /// + public Dictionary Tables; + } + + [Serializable] + public class GetSegmentResult : PlayFabBaseModel + { + /// + /// Identifier of the segments AB Test, if it is attached to one. + /// + public string ABTestParent; + /// + /// Unique identifier for this segment. + /// + public string Id; + /// + /// Segment name. + /// + public string Name; + } + + /// + /// Given input segment ids, return list of segments. + /// + [Serializable] + public class GetSegmentsRequest : PlayFabRequestCommon + { + /// + /// Segment ids to filter title segments. + /// + public List SegmentIds; + } + + [Serializable] + public class GetSegmentsResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + /// + /// List of title segments. + /// + public List Segments; + } + + /// + /// A store contains an array of references to items defined in the catalog, along with the prices for the item, in both + /// real world and virtual currencies. These prices act as an override to any prices defined in the catalog. In this way, + /// the base definitions of the items may be defined in the catalog, with all associated properties, while the pricing can + /// be set for each store, as needed. This allows for subsets of goods to be defined for different purposes (in order to + /// simplify showing some, but not all catalog items to users, based upon different characteristics), along with unique + /// prices. Note that all prices defined in the catalog and store definitions for the item are considered valid, and that a + /// compromised client can be made to send a request for an item based upon any of these definitions. If no price is + /// specified in the store for an item, the price set in the catalog should be displayed to the user. + /// + [Serializable] + public class GetStoreItemsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to store items from. Use default catalog version if null + /// + public string CatalogVersion; + /// + /// Unqiue identifier for the store which is being requested. + /// + public string StoreId; + } + + [Serializable] + public class GetStoreItemsResult : PlayFabResultCommon + { + /// + /// The base catalog that this store is a part of. + /// + public string CatalogVersion; + /// + /// Additional data about the store. + /// + public StoreMarketingModel MarketingData; + /// + /// How the store was last updated (Admin or a third party). + /// + public SourceType? Source; + /// + /// Array of items which can be purchased from this store. + /// + public List Store; + /// + /// The ID of this store. + /// + public string StoreId; + } + + /// + /// The result includes detail information that's specific to a CloudScript task. Only CloudScript tasks configured as "Run + /// Cloud Script function once" will be retrieved. To get a list of task instances by task, status, or time range, use + /// GetTaskInstances. + /// + [Serializable] + public class GetTaskInstanceRequest : PlayFabRequestCommon + { + /// + /// ID of the requested task instance. + /// + public string TaskInstanceId; + } + + /// + /// Only the most recent 100 task instances are returned, ordered by start time descending. The results are generic basic + /// information for task instances. To get detail information specific to each task type, use Get*TaskInstance based on its + /// corresponding task type. + /// + [Serializable] + public class GetTaskInstancesRequest : PlayFabRequestCommon + { + /// + /// Optional range-from filter for task instances' StartedAt timestamp. + /// + public DateTime? StartedAtRangeFrom; + /// + /// Optional range-to filter for task instances' StartedAt timestamp. + /// + public DateTime? StartedAtRangeTo; + /// + /// Optional filter for task instances that are of a specific status. + /// + public TaskInstanceStatus? StatusFilter; + /// + /// Name or ID of the task whose instances are being queried. If not specified, return all task instances that satisfy + /// conditions set by other filters. + /// + public NameIdentifier TaskIdentifier; + } + + [Serializable] + public class GetTaskInstancesResult : PlayFabResultCommon + { + /// + /// Basic status summaries of the queried task instances. Empty If no task instances meets the filter criteria. To get + /// detailed status summary, use Get*TaskInstance API according to task type (e.g. + /// GetActionsOnPlayersInSegmentTaskInstance). + /// + public List Summaries; + } + + [Serializable] + public class GetTasksRequest : PlayFabRequestCommon + { + /// + /// Provide either the task ID or the task name to get a specific task. If not specified, return all defined tasks. + /// + public NameIdentifier Identifier; + } + + [Serializable] + public class GetTasksResult : PlayFabResultCommon + { + /// + /// Result tasks. Empty if there is no task found. + /// + public List Tasks; + } + + /// + /// This API method is designed to return title specific values which can be read by the client. For example, a developer + /// could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, movement + /// speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new build. If an + /// override label is specified in the request, the overrides are applied automatically and returned with the title data. + /// Note that due to caching, there may up to a minute delay in between updating title data and a query returning the newest + /// value. + /// + [Serializable] + public class GetTitleDataRequest : PlayFabRequestCommon + { + /// + /// Specific keys to search for in the title data (leave null to get all keys) + /// + public List Keys; + /// + /// Optional field that specifies the name of an override. This value is ignored when used by the game client; otherwise, + /// the overrides are applied automatically to the title data. + /// + public string OverrideLabel; + } + + [Serializable] + public class GetTitleDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + /// + /// Get all bans for a user, including inactive and expired bans. + /// + [Serializable] + public class GetUserBansRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserBansResult : PlayFabResultCommon + { + /// + /// Information about the bans + /// + public List BanData; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetUserDataRequest : PlayFabRequestCommon + { + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserDataResult : PlayFabResultCommon + { + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + /// + /// PlayFab unique identifier of the user whose custom data is being returned. + /// + public string PlayFabId; + } + + /// + /// All items currently in the user inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. There can be a delay of up to a half a second for inventory + /// changes to be reflected in the GetUserInventory API response. + /// + [Serializable] + public class GetUserInventoryRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserInventoryResult : PlayFabResultCommon + { + /// + /// Array of inventory items belonging to the user. + /// + public List Inventory; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + /// + /// Result of granting an item to a user. Note, to retrieve additional information for an item such as Tags, Description + /// that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can be matched + /// to a catalog entry, which contains the additional information. Also note that Custom Data is only set when the User's + /// specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields such as + /// UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class GrantedItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Result of this operation. + /// + public bool Result; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class GrantItemSegmentAction : PlayFabBaseModel + { + /// + /// Item catalog id. + /// + public string CatelogId; + /// + /// Item id. + /// + public string ItemId; + /// + /// Item quantity. + /// + public uint Quantity; + } + + /// + /// This function directly adds inventory items to user inventories. As a result of this operations, the user will not be + /// charged any transaction fee, regardless of the inventory item catalog definition. Please note that the processing time + /// for inventory grants and purchases increases fractionally the more items are in the inventory, and the more items are in + /// the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToUsersRequest : PlayFabRequestCommon + { + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of items to grant and the users to whom the items are to be granted. + /// + public List ItemGrants; + } + + /// + /// Please note that the order of the items in the response may not match the order of items in the request. + /// + [Serializable] + public class GrantItemsToUsersResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + [Serializable] + public class GrantVirtualCurrencySegmentAction : PlayFabBaseModel + { + /// + /// Virtual currency amount. + /// + public int Amount; + /// + /// Virtual currency code. + /// + public string CurrencyCode; + } + + /// + /// This operation will increment the global counter for the number of these items available. This number cannot be + /// decremented, except by actual grants. + /// + [Serializable] + public class IncrementLimitedEditionItemAvailabilityRequest : PlayFabRequestCommon + { + /// + /// Amount to increase availability by. + /// + public int Amount; + /// + /// Which catalog is being updated. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The item which needs more availability. + /// + public string ItemId; + } + + [Serializable] + public class IncrementLimitedEditionItemAvailabilityResult : PlayFabResultCommon + { + } + + [Serializable] + public class IncrementPlayerStatisticSegmentAction : PlayFabBaseModel + { + /// + /// Increment value. + /// + public int IncrementValue; + /// + /// Statistic name. + /// + public string StatisticName; + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. When this call is made on + /// a given statistic, this forces a reset of that statistic. Upon reset, the statistic updates to a new version with no + /// values (effectively removing all players from the leaderboard). The previous version's statistic values are also + /// archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via a call to + /// CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on a + /// schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the now-previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). + /// + [Serializable] + public class IncrementPlayerStatisticVersionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + [Serializable] + public class IncrementPlayerStatisticVersionResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public PlayerStatisticVersion StatisticVersion; + } + + [Serializable] + public class InsightsScalingTaskParameter : PlayFabBaseModel + { + /// + /// Insights Performance Level to scale to. + /// + public int Level; + } + + [Serializable] + public class ItemGrant : PlayFabBaseModel + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Unique identifier of the catalog item to be granted to the user. + /// + public string ItemId; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class LastLoginDateSegmentFilter : PlayFabBaseModel + { + /// + /// Last player login date comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Last player login date. + /// + public DateTime LogInDate; + } + + [Serializable] + public class LastLoginTimespanSegmentFilter : PlayFabBaseModel + { + /// + /// Last player login duration comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Last player login duration. + /// + public double DurationInMinutes; + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + [Serializable] + public class LinkedUserAccountHasEmailSegmentFilter : PlayFabBaseModel + { + /// + /// Login provider comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Login provider. + /// + public SegmentLoginIdentityProvider? LoginProvider; + } + + [Serializable] + public class LinkedUserAccountSegmentFilter : PlayFabBaseModel + { + /// + /// Login provider. + /// + public SegmentLoginIdentityProvider? LoginProvider; + } + + [Serializable] + public class ListOpenIdConnectionRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class ListOpenIdConnectionResponse : PlayFabResultCommon + { + /// + /// The list of Open ID Connections + /// + public List Connections; + } + + [Serializable] + public class ListVirtualCurrencyTypesRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class ListVirtualCurrencyTypesResult : PlayFabResultCommon + { + /// + /// List of virtual currency names defined for this title + /// + public List VirtualCurrencies; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + [Serializable] + public class LocationSegmentFilter : PlayFabBaseModel + { + /// + /// Segment country code. + /// + public SegmentCountryCode? CountryCode; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class LookupUserAccountInfoRequest : PlayFabRequestCommon + { + /// + /// User email address attached to their account + /// + public string Email; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Title specific username to match against existing user accounts + /// + public string TitleDisplayName; + /// + /// PlayFab username for the account (3-20 characters) + /// + public string Username; + } + + [Serializable] + public class LookupUserAccountInfoResult : PlayFabResultCommon + { + /// + /// User info for the user matching the request + /// + public UserAccountInfo UserInfo; + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + [Serializable] + public class ModifyServerBuildRequest : PlayFabRequestCommon + { + /// + /// array of regions where this build can used, when it is active + /// + public List ActiveRegions; + /// + /// unique identifier of the previously uploaded build executable to be updated + /// + public string BuildId; + /// + /// appended to the end of the command line when starting game servers + /// + public string CommandLineTemplate; + /// + /// developer comment(s) for this build + /// + public string Comment; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// path to the game server executable. Defaults to gameserver.exe + /// + public string ExecutablePath; + /// + /// maximum number of game server instances that can run on a single host machine + /// + public int MaxGamesPerHost; + /// + /// minimum capacity of additional game server instances that can be started before the autoscaling service starts new host + /// machines (given the number of current running host machines and game server instances) + /// + public int MinFreeGameSlots; + /// + /// new timestamp + /// + public DateTime? Timestamp; + } + + [Serializable] + public class ModifyServerBuildResult : PlayFabResultCommon + { + /// + /// array of regions where this build can used, when it is active + /// + public List ActiveRegions; + /// + /// unique identifier for this build executable + /// + public string BuildId; + /// + /// appended to the end of the command line when starting game servers + /// + public string CommandLineTemplate; + /// + /// developer comment(s) for this build + /// + public string Comment; + /// + /// path to the game server executable. Defaults to gameserver.exe + /// + public string ExecutablePath; + /// + /// maximum number of game server instances that can run on a single host machine + /// + public int MaxGamesPerHost; + /// + /// minimum capacity of additional game server instances that can be started before the autoscaling service starts new host + /// machines (given the number of current running host machines and game server instances) + /// + public int MinFreeGameSlots; + /// + /// the current status of the build validation and processing steps + /// + public GameBuildStatus? Status; + /// + /// time this build was last modified (or uploaded, if this build has never been modified) + /// + public DateTime Timestamp; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class ModifyUserVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Amount added or subtracted from the user's virtual currency. Maximum VC balance is Int32 (2,147,483,647). Any increase + /// over this value will be discarded. + /// + public int BalanceChange; + /// + /// User currency was subtracted from. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// Identifier by either name or ID. Note that a name may change due to renaming, or reused after being deleted. ID is + /// immutable and unique. + /// + [Serializable] + public class NameIdentifier : PlayFabBaseModel + { + /// + /// Id Identifier, if present + /// + public string Id; + /// + /// Name Identifier, if present + /// + public string Name; + } + + [Serializable] + public class OpenIdConnection : PlayFabBaseModel + { + /// + /// The client ID given by the ID provider. + /// + public string ClientId; + /// + /// The client secret given by the ID provider. + /// + public string ClientSecret; + /// + /// A name for the connection to identify it within the title. + /// + public string ConnectionId; + /// + /// Shows if data about the connection will be loaded from the issuer's discovery document + /// + public bool DiscoverConfiguration; + /// + /// Information for an OpenID Connect provider. + /// + public OpenIdIssuerInformation IssuerInformation; + } + + [Serializable] + public class OpenIdIssuerInformation : PlayFabBaseModel + { + /// + /// Authorization endpoint URL to direct users to for signin. + /// + public string AuthorizationUrl; + /// + /// The URL of the issuer of the tokens. This must match the exact URL of the issuer field in tokens. + /// + public string Issuer; + /// + /// JSON Web Key Set for validating the signature of tokens. + /// + public object JsonWebKeySet; + /// + /// Token endpoint URL for code verification. + /// + public string TokenUrl; + } + + [Serializable] + public class PermissionStatement : PlayFabBaseModel + { + /// + /// The action this statement effects. The only supported action is 'Execute'. + /// + public string Action; + /// + /// Additional conditions to be applied for API Resources. + /// + public ApiCondition ApiConditions; + /// + /// A comment about the statement. Intended solely for bookkeeping and debugging. + /// + public string Comment; + /// + /// The effect this statement will have. It could be either Allow or Deny + /// + public EffectType Effect; + /// + /// The principal this statement will effect. The only supported principal is '*'. + /// + public string Principal; + /// + /// The resource this statements effects. The only supported resources look like 'pfrn:api--*' for all apis, or + /// 'pfrn:api--/Client/ConfirmPurchase' for specific apis. + /// + public string Resource; + } + + [Serializable] + public class PlayerChurnPredictionSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// RiskLevel + /// + public ChurnRiskLevel? RiskLevel; + } + + [Serializable] + public class PlayerChurnPredictionTimeSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// DurationInDays + /// + public double DurationInDays; + } + + [Serializable] + public class PlayerChurnPreviousPredictionSegmentFilter : PlayFabBaseModel + { + /// + /// Comparison + /// + public SegmentFilterComparison? Comparison; + /// + /// RiskLevel + /// + public ChurnRiskLevel? RiskLevel; + } + + [Serializable] + public class PlayerLinkedAccount : PlayFabBaseModel + { + /// + /// Linked account's email + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Platform user identifier + /// + public string PlatformUserId; + /// + /// Linked account's username + /// + public string Username; + } + + [Serializable] + public class PlayerLocation : PlayFabBaseModel + { + /// + /// City of the player's geographic location. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode CountryCode; + /// + /// Latitude coordinate of the player's geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the player's geographic location. + /// + public double? Longitude; + } + + [Serializable] + public class PlayerProfile : PlayFabBaseModel + { + /// + /// Array of ad campaigns player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// Image URL of the player's avatar. + /// + public string AvatarUrl; + /// + /// Banned until UTC Date. If permanent ban this is set for 20 years after the original ban date. + /// + public DateTime? BannedUntil; + /// + /// The prediction of the player to churn within the next seven days. + /// + public ChurnRiskLevel? ChurnPrediction; + /// + /// Array of contact email addresses associated with the player + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player Display Name + /// + public string DisplayName; + /// + /// Last login + /// + public DateTime? LastLogin; + /// + /// Array of third party accounts linked to this player + /// + public List LinkedAccounts; + /// + /// Dictionary of player's locations by type. + /// + public Dictionary Locations; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// List of player variants for experimentation + /// + public List PlayerExperimentVariants; + /// + /// PlayFab Player ID + /// + public string PlayerId; + /// + /// Array of player statistics + /// + public List PlayerStatistics; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// Array of configured push notification end points + /// + public List PushNotificationRegistrations; + /// + /// Dictionary of player's statistics using only the latest version's value + /// + public Dictionary Statistics; + /// + /// List of player's tags for segmentation. + /// + public List Tags; + /// + /// Title ID this profile applies to + /// + public string TitleId; + /// + /// A sum of player's total purchases in USD across all currencies. + /// + public uint? TotalValueToDateInUSD; + /// + /// Dictionary of player's total purchases by currency. + /// + public Dictionary ValuesToDate; + /// + /// Dictionary of player's virtual currency balances + /// + public Dictionary VirtualCurrencyBalances; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayerProfileViewConstraints : PlayFabBaseModel + { + /// + /// Whether to show player's avatar URL. Defaults to false + /// + public bool ShowAvatarUrl; + /// + /// Whether to show the banned until time. Defaults to false + /// + public bool ShowBannedUntil; + /// + /// Whether to show campaign attributions. Defaults to false + /// + public bool ShowCampaignAttributions; + /// + /// Whether to show contact email addresses. Defaults to false + /// + public bool ShowContactEmailAddresses; + /// + /// Whether to show the created date. Defaults to false + /// + public bool ShowCreated; + /// + /// Whether to show the display name. Defaults to false + /// + public bool ShowDisplayName; + /// + /// Whether to show player's experiment variants. Defaults to false + /// + public bool ShowExperimentVariants; + /// + /// Whether to show the last login time. Defaults to false + /// + public bool ShowLastLogin; + /// + /// Whether to show the linked accounts. Defaults to false + /// + public bool ShowLinkedAccounts; + /// + /// Whether to show player's locations. Defaults to false + /// + public bool ShowLocations; + /// + /// Whether to show player's membership information. Defaults to false + /// + public bool ShowMemberships; + /// + /// Whether to show origination. Defaults to false + /// + public bool ShowOrigination; + /// + /// Whether to show push notification registrations. Defaults to false + /// + public bool ShowPushNotificationRegistrations; + /// + /// Reserved for future development + /// + public bool ShowStatistics; + /// + /// Whether to show tags. Defaults to false + /// + public bool ShowTags; + /// + /// Whether to show the total value to date in usd. Defaults to false + /// + public bool ShowTotalValueToDateInUsd; + /// + /// Whether to show the values to date. Defaults to false + /// + public bool ShowValuesToDate; + } + + [Serializable] + public class PlayerStatistic : PlayFabBaseModel + { + /// + /// Statistic ID + /// + public string Id; + /// + /// Statistic name + /// + public string Name; + /// + /// Current statistic value + /// + public int StatisticValue; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int StatisticVersion; + } + + [Serializable] + public class PlayerStatisticDefinition : PlayFabBaseModel + { + /// + /// the aggregation method to use in updating the statistic (defaults to last) + /// + public StatisticAggregationMethod? AggregationMethod; + /// + /// current active version of the statistic, incremented each time the statistic resets + /// + public uint CurrentVersion; + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// interval at which the values of the statistic for all players are reset automatically + /// + public StatisticResetIntervalOption? VersionChangeInterval; + } + + [Serializable] + public class PlayerStatisticVersion : PlayFabBaseModel + { + /// + /// time when the statistic version became active + /// + public DateTime ActivationTime; + /// + /// URL for the downloadable archive of player statistic values, if available + /// + public string ArchiveDownloadUrl; + /// + /// time when the statistic version became inactive due to statistic version incrementing + /// + public DateTime? DeactivationTime; + /// + /// time at which the statistic version was scheduled to become active, based on the configured ResetInterval + /// + public DateTime? ScheduledActivationTime; + /// + /// time at which the statistic version was scheduled to become inactive, based on the configured ResetInterval + /// + public DateTime? ScheduledDeactivationTime; + /// + /// name of the statistic when the version became active + /// + public string StatisticName; + /// + /// status of the statistic version + /// + public StatisticVersionStatus? Status; + /// + /// version of the statistic + /// + public uint Version; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistration : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class PushNotificationSegmentAction : PlayFabBaseModel + { + /// + /// Push notification template id. + /// + public string PushNotificationTemplateId; + } + + [Serializable] + public class PushNotificationSegmentFilter : PlayFabBaseModel + { + /// + /// Push notification device platform. + /// + public SegmentPushNotificationDevicePlatform? PushNotificationDevicePlatform; + } + + public enum PushSetupPlatform + { + GCM, + APNS, + APNS_SANDBOX + } + + [Serializable] + public class RandomResultTable : PlayFabBaseModel + { + /// + /// Child nodes that indicate what kind of drop table item this actually is. + /// + public List Nodes; + /// + /// Unique name for this drop table + /// + public string TableId; + } + + [Serializable] + public class RandomResultTableListing : PlayFabBaseModel + { + /// + /// Catalog version this table is associated with + /// + public string CatalogVersion; + /// + /// Child nodes that indicate what kind of drop table item this actually is. + /// + public List Nodes; + /// + /// Unique name for this drop table + /// + public string TableId; + } + + [Serializable] + public class RefundPurchaseRequest : PlayFabRequestCommon + { + /// + /// Unique order ID for the purchase in question. + /// + public string OrderId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The Reason parameter should correspond with the payment providers reason field, if they require one such as Facebook. In + /// the case of Facebook this must match one of their refund or dispute resolution enums (See: + /// https://developers.facebook.com/docs/payments/implementation-guide/handling-disputes-refunds) + /// + public string Reason; + } + + [Serializable] + public class RefundPurchaseResponse : PlayFabResultCommon + { + /// + /// The order's updated purchase status. + /// + public string PurchaseStatus; + } + + public enum Region + { + USCentral, + USEast, + EUWest, + Singapore, + Japan, + Brazil, + Australia + } + + /// + /// This API will trigger a player_tag_removed event and remove a tag with the given TagName and PlayFabID from the + /// corresponding player profile. TagName can be used for segmentation and it is limited to 256 characters + /// + [Serializable] + public class RemovePlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class RemovePlayerTagResult : PlayFabResultCommon + { + } + + /// + /// Virtual currencies to be removed cannot have entries in any catalog nor store for the title. Note that this operation + /// will not remove player balances for the removed currencies; if a deleted currency is recreated at any point, user + /// balances will be in an undefined state. + /// + [Serializable] + public class RemoveVirtualCurrencyTypesRequest : PlayFabRequestCommon + { + /// + /// List of virtual currencies to delete + /// + public List VirtualCurrencies; + } + + /// + /// Note that this action cannot be un-done. All statistics for this character will be deleted, removing the user from all + /// leaderboards for the game. + /// + [Serializable] + public class ResetCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ResetCharacterStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Resets a player's password taking in a new password based and validating the user based off of a token sent to the + /// playerto their email. The token expires after 30 minutes. + /// + [Serializable] + public class ResetPasswordRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The new password for the player. + /// + public string Password; + /// + /// The token of the player requesting the password reset. + /// + public string Token; + } + + [Serializable] + public class ResetPasswordResult : PlayFabResultCommon + { + } + + /// + /// Note that this action cannot be un-done. All statistics for this user will be deleted, removing the user from all + /// leaderboards for the game. + /// + [Serializable] + public class ResetUserStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ResetUserStatisticsResult : PlayFabResultCommon + { + } + + public enum ResolutionOutcome + { + Revoke, + Reinstate, + Manual + } + + [Serializable] + public class ResolvePurchaseDisputeRequest : PlayFabRequestCommon + { + /// + /// Unique order ID for the purchase in question. + /// + public string OrderId; + /// + /// Enum for the desired purchase result state after notifying the payment provider. Valid values are Revoke, Reinstate and + /// Manual. Manual will cause no change to the order state. + /// + public ResolutionOutcome Outcome; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The Reason parameter should correspond with the payment providers reason field, if they require one such as Facebook. In + /// the case of Facebook this must match one of their refund or dispute resolution enums (See: + /// https://developers.facebook.com/docs/payments/implementation-guide/handling-disputes-refunds) + /// + public string Reason; + } + + [Serializable] + public class ResolvePurchaseDisputeResponse : PlayFabResultCommon + { + /// + /// The order's updated purchase status. + /// + public string PurchaseStatus; + } + + [Serializable] + public class ResultTableNode : PlayFabBaseModel + { + /// + /// Either an ItemId, or the TableId of another random result table + /// + public string ResultItem; + /// + /// Whether this entry in the table is an item or a link to another table + /// + public ResultTableNodeType ResultItemType; + /// + /// How likely this is to be rolled - larger numbers add more weight + /// + public int Weight; + } + + public enum ResultTableNodeType + { + ItemId, + TableId + } + + /// + /// Setting the active state of all non-expired bans for a user to Inactive. Expired bans with an Active state will be + /// ignored, however. Returns information about applied updates only. + /// + [Serializable] + public class RevokeAllBansForUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RevokeAllBansForUserResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked. + /// + public List BanData; + } + + /// + /// Setting the active state of all bans requested to Inactive regardless of whether that ban has already expired. BanIds + /// that do not exist will be skipped. Returns information about applied updates only. + /// + [Serializable] + public class RevokeBansRequest : PlayFabRequestCommon + { + /// + /// Ids of the bans to be revoked. Maximum 100. + /// + public List BanIds; + } + + [Serializable] + public class RevokeBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked + /// + public List BanData; + } + + [Serializable] + public class RevokeInventoryItem : PlayFabBaseModel + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// Array of player items to revoke, between 1 and 25 items. + /// + public List Items; + } + + [Serializable] + public class RevokeInventoryItemsResult : PlayFabResultCommon + { + /// + /// Collection of any errors that occurred during processing. + /// + public List Errors; + } + + [Serializable] + public class RevokeInventoryResult : PlayFabResultCommon + { + } + + [Serializable] + public class RevokeItemError : PlayFabBaseModel + { + /// + /// Specific error that was encountered. + /// + public GenericErrorCodes? Error; + /// + /// Item information that failed to be revoked. + /// + public RevokeInventoryItem Item; + } + + /// + /// The returned task instance ID can be used to query for task execution status. + /// + [Serializable] + public class RunTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Provide either the task ID or the task name to run a task. + /// + public NameIdentifier Identifier; + } + + [Serializable] + public class RunTaskResult : PlayFabResultCommon + { + /// + /// ID of the task instance that is started. This can be used in Get*TaskInstance (e.g. GetCloudScriptTaskInstance) API call + /// to retrieve status for the task instance. + /// + public string TaskInstanceId; + } + + [Serializable] + public class ScheduledTask : PlayFabBaseModel + { + /// + /// Description the task + /// + public string Description; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// UTC time of last run + /// + public DateTime? LastRunTime; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// UTC time of next run + /// + public DateTime? NextRunTime; + /// + /// Task parameter. Different types of task have different parameter structure. See each task type's create API + /// documentation for the details. + /// + public object Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + /// + /// ID of the task + /// + public string TaskId; + /// + /// Task type. + /// + public ScheduledTaskType? Type; + } + + public enum ScheduledTaskType + { + CloudScript, + ActionsOnPlayerSegment, + CloudScriptAzureFunctions, + InsightsScheduledScaling + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + [Serializable] + public class SegmentAndDefinition : PlayFabBaseModel + { + /// + /// Filter property for ad campaign filter. + /// + public AdCampaignSegmentFilter AdCampaignFilter; + /// + /// property for all player filter. + /// + public AllPlayersSegmentFilter AllPlayersFilter; + /// + /// Filter property for player churn risk level. + /// + public ChurnPredictionSegmentFilter ChurnPredictionFilter; + /// + /// Filter property for first login date. + /// + public FirstLoginDateSegmentFilter FirstLoginDateFilter; + /// + /// Filter property for first login timespan. + /// + public FirstLoginTimespanSegmentFilter FirstLoginFilter; + /// + /// Filter property for last login date. + /// + public LastLoginDateSegmentFilter LastLoginDateFilter; + /// + /// Filter property for last login timespan. + /// + public LastLoginTimespanSegmentFilter LastLoginFilter; + /// + /// Filter property for linked in user account. + /// + public LinkedUserAccountSegmentFilter LinkedUserAccountFilter; + /// + /// Filter property for linked in user account has email. + /// + public LinkedUserAccountHasEmailSegmentFilter LinkedUserAccountHasEmailFilter; + /// + /// Filter property for location. + /// + public LocationSegmentFilter LocationFilter; + /// + /// Filter property for current player churn value. + /// + public PlayerChurnPredictionSegmentFilter PlayerChurnPredictionFilter; + /// + /// Filter property for player churn timespan. + /// + public PlayerChurnPredictionTimeSegmentFilter PlayerChurnPredictionTimeFilter; + /// + /// Filter property for previous player churn value. + /// + public PlayerChurnPreviousPredictionSegmentFilter PlayerChurnPreviousPredictionFilter; + /// + /// Filter property for push notification. + /// + public PushNotificationSegmentFilter PushNotificationFilter; + /// + /// Filter property for statistics. + /// + public StatisticSegmentFilter StatisticFilter; + /// + /// Filter property for tags. + /// + public TagSegmentFilter TagFilter; + /// + /// Filter property for total value to date in USD. + /// + public TotalValueToDateInUSDSegmentFilter TotalValueToDateInUSDFilter; + /// + /// Filter property for user origination. + /// + public UserOriginationSegmentFilter UserOriginationFilter; + /// + /// Filter property for value to date. + /// + public ValueToDateSegmentFilter ValueToDateFilter; + /// + /// Filter property for virtual currency. + /// + public VirtualCurrencyBalanceSegmentFilter VirtualCurrencyBalanceFilter; + } + + public enum SegmentCountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW + } + + public enum SegmentCurrency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + public enum SegmentFilterComparison + { + GreaterThan, + LessThan, + EqualTo, + NotEqualTo, + GreaterThanOrEqual, + LessThanOrEqual, + Exists, + Contains, + NotContains + } + + public enum SegmentLoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount + } + + [Serializable] + public class SegmentModel : PlayFabBaseModel + { + /// + /// Segment description. + /// + public string Description; + /// + /// Segment actions for current entered segment players. + /// + public List EnteredSegmentActions; + /// + /// Segment last updated date time. + /// + public DateTime LastUpdateTime; + /// + /// Segment actions for current left segment players. + /// + public List LeftSegmentActions; + /// + /// Segment name. + /// + public string Name; + /// + /// Segment id in hex. + /// + public string SegmentId; + /// + /// Segment or definitions. This includes segment and definitions and filters. + /// + public List SegmentOrDefinitions; + } + + [Serializable] + public class SegmentOrDefinition : PlayFabBaseModel + { + /// + /// List of segment and definitions. + /// + public List SegmentAndDefinitions; + } + + public enum SegmentPushNotificationDevicePlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class SegmentTrigger : PlayFabBaseModel + { + /// + /// Ban player segment trigger action. + /// + public BanPlayerSegmentAction BanPlayerAction; + /// + /// Delete player segment trigger action. + /// + public DeletePlayerSegmentAction DeletePlayerAction; + /// + /// Delete player statistic segment trigger action. + /// + public DeletePlayerStatisticSegmentAction DeletePlayerStatisticAction; + /// + /// Email notification segment trigger action. + /// + public EmailNotificationSegmentAction EmailNotificationAction; + /// + /// Execute azure function segment trigger action. + /// + public ExecuteAzureFunctionSegmentAction ExecuteAzureFunctionAction; + /// + /// Execute cloud script segment trigger action. + /// + public ExecuteCloudScriptSegmentAction ExecuteCloudScriptAction; + /// + /// Grant item segment trigger action. + /// + public GrantItemSegmentAction GrantItemAction; + /// + /// Grant virtual currency segment trigger action. + /// + public GrantVirtualCurrencySegmentAction GrantVirtualCurrencyAction; + /// + /// Increment player statistic segment trigger action. + /// + public IncrementPlayerStatisticSegmentAction IncrementPlayerStatisticAction; + /// + /// Push notification segment trigger action. + /// + public PushNotificationSegmentAction PushNotificationAction; + } + + /// + /// If the account in question is a "temporary" account (for example, one that was created via a call to + /// LoginFromIOSDeviceID), thisfunction will have no effect. Only PlayFab accounts which have valid email addresses will be + /// able to receive a password reset email using this API. + /// + [Serializable] + public class SendAccountRecoveryEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// The email template id of the account recovery email template to send. + /// + public string EmailTemplateId; + } + + [Serializable] + public class SendAccountRecoveryEmailResult : PlayFabResultCommon + { + } + + /// + /// This API lets developers set overrides for membership expirations, independent of any subscriptions setting it. + /// + [Serializable] + public class SetMembershipOverrideRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Expiration time for the membership in DateTime format, will override any subscription expirations. + /// + public DateTime ExpirationTime; + /// + /// Id of the membership to apply the override expiration date to. + /// + public string MembershipId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SetMembershipOverrideResult : PlayFabResultCommon + { + } + + /// + /// APIs that require signatures require that the player have a configured Player Secret Key that is used to sign all + /// requests. Players that don't have a secret will be blocked from making API calls until it is configured. To create a + /// signature header add a SHA256 hashed string containing UTF8 encoded JSON body as it will be sent to the server, the + /// current time in UTC formatted to ISO 8601, and the players secret formatted as 'body.date.secret'. Place the resulting + /// hash into the header X-PlayFab-Signature, along with a header X-PlayFab-Timestamp of the same UTC timestamp used in the + /// signature. + /// + [Serializable] + public class SetPlayerSecretRequest : PlayFabRequestCommon + { + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SetPlayerSecretResult : PlayFabResultCommon + { + } + + [Serializable] + public class SetPublishedRevisionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Revision to make the current published revision + /// + public int Revision; + /// + /// Version number + /// + public int Version; + } + + [Serializable] + public class SetPublishedRevisionResult : PlayFabResultCommon + { + } + + /// + /// This API is designed to store publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. This operation is additive. If a Key does not exist in the current dataset, it + /// will be added with the specified Value. If it already exists, the Value for that key will be overwritten with the new + /// Value. For more information email helloplayfab@microsoft.com + /// + [Serializable] + public class SetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetPublisherDataResult : PlayFabResultCommon + { + } + + /// + /// Will set the given key values in the specified override or the primary title data based on whether the label is provided + /// or not. + /// + [Serializable] + public class SetTitleDataAndOverridesRequest : PlayFabRequestCommon + { + /// + /// List of titleData key-value pairs to set/delete. Use an empty value to delete an existing key; use a non-empty value to + /// create/update a key. + /// + public List KeyValues; + /// + /// Name of the override. + /// + public string OverrideLabel; + } + + [Serializable] + public class SetTitleDataAndOverridesResult : PlayFabResultCommon + { + } + + /// + /// This operation is additive. If a Key does not exist in the current dataset, it will be added with the specified Value. + /// If it already exists, the Value for that key will be overwritten with the new Value. + /// + [Serializable] + public class SetTitleDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetTitleDataResult : PlayFabResultCommon + { + } + + /// + /// When using the Apple Push Notification service (APNS) or the development version (APNS_SANDBOX), the APNS Private Key + /// should be used as the Credential in this call. With Google Cloud Messaging (GCM), the Android API Key should be used. + /// The current ARN (if one exists) can be overwritten by setting the OverwriteOldARN boolean to true. + /// + [Serializable] + public class SetupPushNotificationRequest : PlayFabRequestCommon + { + /// + /// Credential is the Private Key for APNS/APNS_SANDBOX, and the API Key for GCM + /// + public string Credential; + /// + /// for APNS, this is the PlatformPrincipal (SSL Certificate) + /// + public string Key; + /// + /// This field is deprecated and any usage of this will cause the API to fail. + /// + public string Name; + /// + /// replace any existing ARN with the newly generated one. If this is set to false, an error will be returned if + /// notifications have already setup for this platform. + /// + public bool OverwriteOldARN; + /// + /// supported notification platforms are Apple Push Notification Service (APNS and APNS_SANDBOX) for iOS and Google Cloud + /// Messaging (GCM) for Android + /// + public PushSetupPlatform Platform; + } + + [Serializable] + public class SetupPushNotificationResult : PlayFabResultCommon + { + /// + /// Amazon Resource Name for the created notification topic. + /// + public string ARN; + } + + [Serializable] + public class SharedSecret : PlayFabBaseModel + { + /// + /// Flag to indicate if this key is disabled + /// + public bool Disabled; + /// + /// Friendly name for this key + /// + public string FriendlyName; + /// + /// The player shared secret to use when calling Client/GetTitlePublicKey + /// + public string SecretKey; + } + + public enum SourceType + { + Admin, + BackEnd, + GameClient, + GameServer, + Partner, + Custom, + API + } + + public enum StatisticAggregationMethod + { + Last, + Min, + Max, + Sum + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + public enum StatisticResetIntervalOption + { + Never, + Hour, + Day, + Week, + Month + } + + [Serializable] + public class StatisticSegmentFilter : PlayFabBaseModel + { + /// + /// Statistic filter comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Statistic filter value. + /// + public string FilterValue; + /// + /// Statistic name. + /// + public string Name; + /// + /// Use current version of statistic? + /// + public bool? UseCurrentVersion; + /// + /// Statistic version. + /// + public int? Version; + } + + public enum StatisticVersionArchivalStatus + { + NotScheduled, + Scheduled, + Queued, + InProgress, + Complete + } + + public enum StatisticVersionStatus + { + Active, + SnapshotPending, + Snapshot, + ArchivalPending, + Archived + } + + /// + /// A store entry that list a catalog item at a particular price + /// + [Serializable] + public class StoreItem : PlayFabBaseModel + { + /// + /// Store specific custom data. The data only exists as part of this store; it is not transferred to item instances + /// + public object CustomData; + /// + /// Intended display position for this item. Note that 0 is the first position + /// + public uint? DisplayPosition; + /// + /// Unique identifier of the item as it exists in the catalog - note that this must exactly match the ItemId from the + /// catalog + /// + public string ItemId; + /// + /// Override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// Override prices for this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// Marketing data about a specific store + /// + [Serializable] + public class StoreMarketingModel : PlayFabBaseModel + { + /// + /// Tagline for a store. + /// + public string Description; + /// + /// Display name of a store as it will appear to users. + /// + public string DisplayName; + /// + /// Custom data about a store. + /// + public object Metadata; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + [Serializable] + public class SubtractUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be decreased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + [Serializable] + public class TagSegmentFilter : PlayFabBaseModel + { + /// + /// Tag comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Tag value. + /// + public string TagValue; + } + + [Serializable] + public class TaskInstanceBasicSummary : PlayFabBaseModel + { + /// + /// UTC timestamp when the task completed. + /// + public DateTime? CompletedAt; + /// + /// Error message for last processing attempt, if an error occured. + /// + public string ErrorMessage; + /// + /// Estimated time remaining in seconds. + /// + public double? EstimatedSecondsRemaining; + /// + /// Progress represented as percentage. + /// + public double? PercentComplete; + /// + /// If manually scheduled, ID of user who scheduled the task. + /// + public string ScheduledByUserId; + /// + /// UTC timestamp when the task started. + /// + public DateTime StartedAt; + /// + /// Current status of the task instance. + /// + public TaskInstanceStatus? Status; + /// + /// Identifier of the task this instance belongs to. + /// + public NameIdentifier TaskIdentifier; + /// + /// ID of the task instance. + /// + public string TaskInstanceId; + /// + /// Type of the task. + /// + public ScheduledTaskType? Type; + } + + public enum TaskInstanceStatus + { + Succeeded, + Starting, + InProgress, + Failed, + Aborted, + Stalled + } + + public enum TitleActivationStatus + { + None, + ActivatedTitleKey, + PendingSteam, + ActivatedSteam, + RevokedSteam + } + + [Serializable] + public class TitleDataKeyValue : PlayFabBaseModel + { + /// + /// Key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// New value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class TotalValueToDateInUSDSegmentFilter : PlayFabBaseModel + { + /// + /// Total value to date USD amount. + /// + public string Amount; + /// + /// Total value to date USD comparison. + /// + public SegmentFilterComparison? Comparison; + } + + /// + /// Represents a single update ban request. + /// + [Serializable] + public class UpdateBanRequest : PlayFabBaseModel + { + /// + /// The updated active state for the ban. Null for no change. + /// + public bool? Active; + /// + /// The id of the ban to be updated. + /// + public string BanId; + /// + /// The updated expiration date for the ban. Null for no change. + /// + public DateTime? Expires; + /// + /// The updated IP address for the ban. Null for no change. + /// + public string IPAddress; + /// + /// Whether to make this ban permanent. Set to true to make this ban permanent. This will not modify Active state. + /// + public bool? Permanent; + /// + /// The updated reason for the ban to be updated. Maximum 140 characters. Null for no change. + /// + public string Reason; + } + + /// + /// For each ban, only updates the values that are set. Leave any value to null for no change. If a ban could not be found, + /// the rest are still applied. Returns information about applied updates only. + /// + [Serializable] + public class UpdateBansRequest : PlayFabRequestCommon + { + /// + /// List of bans to be updated. Maximum 100. + /// + public List Bans; + } + + [Serializable] + public class UpdateBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were updated + /// + public List BanData; + } + + /// + /// When used for SetCatalogItems, this operation is not additive. Using it will cause the indicated catalog version to be + /// created from scratch. If there is an existing catalog with the version number in question, it will be deleted and + /// replaced with only the items specified in this call. When used for UpdateCatalogItems, this operation is additive. Items + /// with ItemId values not currently in the catalog will be added, while those with ItemId values matching items currently + /// in the catalog will overwrite those items with the given values. + /// + [Serializable] + public class UpdateCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Array of catalog items to be submitted. Note that while CatalogItem has a parameter for CatalogVersion, it is not + /// required and ignored in this call. + /// + public List Catalog; + /// + /// Which catalog is being updated. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Should this catalog be set as the default catalog. Defaults to true. If there is currently no default catalog, this will + /// always set it. + /// + public bool? SetAsDefaultCatalog; + } + + [Serializable] + public class UpdateCatalogItemsResult : PlayFabResultCommon + { + } + + [Serializable] + public class UpdateCloudScriptRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab user ID of the developer initiating the request. + /// + public string DeveloperPlayFabId; + /// + /// List of Cloud Script files to upload to create the new revision. Must have at least one file. + /// + public List Files; + /// + /// Immediately publish the new revision + /// + public bool Publish; + } + + [Serializable] + public class UpdateCloudScriptResult : PlayFabResultCommon + { + /// + /// New revision number created + /// + public int Revision; + /// + /// Cloud Script version updated + /// + public int Version; + } + + [Serializable] + public class UpdateOpenIdConnectionRequest : PlayFabRequestCommon + { + /// + /// The client ID given by the ID provider. + /// + public string ClientId; + /// + /// The client secret given by the ID provider. + /// + public string ClientSecret; + /// + /// A name for the connection that identifies it within the title. + /// + public string ConnectionId; + /// + /// The issuer URL or discovery document URL to read issuer information from + /// + public string IssuerDiscoveryUrl; + /// + /// Manually specified information for an OpenID Connect issuer. + /// + public OpenIdIssuerInformation IssuerInformation; + } + + /// + /// Player Shared Secret Keys are used for the call to Client/GetTitlePublicKey, which exchanges the shared secret for an + /// RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature header. + /// + [Serializable] + public class UpdatePlayerSharedSecretRequest : PlayFabRequestCommon + { + /// + /// Disable or Enable this key + /// + public bool Disabled; + /// + /// Friendly name for this key + /// + public string FriendlyName; + /// + /// The shared secret key to update + /// + public string SecretKey; + } + + [Serializable] + public class UpdatePlayerSharedSecretResult : PlayFabResultCommon + { + } + + /// + /// Statistics are numeric values, with each statistic in the title also generating a leaderboard. The ResetInterval enables + /// automatically resetting leaderboards on a specified interval. Upon reset, the statistic updates to a new version with no + /// values (effectively removing all players from the leaderboard). The previous version's statistic values are also + /// archived for retrieval, if needed (see GetPlayerStatisticVersions). Statistics not created via a call to + /// CreatePlayerStatisticDefinition by default have a VersionChangeInterval of Never, meaning they do not reset on a + /// schedule, but they can be set to do so via a call to UpdatePlayerStatisticDefinition. Once a statistic has been reset + /// (sometimes referred to as versioned or incremented), the now-previous version can still be written to for up a short, + /// pre-defined period (currently 10 seconds), to prevent issues with levels completing around the time of the reset. Also, + /// once reset, the historical statistics for players in the title may be retrieved using the URL specified in the version + /// information (GetPlayerStatisticVersions). The AggregationMethod determines what action is taken when a new statistic + /// value is submitted - always update with the new value (Last), use the highest of the old and new values (Max), use the + /// smallest (Min), or add them together (Sum). + /// + [Serializable] + public class UpdatePlayerStatisticDefinitionRequest : PlayFabRequestCommon + { + /// + /// the aggregation method to use in updating the statistic (defaults to last) + /// + public StatisticAggregationMethod? AggregationMethod; + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// interval at which the values of the statistic for all players are reset (changes are effective at the next occurance of + /// the new interval boundary) + /// + public StatisticResetIntervalOption? VersionChangeInterval; + } + + [Serializable] + public class UpdatePlayerStatisticDefinitionResult : PlayFabResultCommon + { + /// + /// updated statistic definition + /// + public PlayerStatisticDefinition Statistic; + } + + /// + /// Updates permissions for your title. Policies affect what is allowed to happen on your title. Your policy is a collection + /// of statements that, together, govern particular area for your title. Today, the only allowed policy is called + /// 'ApiPolicy' and it governs what API calls are allowed. To verify that you have the latest version always download the + /// current policy from GetPolicy before uploading a new policy. PlayFab updates the base policy periodically and will + /// automatically apply it to the uploaded policy. Overwriting the combined policy blindly may result in unexpected API + /// errors. + /// + [Serializable] + public class UpdatePolicyRequest : PlayFabRequestCommon + { + /// + /// Whether to overwrite or append to the existing policy. + /// + public bool OverwritePolicy; + /// + /// The name of the policy being updated. Only supported name is 'ApiPolicy' + /// + public string PolicyName; + /// + /// Version of the policy to update. Must be the latest (as returned by GetPolicy). + /// + public int PolicyVersion; + /// + /// The new statements to include in the policy. + /// + public List Statements; + } + + [Serializable] + public class UpdatePolicyResponse : PlayFabResultCommon + { + /// + /// The name of the policy that was updated. + /// + public string PolicyName; + /// + /// The statements included in the new version of the policy. + /// + public List Statements; + } + + /// + /// This operation is additive. Tables with TableId values not currently defined will be added, while those with TableId + /// values matching Tables currently in the catalog will be overwritten with the given values. + /// + [Serializable] + public class UpdateRandomResultTablesRequest : PlayFabRequestCommon + { + /// + /// which catalog is being updated. If null, update the current default catalog version + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// array of random result tables to make available (Note: specifying an existing TableId will result in overwriting that + /// table, while any others will be added to the available set) + /// + public List Tables; + } + + [Serializable] + public class UpdateRandomResultTablesResult : PlayFabResultCommon + { + } + + /// + /// Update segment properties data which are planning to update + /// + [Serializable] + public class UpdateSegmentRequest : PlayFabRequestCommon + { + /// + /// Segment model with all of the segment properties data. + /// + public SegmentModel SegmentModel; + } + + [Serializable] + public class UpdateSegmentResponse : PlayFabResultCommon + { + /// + /// Error message. + /// + public string ErrorMessage; + /// + /// Segment id. + /// + public string SegmentId; + } + + /// + /// When used for SetStoreItems, this operation is not additive. Using it will cause the indicated virtual store to be + /// created from scratch. If there is an existing store with the same storeId, it will be deleted and replaced with only the + /// items specified in this call. When used for UpdateStoreItems, this operation is additive. Items with ItemId values not + /// currently in the store will be added, while those with ItemId values matching items currently in the catalog will + /// overwrite those items with the given values. In both cases, a store contains an array of references to items defined in + /// the catalog, along with the prices for the item, in both real world and virtual currencies. These prices act as an + /// override to any prices defined in the catalog. In this way, the base definitions of the items may be defined in the + /// catalog, with all associated properties, while the pricing can be set for each store, as needed. This allows for subsets + /// of goods to be defined for different purposes (in order to simplify showing some, but not all catalog items to users, + /// based upon different characteristics), along with unique prices. Note that all prices defined in the catalog and store + /// definitions for the item are considered valid, and that a compromised client can be made to send a request for an item + /// based upon any of these definitions. If no price is specified in the store for an item, the price set in the catalog + /// should be displayed to the user. + /// + [Serializable] + public class UpdateStoreItemsRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the store to update. If null, uses the default catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Additional data about the store + /// + public StoreMarketingModel MarketingData; + /// + /// Array of store items - references to catalog items, with specific pricing - to be added + /// + public List Store; + /// + /// Unique identifier for the store which is to be updated + /// + public string StoreId; + } + + [Serializable] + public class UpdateStoreItemsResult : PlayFabResultCommon + { + } + + /// + /// Note that when calling this API, all properties of the task have to be provided, including properties that you do not + /// want to change. Parameters not specified would be set to default value. If the task name in the update request is new, a + /// task rename operation will be executed before updating other fields of the task. WARNING: Renaming of a task may break + /// logics where the task name is used as an identifier. + /// + [Serializable] + public class UpdateTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description the task + /// + public string Description; + /// + /// Specify either the task ID or the name of the task to be updated. + /// + public NameIdentifier Identifier; + /// + /// Whether the schedule is active. Inactive schedule will not trigger task execution. + /// + public bool IsActive; + /// + /// Name of the task. This is a unique identifier for tasks in the title. + /// + public string Name; + /// + /// Parameter object specific to the task type. See each task type's create API documentation for details. + /// + public object Parameter; + /// + /// Cron expression for the run schedule of the task. The expression should be in UTC. + /// + public string Schedule; + /// + /// Task type. + /// + public ScheduledTaskType Type; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateUserDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, keys with + /// null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserInternalDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In addition to the PlayFab username, titles can make use of a DisplayName which is also a unique identifier, but + /// specific to the title. This allows for unique names which more closely match the theme or genre of a title, for example. + /// This API enables changing that name, whether due to a customer request, an offensive name choice, etc. + /// + [Serializable] + public class UpdateUserTitleDisplayNameRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// New title display name for the user - must be between 3 and 25 characters + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user whose title specific display name is to be changed + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateUserTitleDisplayNameResult : PlayFabResultCommon + { + /// + /// current title display name for the user (this will be the original display name if the rename attempt failed) + /// + public string DisplayName; + } + + [Serializable] + public class UserAccountInfo : PlayFabBaseModel + { + /// + /// User Android device information, if an Android device has been linked + /// + public UserAndroidDeviceInfo AndroidDeviceInfo; + /// + /// Sign in with Apple account information, if an Apple account has been linked + /// + public UserAppleIdInfo AppleAccountInfo; + /// + /// Timestamp indicating when the user account was created + /// + public DateTime Created; + /// + /// Custom ID information, if a custom ID has been assigned + /// + public UserCustomIdInfo CustomIdInfo; + /// + /// User Facebook information, if a Facebook account has been linked + /// + public UserFacebookInfo FacebookInfo; + /// + /// Facebook Instant Games account information, if a Facebook Instant Games account has been linked + /// + public UserFacebookInstantGamesIdInfo FacebookInstantGamesIdInfo; + /// + /// User Gamecenter information, if a Gamecenter account has been linked + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// User Google account information, if a Google account has been linked + /// + public UserGoogleInfo GoogleInfo; + /// + /// User Google Play Games account information, if a Google Play Games account has been linked + /// + public UserGooglePlayGamesInfo GooglePlayGamesInfo; + /// + /// User iOS device information, if an iOS device has been linked + /// + public UserIosDeviceInfo IosDeviceInfo; + /// + /// User Kongregate account information, if a Kongregate account has been linked + /// + public UserKongregateInfo KongregateInfo; + /// + /// Nintendo Switch account information, if a Nintendo Switch account has been linked + /// + public UserNintendoSwitchAccountIdInfo NintendoSwitchAccountInfo; + /// + /// Nintendo Switch device information, if a Nintendo Switch device has been linked + /// + public UserNintendoSwitchDeviceIdInfo NintendoSwitchDeviceIdInfo; + /// + /// OpenID Connect information, if any OpenID Connect accounts have been linked + /// + public List OpenIdInfo; + /// + /// Unique identifier for the user account + /// + public string PlayFabId; + /// + /// Personal information for the user which is considered more sensitive + /// + public UserPrivateAccountInfo PrivateInfo; + /// + /// User PlayStation :tm: Network account information, if a PlayStation :tm: Network account has been linked + /// + public UserPsnInfo PsnInfo; + /// + /// User Steam information, if a Steam account has been linked + /// + public UserSteamInfo SteamInfo; + /// + /// Title-specific information for the user account + /// + public UserTitleInfo TitleInfo; + /// + /// User Twitch account information, if a Twitch account has been linked + /// + public UserTwitchInfo TwitchInfo; + /// + /// User account name in the PlayFab service + /// + public string Username; + /// + /// User XBox account information, if a XBox account has been linked + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class UserAndroidDeviceInfo : PlayFabBaseModel + { + /// + /// Android device ID + /// + public string AndroidDeviceId; + } + + [Serializable] + public class UserAppleIdInfo : PlayFabBaseModel + { + /// + /// Apple subject ID + /// + public string AppleSubjectId; + } + + [Serializable] + public class UserCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + /// + /// Indicates whether a given data key is private (readable only by the player) or public (readable by all players). When a + /// player makes a GetUserData request about another player, only keys marked Public will be returned. + /// + public enum UserDataPermission + { + Private, + Public + } + + [Serializable] + public class UserDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Indicates whether this data can be read by all users (public) or only the user (private). This is used for GetUserData + /// requests being made by one player about another player. + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified user data key. + /// + public string Value; + } + + [Serializable] + public class UserFacebookInfo : PlayFabBaseModel + { + /// + /// Facebook identifier + /// + public string FacebookId; + /// + /// Facebook full name + /// + public string FullName; + } + + [Serializable] + public class UserFacebookInstantGamesIdInfo : PlayFabBaseModel + { + /// + /// Facebook Instant Games ID + /// + public string FacebookInstantGamesId; + } + + [Serializable] + public class UserGameCenterInfo : PlayFabBaseModel + { + /// + /// Gamecenter identifier + /// + public string GameCenterId; + } + + [Serializable] + public class UserGoogleInfo : PlayFabBaseModel + { + /// + /// Email address of the Google account + /// + public string GoogleEmail; + /// + /// Gender information of the Google account + /// + public string GoogleGender; + /// + /// Google ID + /// + public string GoogleId; + /// + /// Locale of the Google account + /// + public string GoogleLocale; + /// + /// Name of the Google account user + /// + public string GoogleName; + } + + [Serializable] + public class UserGooglePlayGamesInfo : PlayFabBaseModel + { + /// + /// Avatar image url of the Google Play Games player + /// + public string GooglePlayGamesPlayerAvatarImageUrl; + /// + /// Display name of the Google Play Games player + /// + public string GooglePlayGamesPlayerDisplayName; + /// + /// Google Play Games player ID + /// + public string GooglePlayGamesPlayerId; + } + + [Serializable] + public class UserIosDeviceInfo : PlayFabBaseModel + { + /// + /// iOS device ID + /// + public string IosDeviceId; + } + + [Serializable] + public class UserKongregateInfo : PlayFabBaseModel + { + /// + /// Kongregate ID + /// + public string KongregateId; + /// + /// Kongregate Username + /// + public string KongregateName; + } + + [Serializable] + public class UserNintendoSwitchAccountIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch account subject ID + /// + public string NintendoSwitchAccountSubjectId; + } + + [Serializable] + public class UserNintendoSwitchDeviceIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch Device ID + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UserOpenIdInfo : PlayFabBaseModel + { + /// + /// OpenID Connection ID + /// + public string ConnectionId; + /// + /// OpenID Issuer + /// + public string Issuer; + /// + /// OpenID Subject + /// + public string Subject; + } + + public enum UserOrigination + { + Organic, + Steam, + Google, + Amazon, + Facebook, + Kongregate, + GamersFirst, + Unknown, + IOS, + LoadTest, + Android, + PSN, + GameCenter, + CustomId, + XboxLive, + Parse, + Twitch, + ServerCustomId, + NintendoSwitchDeviceId, + FacebookInstantGamesId, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class UserOriginationSegmentFilter : PlayFabBaseModel + { + /// + /// User login provider. + /// + public SegmentLoginIdentityProvider? LoginProvider; + } + + [Serializable] + public class UserPrivateAccountInfo : PlayFabBaseModel + { + /// + /// user email address + /// + public string Email; + } + + [Serializable] + public class UserPsnInfo : PlayFabBaseModel + { + /// + /// PlayStation :tm: Network account ID + /// + public string PsnAccountId; + /// + /// PlayStation :tm: Network online ID + /// + public string PsnOnlineId; + } + + [Serializable] + public class UserSteamInfo : PlayFabBaseModel + { + /// + /// what stage of game ownership the user is listed as being in, from Steam + /// + public TitleActivationStatus? SteamActivationStatus; + /// + /// the country in which the player resides, from Steam data + /// + public string SteamCountry; + /// + /// currency type set in the user Steam account + /// + public Currency? SteamCurrency; + /// + /// Steam identifier + /// + public string SteamId; + /// + /// Steam display name + /// + public string SteamName; + } + + [Serializable] + public class UserTitleInfo : PlayFabBaseModel + { + /// + /// URL to the player's avatar. + /// + public string AvatarUrl; + /// + /// timestamp indicating when the user was first associated with this game (this can differ significantly from when the user + /// first registered with PlayFab) + /// + public DateTime Created; + /// + /// name of the user, as it is displayed in-game + /// + public string DisplayName; + /// + /// timestamp indicating when the user first signed into this game (this can differ from the Created timestamp, as other + /// events, such as issuing a beta key to the user, can associate the title to the user) + /// + public DateTime? FirstLogin; + /// + /// boolean indicating whether or not the user is currently banned for a title + /// + public bool? isBanned; + /// + /// timestamp for the last user login for this title + /// + public DateTime? LastLogin; + /// + /// source by which the user first joined the game, if known + /// + public UserOrigination? Origination; + /// + /// Title player account entity for this user + /// + public EntityKey TitlePlayerAccount; + } + + [Serializable] + public class UserTwitchInfo : PlayFabBaseModel + { + /// + /// Twitch ID + /// + public string TwitchId; + /// + /// Twitch Username + /// + public string TwitchUserName; + } + + [Serializable] + public class UserXboxInfo : PlayFabBaseModel + { + /// + /// XBox user ID + /// + public string XboxUserId; + /// + /// XBox user sandbox + /// + public string XboxUserSandbox; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } + + [Serializable] + public class ValueToDateSegmentFilter : PlayFabBaseModel + { + /// + /// Value to date amount. + /// + public string Amount; + /// + /// Value to date comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Currency using for filter. + /// + public SegmentCurrency? Currency; + } + + [Serializable] + public class VirtualCurrencyBalanceSegmentFilter : PlayFabBaseModel + { + /// + /// Total amount. + /// + public int Amount; + /// + /// Amount comparison. + /// + public SegmentFilterComparison? Comparison; + /// + /// Currency code. + /// + public string CurrencyCode; + } + + [Serializable] + public class VirtualCurrencyData : PlayFabBaseModel + { + /// + /// unique two-character identifier for this currency type (e.g.: "CC") + /// + public string CurrencyCode; + /// + /// friendly name to show in the developer portal, reports, etc. + /// + public string DisplayName; + /// + /// amount to automatically grant users upon first login to the title + /// + public int? InitialDeposit; + /// + /// maximum amount to which the currency will recharge (cannot exceed MaxAmount, but can be less) + /// + public int? RechargeMax; + /// + /// rate at which the currency automatically be added to over time, in units per day (24 hours) + /// + public int? RechargeRate; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta new file mode 100644 index 00000000..98594459 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabAdminModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5d7a769446de4b7459591c36c05197ed +timeCreated: 1468524875 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs new file mode 100644 index 00000000..f701a636 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs @@ -0,0 +1,240 @@ +#if ENABLE_PLAYFABADMIN_API +using PlayFab.AdminModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnAdminAbortTaskInstanceRequestEvent; + public event PlayFabResultEvent OnAdminAbortTaskInstanceResultEvent; + public event PlayFabRequestEvent OnAdminAddLocalizedNewsRequestEvent; + public event PlayFabResultEvent OnAdminAddLocalizedNewsResultEvent; + public event PlayFabRequestEvent OnAdminAddNewsRequestEvent; + public event PlayFabResultEvent OnAdminAddNewsResultEvent; + public event PlayFabRequestEvent OnAdminAddPlayerTagRequestEvent; + public event PlayFabResultEvent OnAdminAddPlayerTagResultEvent; + public event PlayFabRequestEvent OnAdminAddUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnAdminAddUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnAdminAddVirtualCurrencyTypesRequestEvent; + public event PlayFabResultEvent OnAdminAddVirtualCurrencyTypesResultEvent; + public event PlayFabRequestEvent OnAdminBanUsersRequestEvent; + public event PlayFabResultEvent OnAdminBanUsersResultEvent; + public event PlayFabRequestEvent OnAdminCheckLimitedEditionItemAvailabilityRequestEvent; + public event PlayFabResultEvent OnAdminCheckLimitedEditionItemAvailabilityResultEvent; + public event PlayFabRequestEvent OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent; + public event PlayFabResultEvent OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent; + public event PlayFabRequestEvent OnAdminCreateCloudScriptTaskRequestEvent; + public event PlayFabResultEvent OnAdminCreateCloudScriptTaskResultEvent; + public event PlayFabRequestEvent OnAdminCreateInsightsScheduledScalingTaskRequestEvent; + public event PlayFabResultEvent OnAdminCreateInsightsScheduledScalingTaskResultEvent; + public event PlayFabRequestEvent OnAdminCreateOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminCreateOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminCreatePlayerSharedSecretRequestEvent; + public event PlayFabResultEvent OnAdminCreatePlayerSharedSecretResultEvent; + public event PlayFabRequestEvent OnAdminCreatePlayerStatisticDefinitionRequestEvent; + public event PlayFabResultEvent OnAdminCreatePlayerStatisticDefinitionResultEvent; + public event PlayFabRequestEvent OnAdminCreateSegmentRequestEvent; + public event PlayFabResultEvent OnAdminCreateSegmentResultEvent; + public event PlayFabRequestEvent OnAdminDeleteContentRequestEvent; + public event PlayFabResultEvent OnAdminDeleteContentResultEvent; + public event PlayFabRequestEvent OnAdminDeleteMasterPlayerAccountRequestEvent; + public event PlayFabResultEvent OnAdminDeleteMasterPlayerAccountResultEvent; + public event PlayFabRequestEvent OnAdminDeleteMembershipSubscriptionRequestEvent; + public event PlayFabResultEvent OnAdminDeleteMembershipSubscriptionResultEvent; + public event PlayFabRequestEvent OnAdminDeleteOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminDeleteOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminDeletePlayerRequestEvent; + public event PlayFabResultEvent OnAdminDeletePlayerResultEvent; + public event PlayFabRequestEvent OnAdminDeletePlayerSharedSecretRequestEvent; + public event PlayFabResultEvent OnAdminDeletePlayerSharedSecretResultEvent; + public event PlayFabRequestEvent OnAdminDeleteSegmentRequestEvent; + public event PlayFabResultEvent OnAdminDeleteSegmentResultEvent; + public event PlayFabRequestEvent OnAdminDeleteStoreRequestEvent; + public event PlayFabResultEvent OnAdminDeleteStoreResultEvent; + public event PlayFabRequestEvent OnAdminDeleteTaskRequestEvent; + public event PlayFabResultEvent OnAdminDeleteTaskResultEvent; + public event PlayFabRequestEvent OnAdminDeleteTitleRequestEvent; + public event PlayFabResultEvent OnAdminDeleteTitleResultEvent; + public event PlayFabRequestEvent OnAdminDeleteTitleDataOverrideRequestEvent; + public event PlayFabResultEvent OnAdminDeleteTitleDataOverrideResultEvent; + public event PlayFabRequestEvent OnAdminExportMasterPlayerDataRequestEvent; + public event PlayFabResultEvent OnAdminExportMasterPlayerDataResultEvent; + public event PlayFabRequestEvent OnAdminExportPlayersInSegmentRequestEvent; + public event PlayFabResultEvent OnAdminExportPlayersInSegmentResultEvent; + public event PlayFabRequestEvent OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent; + public event PlayFabResultEvent OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent; + public event PlayFabRequestEvent OnAdminGetAllSegmentsRequestEvent; + public event PlayFabResultEvent OnAdminGetAllSegmentsResultEvent; + public event PlayFabRequestEvent OnAdminGetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnAdminGetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnAdminGetCloudScriptRevisionRequestEvent; + public event PlayFabResultEvent OnAdminGetCloudScriptRevisionResultEvent; + public event PlayFabRequestEvent OnAdminGetCloudScriptTaskInstanceRequestEvent; + public event PlayFabResultEvent OnAdminGetCloudScriptTaskInstanceResultEvent; + public event PlayFabRequestEvent OnAdminGetCloudScriptVersionsRequestEvent; + public event PlayFabResultEvent OnAdminGetCloudScriptVersionsResultEvent; + public event PlayFabRequestEvent OnAdminGetContentListRequestEvent; + public event PlayFabResultEvent OnAdminGetContentListResultEvent; + public event PlayFabRequestEvent OnAdminGetContentUploadUrlRequestEvent; + public event PlayFabResultEvent OnAdminGetContentUploadUrlResultEvent; + public event PlayFabRequestEvent OnAdminGetDataReportRequestEvent; + public event PlayFabResultEvent OnAdminGetDataReportResultEvent; + public event PlayFabRequestEvent OnAdminGetMatchmakerGameInfoRequestEvent; + public event PlayFabResultEvent OnAdminGetMatchmakerGameInfoResultEvent; + public event PlayFabRequestEvent OnAdminGetMatchmakerGameModesRequestEvent; + public event PlayFabResultEvent OnAdminGetMatchmakerGameModesResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayedTitleListRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayedTitleListResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerIdFromAuthTokenRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerIdFromAuthTokenResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerProfileRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerProfileResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerSegmentsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerSegmentsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerSharedSecretsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerSharedSecretsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayersInSegmentRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayersInSegmentResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerStatisticDefinitionsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerStatisticDefinitionsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerStatisticVersionsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerStatisticVersionsResultEvent; + public event PlayFabRequestEvent OnAdminGetPlayerTagsRequestEvent; + public event PlayFabResultEvent OnAdminGetPlayerTagsResultEvent; + public event PlayFabRequestEvent OnAdminGetPolicyRequestEvent; + public event PlayFabResultEvent OnAdminGetPolicyResultEvent; + public event PlayFabRequestEvent OnAdminGetPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminGetPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminGetRandomResultTablesRequestEvent; + public event PlayFabResultEvent OnAdminGetRandomResultTablesResultEvent; + public event PlayFabRequestEvent OnAdminGetSegmentExportRequestEvent; + public event PlayFabResultEvent OnAdminGetSegmentExportResultEvent; + public event PlayFabRequestEvent OnAdminGetSegmentsRequestEvent; + public event PlayFabResultEvent OnAdminGetSegmentsResultEvent; + public event PlayFabRequestEvent OnAdminGetStoreItemsRequestEvent; + public event PlayFabResultEvent OnAdminGetStoreItemsResultEvent; + public event PlayFabRequestEvent OnAdminGetTaskInstancesRequestEvent; + public event PlayFabResultEvent OnAdminGetTaskInstancesResultEvent; + public event PlayFabRequestEvent OnAdminGetTasksRequestEvent; + public event PlayFabResultEvent OnAdminGetTasksResultEvent; + public event PlayFabRequestEvent OnAdminGetTitleDataRequestEvent; + public event PlayFabResultEvent OnAdminGetTitleDataResultEvent; + public event PlayFabRequestEvent OnAdminGetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminGetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserAccountInfoRequestEvent; + public event PlayFabResultEvent OnAdminGetUserAccountInfoResultEvent; + public event PlayFabRequestEvent OnAdminGetUserBansRequestEvent; + public event PlayFabResultEvent OnAdminGetUserBansResultEvent; + public event PlayFabRequestEvent OnAdminGetUserDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserInventoryRequestEvent; + public event PlayFabResultEvent OnAdminGetUserInventoryResultEvent; + public event PlayFabRequestEvent OnAdminGetUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminGetUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminGetUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminGrantItemsToUsersRequestEvent; + public event PlayFabResultEvent OnAdminGrantItemsToUsersResultEvent; + public event PlayFabRequestEvent OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent; + public event PlayFabResultEvent OnAdminIncrementLimitedEditionItemAvailabilityResultEvent; + public event PlayFabRequestEvent OnAdminIncrementPlayerStatisticVersionRequestEvent; + public event PlayFabResultEvent OnAdminIncrementPlayerStatisticVersionResultEvent; + public event PlayFabRequestEvent OnAdminListOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminListOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminListVirtualCurrencyTypesRequestEvent; + public event PlayFabResultEvent OnAdminListVirtualCurrencyTypesResultEvent; + public event PlayFabRequestEvent OnAdminModifyServerBuildRequestEvent; + public event PlayFabResultEvent OnAdminModifyServerBuildResultEvent; + public event PlayFabRequestEvent OnAdminRefundPurchaseRequestEvent; + public event PlayFabResultEvent OnAdminRefundPurchaseResultEvent; + public event PlayFabRequestEvent OnAdminRemovePlayerTagRequestEvent; + public event PlayFabResultEvent OnAdminRemovePlayerTagResultEvent; + public event PlayFabRequestEvent OnAdminRemoveVirtualCurrencyTypesRequestEvent; + public event PlayFabResultEvent OnAdminRemoveVirtualCurrencyTypesResultEvent; + public event PlayFabRequestEvent OnAdminResetCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnAdminResetCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnAdminResetPasswordRequestEvent; + public event PlayFabResultEvent OnAdminResetPasswordResultEvent; + public event PlayFabRequestEvent OnAdminResetUserStatisticsRequestEvent; + public event PlayFabResultEvent OnAdminResetUserStatisticsResultEvent; + public event PlayFabRequestEvent OnAdminResolvePurchaseDisputeRequestEvent; + public event PlayFabResultEvent OnAdminResolvePurchaseDisputeResultEvent; + public event PlayFabRequestEvent OnAdminRevokeAllBansForUserRequestEvent; + public event PlayFabResultEvent OnAdminRevokeAllBansForUserResultEvent; + public event PlayFabRequestEvent OnAdminRevokeBansRequestEvent; + public event PlayFabResultEvent OnAdminRevokeBansResultEvent; + public event PlayFabRequestEvent OnAdminRevokeInventoryItemRequestEvent; + public event PlayFabResultEvent OnAdminRevokeInventoryItemResultEvent; + public event PlayFabRequestEvent OnAdminRevokeInventoryItemsRequestEvent; + public event PlayFabResultEvent OnAdminRevokeInventoryItemsResultEvent; + public event PlayFabRequestEvent OnAdminRunTaskRequestEvent; + public event PlayFabResultEvent OnAdminRunTaskResultEvent; + public event PlayFabRequestEvent OnAdminSendAccountRecoveryEmailRequestEvent; + public event PlayFabResultEvent OnAdminSendAccountRecoveryEmailResultEvent; + public event PlayFabRequestEvent OnAdminSetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnAdminSetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnAdminSetMembershipOverrideRequestEvent; + public event PlayFabResultEvent OnAdminSetMembershipOverrideResultEvent; + public event PlayFabRequestEvent OnAdminSetPlayerSecretRequestEvent; + public event PlayFabResultEvent OnAdminSetPlayerSecretResultEvent; + public event PlayFabRequestEvent OnAdminSetPublishedRevisionRequestEvent; + public event PlayFabResultEvent OnAdminSetPublishedRevisionResultEvent; + public event PlayFabRequestEvent OnAdminSetPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminSetPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminSetStoreItemsRequestEvent; + public event PlayFabResultEvent OnAdminSetStoreItemsResultEvent; + public event PlayFabRequestEvent OnAdminSetTitleDataRequestEvent; + public event PlayFabResultEvent OnAdminSetTitleDataResultEvent; + public event PlayFabRequestEvent OnAdminSetTitleDataAndOverridesRequestEvent; + public event PlayFabResultEvent OnAdminSetTitleDataAndOverridesResultEvent; + public event PlayFabRequestEvent OnAdminSetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminSetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminSetupPushNotificationRequestEvent; + public event PlayFabResultEvent OnAdminSetupPushNotificationResultEvent; + public event PlayFabRequestEvent OnAdminSubtractUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnAdminSubtractUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnAdminUpdateBansRequestEvent; + public event PlayFabResultEvent OnAdminUpdateBansResultEvent; + public event PlayFabRequestEvent OnAdminUpdateCatalogItemsRequestEvent; + public event PlayFabResultEvent OnAdminUpdateCatalogItemsResultEvent; + public event PlayFabRequestEvent OnAdminUpdateCloudScriptRequestEvent; + public event PlayFabResultEvent OnAdminUpdateCloudScriptResultEvent; + public event PlayFabRequestEvent OnAdminUpdateOpenIdConnectionRequestEvent; + public event PlayFabResultEvent OnAdminUpdateOpenIdConnectionResultEvent; + public event PlayFabRequestEvent OnAdminUpdatePlayerSharedSecretRequestEvent; + public event PlayFabResultEvent OnAdminUpdatePlayerSharedSecretResultEvent; + public event PlayFabRequestEvent OnAdminUpdatePlayerStatisticDefinitionRequestEvent; + public event PlayFabResultEvent OnAdminUpdatePlayerStatisticDefinitionResultEvent; + public event PlayFabRequestEvent OnAdminUpdatePolicyRequestEvent; + public event PlayFabResultEvent OnAdminUpdatePolicyResultEvent; + public event PlayFabRequestEvent OnAdminUpdateRandomResultTablesRequestEvent; + public event PlayFabResultEvent OnAdminUpdateRandomResultTablesResultEvent; + public event PlayFabRequestEvent OnAdminUpdateSegmentRequestEvent; + public event PlayFabResultEvent OnAdminUpdateSegmentResultEvent; + public event PlayFabRequestEvent OnAdminUpdateStoreItemsRequestEvent; + public event PlayFabResultEvent OnAdminUpdateStoreItemsResultEvent; + public event PlayFabRequestEvent OnAdminUpdateTaskRequestEvent; + public event PlayFabResultEvent OnAdminUpdateTaskResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnAdminUpdateUserTitleDisplayNameRequestEvent; + public event PlayFabResultEvent OnAdminUpdateUserTitleDisplayNameResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta new file mode 100644 index 00000000..6cca88a7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Admin/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 17d913d4a2b01d044a0f70f2679f2fca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication.meta new file mode 100644 index 00000000..5a285357 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 14f4be27db90b5d408494e5a681a55f6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs new file mode 100644 index 00000000..999d6b9f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs @@ -0,0 +1,104 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.AuthenticationModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// The Authentication APIs provide a convenient way to convert classic authentication responses into entity authentication + /// models. These APIs will provide you with the entity authentication token needed for subsequent Entity API calls. Manage + /// API keys for authenticating any entity. The game_server API is designed to create uniquely identifiable game_server + /// entities. The game_server Entity token can be used to call Matchmaking Lobby and Pubsub for server scenarios. + /// + public static class PlayFabAuthenticationAPI + { + static PlayFabAuthenticationAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Create a game_server entity token and return a new or existing game_server entity. + /// + public static void AuthenticateGameServerWithCustomId(AuthenticateCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/GameServerIdentity/AuthenticateGameServerWithCustomId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a game_server entity. + /// + public static void Delete(DeleteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/GameServerIdentity/Delete", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Method to exchange a legacy AuthenticationTicket or title SecretKey for an Entity Token or to refresh a still valid + /// Entity Token. + /// + public static void GetEntityToken(GetEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + AuthType authType = AuthType.None; +#if !DISABLE_PLAYFABCLIENT_API + if (context.IsClientLoggedIn()) { authType = AuthType.LoginSession; } +#endif +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFAB_SECRETKEY + if (callSettings.DeveloperSecretKey != null) { authType = AuthType.DevSecretKey; } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (context.IsEntityLoggedIn()) { authType = AuthType.EntityToken; } +#endif + + + PlayFabHttp.MakeApiCall("/Authentication/GetEntityToken", request, authType, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Method for a server to validate a client provided EntityToken. Only callable by the title entity. + /// + public static void ValidateEntityToken(ValidateEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Authentication/ValidateEntityToken", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta new file mode 100644 index 00000000..d24442f1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf5e0beea20361a45aee9c2329eafd01 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs new file mode 100644 index 00000000..67cc510b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs @@ -0,0 +1,121 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.AuthenticationModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// The Authentication APIs provide a convenient way to convert classic authentication responses into entity authentication + /// models. These APIs will provide you with the entity authentication token needed for subsequent Entity API calls. Manage + /// API keys for authenticating any entity. The game_server API is designed to create uniquely identifiable game_server + /// entities. The game_server Entity token can be used to call Matchmaking Lobby and Pubsub for server scenarios. + /// + public class PlayFabAuthenticationInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabAuthenticationInstanceAPI() + { + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabAuthenticationInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabAuthenticationInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + public PlayFabAuthenticationInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Create a game_server entity token and return a new or existing game_server entity. + /// + public void AuthenticateGameServerWithCustomId(AuthenticateCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/GameServerIdentity/AuthenticateGameServerWithCustomId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a game_server entity. + /// + public void Delete(DeleteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/GameServerIdentity/Delete", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Method to exchange a legacy AuthenticationTicket or title SecretKey for an Entity Token or to refresh a still valid + /// Entity Token. + /// + public void GetEntityToken(GetEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + AuthType authType = AuthType.None; +#if !DISABLE_PLAYFABCLIENT_API + if (context.IsClientLoggedIn()) { authType = AuthType.LoginSession; } +#endif +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || ENABLE_PLAYFAB_SECRETKEY + if (callSettings.DeveloperSecretKey != null) { authType = AuthType.DevSecretKey; } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (context.IsEntityLoggedIn()) { authType = AuthType.EntityToken; } +#endif + PlayFabHttp.MakeApiCall("/Authentication/GetEntityToken", request, authType, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Method for a server to validate a client provided EntityToken. Only callable by the title entity. + /// + public void ValidateEntityToken(ValidateEntityTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Authentication/ValidateEntityToken", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta new file mode 100644 index 00000000..a10fd8d6 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ecff04cca276a454aad3baf64c4a2ab4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs new file mode 100644 index 00000000..4fb7aa08 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs @@ -0,0 +1,233 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.AuthenticationModels +{ + /// + /// Create or return a game_server entity token. Caller must be a title entity. + /// + [Serializable] + public class AuthenticateCustomIdRequest : PlayFabRequestCommon + { + /// + /// The customId used to create and retrieve game_server entity tokens. This is unique at the title level. CustomId must be + /// between 32 and 100 characters. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class AuthenticateCustomIdResult : PlayFabResultCommon + { + /// + /// The token generated used to set X-EntityToken for game_server calls. + /// + public EntityTokenResponse EntityToken; + /// + /// True if the account was newly created on this authentication. + /// + public bool NewlyCreated; + } + + /// + /// Delete a game_server entity. The caller can be the game_server entity attempting to delete itself. Or a title entity + /// attempting to delete game_server entities for this title. + /// + [Serializable] + public class DeleteRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The game_server entity to be removed. + /// + public EntityKey Entity; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityLineage : PlayFabBaseModel + { + /// + /// The Character Id of the associated entity. + /// + public string CharacterId; + /// + /// The Group Id of the associated entity. + /// + public string GroupId; + /// + /// The Master Player Account Id of the associated entity. + /// + public string MasterPlayerAccountId; + /// + /// The Namespace Id of the associated entity. + /// + public string NamespaceId; + /// + /// The Title Id of the associated entity. + /// + public string TitleId; + /// + /// The Title Player Account Id of the associated entity. + /// + public string TitlePlayerAccountId; + } + + [Serializable] + public class EntityTokenResponse : PlayFabBaseModel + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + /// + /// This API must be called with X-SecretKey, X-Authentication or X-EntityToken headers. An optional EntityKey may be + /// included to attempt to set the resulting EntityToken to a specific entity, however the entity must be a relation of the + /// caller, such as the master_player_account of a character. If sending X-EntityToken the account will be marked as freshly + /// logged in and will issue a new token. If using X-Authentication or X-EntityToken the header must still be valid and + /// cannot be expired or revoked. + /// + [Serializable] + public class GetEntityTokenRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetEntityTokenResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + public enum IdentifiedDeviceType + { + Unknown, + XboxOne, + Scarlett + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + /// + /// Given an entity token, validates that it hasn't expired or been revoked and will return details of the owner. + /// + [Serializable] + public class ValidateEntityTokenRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Client EntityToken + /// + public string EntityToken; + } + + [Serializable] + public class ValidateEntityTokenResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The authenticated device for this entity, for the given login + /// + public IdentifiedDeviceType? IdentifiedDeviceType; + /// + /// The identity provider for this entity, for the given login + /// + public LoginIdentityProvider? IdentityProvider; + /// + /// The ID issued by the identity provider, e.g. a XUID on Xbox Live + /// + public string IdentityProviderIssuedId; + /// + /// The lineage of this profile. + /// + public EntityLineage Lineage; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta new file mode 100644 index 00000000..defcd58c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabAuthenticationModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ec656500f922b0b4db8e13c80770e0d5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs new file mode 100644 index 00000000..0525cc11 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs @@ -0,0 +1,18 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.AuthenticationModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent; + public event PlayFabResultEvent OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent; + public event PlayFabRequestEvent OnAuthenticationDeleteRequestEvent; + public event PlayFabResultEvent OnAuthenticationDeleteResultEvent; + public event PlayFabRequestEvent OnAuthenticationGetEntityTokenRequestEvent; + public event PlayFabResultEvent OnAuthenticationGetEntityTokenResultEvent; + public event PlayFabRequestEvent OnAuthenticationValidateEntityTokenRequestEvent; + public event PlayFabResultEvent OnAuthenticationValidateEntityTokenResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta new file mode 100644 index 00000000..8ba2d25f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Authentication/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c3701fef92515c438633c5d41bf87c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client.meta new file mode 100644 index 00000000..c4bdb8f7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: ea91f77d2459767449ffe7e92185faa3 +folderAsset: yes +timeCreated: 1468524875 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs new file mode 100644 index 00000000..abc79e18 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs @@ -0,0 +1,2323 @@ +#if !DISABLE_PLAYFABCLIENT_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ClientModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// APIs which provide the full range of PlayFab features available to the client - authentication, account and data + /// management, inventory, friends, matchmaking, reporting, and platform-specific functionality + /// + public static class PlayFabClientAPI + { + static PlayFabClientAPI() {} + + /// + /// Verify client login. + /// + public static bool IsClientLoggedIn() + { + return PlayFabSettings.staticPlayer.IsClientLoggedIn(); + } + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Accepts an open trade (one that has not yet been accepted or cancelled), if the locally signed-in player is in the + /// allowed player list for the trade, or it is open to all players. If the call is successful, the offered and accepted + /// items will be swapped between the two players' inventories. + /// + public static void AcceptTrade(AcceptTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AcceptTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the PlayFab user, based upon a match against a supplied unique identifier, to the friend list of the local user. At + /// least one of FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public static void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public static void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds or updates a contact email to the player's profile. + /// + public static void AddOrUpdateContactEmail(AddOrUpdateContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddOrUpdateContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group can add new members. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds playfab username/password auth to an existing account created via an anonymous auth method, e.g. automatic device + /// ID login. + /// + public static void AddUsernamePassword(AddUsernamePasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddUsernamePassword", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Increments the user's balance of the specified virtual currency by the stated amount + /// + public static void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AddUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers the Android device to receive push notifications + /// + public static void AndroidDevicePushNotificationRegistration(AndroidDevicePushNotificationRegistrationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AndroidDevicePushNotificationRegistration", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Attributes an install for advertisment. + /// + public static void AttributeInstall(AttributeInstallRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/AttributeInstall", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancels an open trade (one that has not yet been accepted or cancelled). Note that only the player who created the trade + /// can cancel it via this API call, to prevent griefing of the trade system (cancelling trades in order to prevent other + /// players from accepting them, for trades that can be claimed by more than one player). + /// + public static void CancelTrade(CancelTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/CancelTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Confirms with the payment provider that the purchase was approved (if applicable) and adjusts inventory and virtual + /// currency balances as appropriate + /// + public static void ConfirmPurchase(ConfirmPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConfirmPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's inventory. + /// + public static void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumeItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the player's current entitlements from Microsoft Store's Collection API + /// + public static void ConsumeMicrosoftStoreEntitlements(ConsumeMicrosoftStoreEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumeMicrosoftStoreEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed (if they're consumables) and added as + /// PlayFab items + /// + public static void ConsumePS5Entitlements(ConsumePS5EntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumePS5Entitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed and added as PlayFab items + /// + public static void ConsumePSNEntitlements(ConsumePSNEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumePSNEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the player's current entitlements from Xbox Live, consuming all availble items in Xbox and granting them to the + /// player's PlayFab inventory. This call is idempotent and will not grant previously granted items to the player. + /// + public static void ConsumeXboxEntitlements(ConsumeXboxEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ConsumeXboxEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. Upon creation, the current user will be the only member of the group. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/CreateSharedGroup", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public static void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + public static void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn, "Must be logged in to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the user's PlayFab account details + /// + public static void GetAccountInfo(GetAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetAccountInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns a list of ad placements and a reward for each + /// + public static void GetAdPlacements(GetAdPlacementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetAdPlacements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public static void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetAllUsersCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public static void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCatalogItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the character which is readable and writable by the client + /// + public static void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the specified character's current inventory of virtual goods + /// + public static void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the character which can only be read by the client + /// + public static void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the details of all title-specific statistics for the user + /// + public static void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public static void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetContentDownloadUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get details about all current running game servers matching the given parameters. + /// + [Obsolete("Use 'MultiplayerServer/ListMultiplayerServers' instead", true)] + public static void GetCurrentGames(CurrentGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetCurrentGames", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, starting from the indicated point in + /// the leaderboard + /// + public static void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, centered on the requested PlayFab + /// user. If PlayFabId is empty or null will return currently logged in user. + /// + public static void GetFriendLeaderboardAroundPlayer(GetFriendLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current friend list for the local user, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public static void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetFriendsList", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get details about the regions hosting game servers matching the given parameters. + /// + [Obsolete("Use 'MultiplayerServer/ListMultiplayerServers' instead", true)] + public static void GetGameServerRegions(GameServerRegionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetGameServerRegions", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested Character ID + /// + public static void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundCharacter", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the requested player. If PlayFabId is empty or + /// null will return currently logged in user. + /// + public static void GetLeaderboardAroundPlayer(GetLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public static void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardForUserCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// For payments flows where the provider requires playfab (the fulfiller) to initiate the transaction, but the client + /// completes the rest of the flow. In the Xsolla case, the token returned here will be passed to Xsolla by the client to + /// create a cart. Poll GetPurchase using the returned OrderId once you've completed the payment. + /// + public static void GetPaymentToken(GetPaymentTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPaymentToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a Photon custom authentication token that can be used to securely join the player into a Photon room. See + /// https://docs.microsoft.com/gaming/playfab/features/multiplayer/photon/quickstart for more details. + /// + public static void GetPhotonAuthenticationToken(GetPhotonAuthenticationTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPhotonAuthenticationToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves all of the user's different kinds of info. + /// + public static void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerCombinedInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the player's profile + /// + public static void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerProfile", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public static void GetPlayerSegments(GetPlayerSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerSegments", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the indicated statistics (current version and values for all statistics, if none are specified), for the local + /// player. + /// + public static void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public static void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatisticVersions", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public static void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets all trades the player has either opened or accepted, optionally filtered by trade status. + /// + public static void GetPlayerTrades(GetPlayerTradesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayerTrades", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public static void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Game identifiers. + /// + public static void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Game Center identifiers (referenced in the Game Center + /// Programming Guide as the Player Identifier). + /// + public static void GetPlayFabIDsFromGameCenterIDs(GetPlayFabIDsFromGameCenterIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGameCenterIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public static void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGenericIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google identifiers. The Google identifiers are the IDs for + /// the user accounts, available as "id" in the Google+ People API calls. + /// + public static void GetPlayFabIDsFromGoogleIDs(GetPlayFabIDsFromGoogleIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGoogleIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google Play Games identifiers. The Google Play Games + /// identifiers are the IDs for the user accounts, available as "playerId" in the Google Play Games Services - Players API + /// calls. + /// + public static void GetPlayFabIDsFromGooglePlayGamesPlayerIDs(GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGooglePlayGamesPlayerIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Kongregate identifiers. The Kongregate identifiers are the + /// IDs for the user accounts, available as "user_id" from the Kongregate API methods(ex: + /// http://developers.kongregate.com/docs/client/getUserId). + /// + public static void GetPlayFabIDsFromKongregateIDs(GetPlayFabIDsFromKongregateIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromKongregateIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public static void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public static void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public static void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public static void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromSteamIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public static void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromTwitchIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public static void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public static void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a purchase along with its current PlayFab status. Returns inventory items from the purchase that are still + /// active. + /// + public static void GetPurchase(GetPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. Non-members of the group + /// may use this to retrieve group data, including membership, but they will not receive data for keys marked as private. + /// Shared Groups are designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the set of items defined for the specified store, including all prices defined + /// + public static void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetStoreItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current server time + /// + public static void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTime", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public static void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTitleData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public static void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTitleNews", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns the title's base 64 encoded RSA CSP blob. + /// + public static void GetTitlePublicKey(GetTitlePublicKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + + + PlayFabHttp.MakeApiCall("/Client/GetTitlePublicKey", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the current status of an existing trade. + /// + public static void GetTradeStatus(GetTradeStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetTradeStatus", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the user's current inventory of virtual goods + /// + public static void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public static void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public static void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GetUserReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public static void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/GrantCharacterToUser", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Android device identifier to the user's PlayFab account + /// + public static void LinkAndroidDeviceID(LinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Apple account associated with the token to the user's PlayFab account. + /// + public static void LinkApple(LinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the custom identifier, generated by the title, to the user's PlayFab account + /// + public static void LinkCustomID(LinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Facebook account associated with the provided Facebook access token to the user's PlayFab account + /// + public static void LinkFacebookAccount(LinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Facebook Instant Games Id to the user's PlayFab account + /// + public static void LinkFacebookInstantGamesId(LinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Game Center account associated with the provided Game Center ID to the user's PlayFab account. Logging in with + /// a Game Center ID is insecure if you do not include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters + /// in this request. It is recommended you require these parameters on all Game Center calls by going to the Apple Add-ons + /// page in the PlayFab Game Manager and enabling the 'Require secure authentication only for this app' option. + /// + public static void LinkGameCenterAccount(LinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the currently signed-in user account to their Google account, using their Google account credentials + /// + public static void LinkGoogleAccount(LinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the currently signed-in user account to their Google Play Games account, using their Google Play Games account + /// credentials + /// + public static void LinkGooglePlayGamesServicesAccount(LinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the vendor-specific iOS device identifier to the user's PlayFab account + /// + public static void LinkIOSDeviceID(LinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Kongregate identifier to the user's PlayFab account + /// + public static void LinkKongregate(LinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account. + /// + public static void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public static void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links an OpenID Connect account to a user's PlayFab account, based on an existing relationship between a title and an + /// Open ID Connect provider and the OpenId Connect JWT from that provider. + /// + public static void LinkOpenIdConnect(LinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public static void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Steam account associated with the provided Steam authentication ticket to the user's PlayFab account + /// + public static void LinkSteamAccount(LinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Twitch account associated with the token to the user's PlayFab account. + /// + public static void LinkTwitch(LinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public static void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/LinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using the Android device identifier, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public static void LoginWithAndroidDeviceID(LoginWithAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithAndroidDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs in the user with a Sign in with Apple identity token. + /// + public static void LoginWithApple(LoginWithAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithApple", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a custom unique identifier generated by the title, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public static void LoginWithCustomID(LoginWithCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithCustomID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithEmailAddress does not permit the + /// creation of new accounts via the CreateAccountFlag. Email addresses may be used to create accounts via + /// RegisterPlayFabUser. + /// + public static void LoginWithEmailAddress(LoginWithEmailAddressRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithEmailAddress", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Facebook access token, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public static void LoginWithFacebook(LoginWithFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebook", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Facebook Instant Games ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user. Requires Facebook Instant Games to be configured. + /// + public static void LoginWithFacebookInstantGamesId(LoginWithFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebookInstantGamesId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using an iOS Game Center player identifier, returning a session identifier that can subsequently be + /// used for API calls which require an authenticated user. Logging in with a Game Center ID is insecure if you do not + /// include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters in this request. It is recommended you + /// require these parameters on all Game Center calls by going to the Apple Add-ons page in the PlayFab Game Manager and + /// enabling the 'Require secure authentication only for this app' option. + /// + public static void LoginWithGameCenter(LoginWithGameCenterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithGameCenter", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using their Google account credentials + /// + public static void LoginWithGoogleAccount(LoginWithGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithGoogleAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using their Google Play Games account credentials + /// + public static void LoginWithGooglePlayGamesServices(LoginWithGooglePlayGamesServicesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithGooglePlayGamesServices", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using the vendor-specific iOS device identifier, returning a session identifier that can subsequently + /// be used for API calls which require an authenticated user + /// + public static void LoginWithIOSDeviceID(LoginWithIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithIOSDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Kongregate player account. + /// + public static void LoginWithKongregate(LoginWithKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithKongregate", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs in the user with a Nintendo service account token. + /// + public static void LoginWithNintendoServiceAccount(LoginWithNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoServiceAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Nintendo Switch Device ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public static void LoginWithNintendoSwitchDeviceId(LoginWithNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoSwitchDeviceId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Logs in a user with an Open ID Connect JWT created by an existing relationship between a title and an Open ID Connect + /// provider. + /// + public static void LoginWithOpenIdConnect(LoginWithOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithOpenIdConnect", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithPlayFab does not permit the creation of + /// new accounts via the CreateAccountFlag. Username/Password credentials may be used to create accounts via + /// RegisterPlayFabUser, or added to existing accounts using AddUsernamePassword. + /// + public static void LoginWithPlayFab(LoginWithPlayFabRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithPlayFab", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a PlayStation :tm: Network authentication code, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public static void LoginWithPSN(LoginWithPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithPSN", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Steam authentication ticket, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public static void LoginWithSteam(LoginWithSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithSteam", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Twitch access token. + /// + public static void LoginWithTwitch(LoginWithTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithTwitch", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Xbox Live Token, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user + /// + public static void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/LoginWithXbox", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Attempts to locate a game session matching the given parameters. If the goal is to match the player into a specific + /// active session, only the LobbyId is required. Otherwise, the BuildVersion, GameMode, and Region are all required + /// parameters. Note that parameters specified in the search are required (they are not weighting factors). If a slot is + /// found in a server instance matching the parameters, the slot will be assigned to that player, removing it from the + /// availabe set. In that case, the information on the game session will be returned, otherwise the Status returned will be + /// GameNotFound. + /// + [Obsolete("Use 'Match/CreateMatchmakingTicket' instead", true)] + public static void Matchmake(MatchmakeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/Matchmake", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Opens a new outstanding trade. Note that a given item instance may only be in one open trade at a time. + /// + public static void OpenTrade(OpenTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/OpenTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Selects a payment option for purchase order created via StartPurchase + /// + public static void PayForPurchase(PayForPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/PayForPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Buys a single item with virtual currency. You must specify both the virtual currency to use to purchase, as well as what + /// the client believes the price to be. This lets the server fail the purchase if the price has changed. + /// + public static void PurchaseItem(PurchaseItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/PurchaseItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public static void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RedeemCoupon", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Uses the supplied OAuth code to refresh the internally cached player PlayStation :tm: Network auth token + /// + public static void RefreshPSNAuthToken(RefreshPSNAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RefreshPSNAuthToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers the iOS device to receive push notifications + /// + public static void RegisterForIOSPushNotification(RegisterForIOSPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RegisterForIOSPushNotification", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers a new Playfab user account, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user. You must supply either a username or an email address. + /// + public static void RegisterPlayFabUser(RegisterPlayFabUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + + + PlayFabHttp.MakeApiCall("/Client/RegisterPlayFabUser", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a contact email from the player's profile. + /// + public static void RemoveContactEmail(RemoveContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a specified user from the friend list of the local user + /// + public static void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public static void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RemoveSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Report player's ad activity + /// + public static void ReportAdActivity(ReportAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ReportAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Write a PlayStream event to describe the provided player device information. This API method is not designed to be + /// called directly by developers. Each PlayFab client SDK will eventually report this information automatically. + /// + public static void ReportDeviceInfo(DeviceInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ReportDeviceInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report for another player (due to bad bahavior, etc.), so that customer service representatives for the title + /// can take action concerning potentially toxic players. + /// + public static void ReportPlayer(ReportPlayerClientRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ReportPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Restores all in-app purchases based on the given restore receipt + /// + public static void RestoreIOSPurchases(RestoreIOSPurchasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RestoreIOSPurchases", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Reward player's ad activity + /// + public static void RewardAdActivity(RewardAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/RewardAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public static void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + + + PlayFabHttp.MakeApiCall("/Client/SendAccountRecoveryEmail", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the tag list for a specified user in the friend list of the local user + /// + public static void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/SetFriendTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public static void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/SetPlayerSecret", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates an order for a list of items from the title catalog + /// + public static void StartPurchase(StartPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/StartPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make a VC + /// balance negative with this API. + /// + public static void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/SubtractUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Android device identifier from the user's PlayFab account + /// + public static void UnlinkAndroidDeviceID(UnlinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Apple account from the user's PlayFab account. + /// + public static void UnlinkApple(UnlinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related custom identifier from the user's PlayFab account + /// + public static void UnlinkCustomID(UnlinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Facebook account from the user's PlayFab account + /// + public static void UnlinkFacebookAccount(UnlinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Facebook Instant Game Ids from the user's PlayFab account + /// + public static void UnlinkFacebookInstantGamesId(UnlinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Game Center account from the user's PlayFab account + /// + public static void UnlinkGameCenterAccount(UnlinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Google account from the user's PlayFab account + /// (https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#public-methods). + /// + public static void UnlinkGoogleAccount(UnlinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Google Play Games account from the user's PlayFab account. + /// + public static void UnlinkGooglePlayGamesServicesAccount(UnlinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related iOS device identifier from the user's PlayFab account + /// + public static void UnlinkIOSDeviceID(UnlinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Kongregate identifier from the user's PlayFab account + /// + public static void UnlinkKongregate(UnlinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account. + /// + public static void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public static void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks an OpenID Connect account from a user's PlayFab account, based on the connection ID of an existing relationship + /// between a title and an Open ID Connect provider. + /// + public static void UnlinkOpenIdConnect(UnlinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public static void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Steam account from the user's PlayFab account + /// + public static void UnlinkSteamAccount(UnlinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Twitch account from the user's PlayFab account. + /// + public static void UnlinkTwitch(UnlinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public static void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Opens the specified container, with the specified key (when required), and returns the contents of the opened container. + /// If the container (and key when relevant) are consumable (RemainingUses > 0), their RemainingUses will be decremented, + /// consistent with the operation of ConsumeItem. + /// + public static void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlockContainerInstance", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Searches target inventory for an ItemInstance matching the given CatalogItemId, if necessary unlocks it using an + /// appropriate key, and returns the contents of the opened container. If the container (and key when relevant) are + /// consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public static void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UnlockContainerItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update the avatar URL of the player + /// + public static void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateAvatarUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public static void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character. By default, clients are not + /// permitted to update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public static void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the user. By default, clients are not permitted to + /// update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public static void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdatePlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group can update the data. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the title-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates and updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title specific display name for the user + /// + public static void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/UpdateUserTitleDisplayName", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Validates with Amazon that the receipt for an Amazon App Store in-app purchase is valid and that it matches the + /// purchased catalog item + /// + public static void ValidateAmazonIAPReceipt(ValidateAmazonReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateAmazonIAPReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Validates a Google Play purchase and gives the corresponding item to the player. + /// + public static void ValidateGooglePlayPurchase(ValidateGooglePlayPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateGooglePlayPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Validates with the Apple store that the receipt for an iOS in-app purchase is valid and that it matches the purchased + /// catalog item + /// + public static void ValidateIOSReceipt(ValidateIOSReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateIOSReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Validates with Windows that the receipt for an Windows App Store in-app purchase is valid and that it matches the + /// purchased catalog item + /// + public static void ValidateWindowsStoreReceipt(ValidateWindowsReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/ValidateWindowsStoreReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public static void WriteCharacterEvent(WriteClientCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/WriteCharacterEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public static void WritePlayerEvent(WriteClientPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/WritePlayerEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public static void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Client/WriteTitleEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta new file mode 100644 index 00000000..2050daf5 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 90390500e82fe784caf147e8a6dee649 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs new file mode 100644 index 00000000..c5479e97 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs @@ -0,0 +1,2016 @@ +#if !DISABLE_PLAYFABCLIENT_API + +using System; +using System.Collections.Generic; +using PlayFab.ClientModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// APIs which provide the full range of PlayFab features available to the client - authentication, account and data + /// management, inventory, friends, matchmaking, reporting, and platform-specific functionality + /// + public class PlayFabClientInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabClientInstanceAPI() + { + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabClientInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + authenticationContext = new PlayFabAuthenticationContext(); + } + + public PlayFabClientInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + public PlayFabClientInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context ?? new PlayFabAuthenticationContext(); + } + + /// + /// Verify client login. + /// + public bool IsClientLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsClientLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Accepts an open trade (one that has not yet been accepted or cancelled), if the locally signed-in player is in the + /// allowed player list for the trade, or it is open to all players. If the call is successful, the offered and accepted + /// items will be swapped between the two players' inventories. + /// + public void AcceptTrade(AcceptTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AcceptTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the PlayFab user, based upon a match against a supplied unique identifier, to the friend list of the local user. At + /// least one of FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds or updates a contact email to the player's profile. + /// + public void AddOrUpdateContactEmail(AddOrUpdateContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddOrUpdateContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group can add new members. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds playfab username/password auth to an existing account created via an anonymous auth method, e.g. automatic device + /// ID login. + /// + public void AddUsernamePassword(AddUsernamePasswordRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddUsernamePassword", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Increments the user's balance of the specified virtual currency by the stated amount + /// + public void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AddUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers the Android device to receive push notifications + /// + public void AndroidDevicePushNotificationRegistration(AndroidDevicePushNotificationRegistrationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AndroidDevicePushNotificationRegistration", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Attributes an install for advertisment. + /// + public void AttributeInstall(AttributeInstallRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/AttributeInstall", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancels an open trade (one that has not yet been accepted or cancelled). Note that only the player who created the trade + /// can cancel it via this API call, to prevent griefing of the trade system (cancelling trades in order to prevent other + /// players from accepting them, for trades that can be claimed by more than one player). + /// + public void CancelTrade(CancelTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/CancelTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Confirms with the payment provider that the purchase was approved (if applicable) and adjusts inventory and virtual + /// currency balances as appropriate + /// + public void ConfirmPurchase(ConfirmPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConfirmPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's inventory. + /// + public void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumeItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the player's current entitlements from Microsoft Store's Collection API + /// + public void ConsumeMicrosoftStoreEntitlements(ConsumeMicrosoftStoreEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumeMicrosoftStoreEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed (if they're consumables) and added as + /// PlayFab items + /// + public void ConsumePS5Entitlements(ConsumePS5EntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumePS5Entitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Checks for any new consumable entitlements. If any are found, they are consumed and added as PlayFab items + /// + public void ConsumePSNEntitlements(ConsumePSNEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumePSNEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the player's current entitlements from Xbox Live, consuming all availble items in Xbox and granting them to the + /// player's PlayFab inventory. This call is idempotent and will not grant previously granted items to the player. + /// + public void ConsumeXboxEntitlements(ConsumeXboxEntitlementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ConsumeXboxEntitlements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. Upon creation, the current user will be the only member of the group. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/CreateSharedGroup", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + public void ExecuteCloudScript(ExecuteCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn, "Must be logged in to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Client/ExecuteCloudScript", request, AuthType.LoginSession, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the user's PlayFab account details + /// + public void GetAccountInfo(GetAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetAccountInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns a list of ad placements and a reward for each + /// + public void GetAdPlacements(GetAdPlacementsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetAdPlacements", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetAllUsersCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCatalogItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the character which is readable and writable by the client + /// + public void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the specified character's current inventory of virtual goods + /// + public void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the character which can only be read by the client + /// + public void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the details of all title-specific statistics for the user + /// + public void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetContentDownloadUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get details about all current running game servers matching the given parameters. + /// + [Obsolete("Use 'MultiplayerServer/ListMultiplayerServers' instead", true)] + public void GetCurrentGames(CurrentGamesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetCurrentGames", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, starting from the indicated point in + /// the leaderboard + /// + public void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked friends of the current player for the given statistic, centered on the requested PlayFab + /// user. If PlayFabId is empty or null will return currently logged in user. + /// + public void GetFriendLeaderboardAroundPlayer(GetFriendLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetFriendLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current friend list for the local user, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetFriendsList", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get details about the regions hosting game servers matching the given parameters. + /// + [Obsolete("Use 'MultiplayerServer/ListMultiplayerServers' instead", true)] + public void GetGameServerRegions(GameServerRegionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetGameServerRegions", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboard", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested Character ID + /// + public void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundCharacter", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the requested player. If PlayFabId is empty or + /// null will return currently logged in user. + /// + public void GetLeaderboardAroundPlayer(GetLeaderboardAroundPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardAroundPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetLeaderboardForUserCharacters", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// For payments flows where the provider requires playfab (the fulfiller) to initiate the transaction, but the client + /// completes the rest of the flow. In the Xsolla case, the token returned here will be passed to Xsolla by the client to + /// create a cart. Poll GetPurchase using the returned OrderId once you've completed the payment. + /// + public void GetPaymentToken(GetPaymentTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPaymentToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a Photon custom authentication token that can be used to securely join the player into a Photon room. See + /// https://docs.microsoft.com/gaming/playfab/features/multiplayer/photon/quickstart for more details. + /// + public void GetPhotonAuthenticationToken(GetPhotonAuthenticationTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPhotonAuthenticationToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves all of the user's different kinds of info. + /// + public void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerCombinedInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the player's profile + /// + public void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerProfile", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public void GetPlayerSegments(GetPlayerSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerSegments", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the indicated statistics (current version and values for all statistics, if none are specified), for the local + /// player. + /// + public void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerStatisticVersions", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets all trades the player has either opened or accepted, optionally filtered by trade status. + /// + public void GetPlayerTrades(GetPlayerTradesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayerTrades", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Game identifiers. + /// + public void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Game Center identifiers (referenced in the Game Center + /// Programming Guide as the Player Identifier). + /// + public void GetPlayFabIDsFromGameCenterIDs(GetPlayFabIDsFromGameCenterIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGameCenterIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGenericIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google identifiers. The Google identifiers are the IDs for + /// the user accounts, available as "id" in the Google+ People API calls. + /// + public void GetPlayFabIDsFromGoogleIDs(GetPlayFabIDsFromGoogleIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGoogleIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Google Play Games identifiers. The Google Play Games + /// identifiers are the IDs for the user accounts, available as "playerId" in the Google Play Games Services - Players API + /// calls. + /// + public void GetPlayFabIDsFromGooglePlayGamesPlayerIDs(GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromGooglePlayGamesPlayerIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Kongregate identifiers. The Kongregate identifiers are the + /// IDs for the user accounts, available as "user_id" from the Kongregate API methods(ex: + /// http://developers.kongregate.com/docs/client/getUserId). + /// + public void GetPlayFabIDsFromKongregateIDs(GetPlayFabIDsFromKongregateIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromKongregateIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromSteamIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromTwitchIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a purchase along with its current PlayFab status. Returns inventory items from the purchase that are still + /// active. + /// + public void GetPurchase(GetPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. Non-members of the group + /// may use this to retrieve group data, including membership, but they will not receive data for keys marked as private. + /// Shared Groups are designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the set of items defined for the specified store, including all prices defined + /// + public void GetStoreItems(GetStoreItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetStoreItems", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current server time + /// + public void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTime", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTitleData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTitleNews", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns the title's base 64 encoded RSA CSP blob. + /// + public void GetTitlePublicKey(GetTitlePublicKeyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + PlayFabHttp.MakeApiCall("/Client/GetTitlePublicKey", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the current status of an existing trade. + /// + public void GetTradeStatus(GetTradeStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetTradeStatus", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the user's current inventory of virtual goods + /// + public void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserInventory", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserPublisherReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GetUserReadOnlyData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/GrantCharacterToUser", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Android device identifier to the user's PlayFab account + /// + public void LinkAndroidDeviceID(LinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Apple account associated with the token to the user's PlayFab account. + /// + public void LinkApple(LinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the custom identifier, generated by the title, to the user's PlayFab account + /// + public void LinkCustomID(LinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Facebook account associated with the provided Facebook access token to the user's PlayFab account + /// + public void LinkFacebookAccount(LinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Facebook Instant Games Id to the user's PlayFab account + /// + public void LinkFacebookInstantGamesId(LinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Game Center account associated with the provided Game Center ID to the user's PlayFab account. Logging in with + /// a Game Center ID is insecure if you do not include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters + /// in this request. It is recommended you require these parameters on all Game Center calls by going to the Apple Add-ons + /// page in the PlayFab Game Manager and enabling the 'Require secure authentication only for this app' option. + /// + public void LinkGameCenterAccount(LinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the currently signed-in user account to their Google account, using their Google account credentials + /// + public void LinkGoogleAccount(LinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the currently signed-in user account to their Google Play Games account, using their Google Play Games account + /// credentials + /// + public void LinkGooglePlayGamesServicesAccount(LinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the vendor-specific iOS device identifier to the user's PlayFab account + /// + public void LinkIOSDeviceID(LinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Kongregate identifier to the user's PlayFab account + /// + public void LinkKongregate(LinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account. + /// + public void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links an OpenID Connect account to a user's PlayFab account, based on an existing relationship between a title and an + /// Open ID Connect provider and the OpenId Connect JWT from that provider. + /// + public void LinkOpenIdConnect(LinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Steam account associated with the provided Steam authentication ticket to the user's PlayFab account + /// + public void LinkSteamAccount(LinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Twitch account associated with the token to the user's PlayFab account. + /// + public void LinkTwitch(LinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/LinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using the Android device identifier, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public void LoginWithAndroidDeviceID(LoginWithAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithAndroidDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs in the user with a Sign in with Apple identity token. + /// + public void LoginWithApple(LoginWithAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithApple", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a custom unique identifier generated by the title, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public void LoginWithCustomID(LoginWithCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithCustomID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithEmailAddress does not permit the + /// creation of new accounts via the CreateAccountFlag. Email addresses may be used to create accounts via + /// RegisterPlayFabUser. + /// + public void LoginWithEmailAddress(LoginWithEmailAddressRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithEmailAddress", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Facebook access token, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public void LoginWithFacebook(LoginWithFacebookRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebook", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Facebook Instant Games ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user. Requires Facebook Instant Games to be configured. + /// + public void LoginWithFacebookInstantGamesId(LoginWithFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithFacebookInstantGamesId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using an iOS Game Center player identifier, returning a session identifier that can subsequently be + /// used for API calls which require an authenticated user. Logging in with a Game Center ID is insecure if you do not + /// include the optional PublicKeyUrl, Salt, Signature, and Timestamp parameters in this request. It is recommended you + /// require these parameters on all Game Center calls by going to the Apple Add-ons page in the PlayFab Game Manager and + /// enabling the 'Require secure authentication only for this app' option. + /// + public void LoginWithGameCenter(LoginWithGameCenterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithGameCenter", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using their Google account credentials + /// + public void LoginWithGoogleAccount(LoginWithGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithGoogleAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using their Google Play Games account credentials + /// + public void LoginWithGooglePlayGamesServices(LoginWithGooglePlayGamesServicesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithGooglePlayGamesServices", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using the vendor-specific iOS device identifier, returning a session identifier that can subsequently + /// be used for API calls which require an authenticated user + /// + public void LoginWithIOSDeviceID(LoginWithIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithIOSDeviceID", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Kongregate player account. + /// + public void LoginWithKongregate(LoginWithKongregateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithKongregate", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs in the user with a Nintendo service account token. + /// + public void LoginWithNintendoServiceAccount(LoginWithNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoServiceAccount", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Nintendo Switch Device ID, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public void LoginWithNintendoSwitchDeviceId(LoginWithNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithNintendoSwitchDeviceId", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Logs in a user with an Open ID Connect JWT created by an existing relationship between a title and an Open ID Connect + /// provider. + /// + public void LoginWithOpenIdConnect(LoginWithOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithOpenIdConnect", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user into the PlayFab account, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user. Unlike most other login API calls, LoginWithPlayFab does not permit the creation of + /// new accounts via the CreateAccountFlag. Username/Password credentials may be used to create accounts via + /// RegisterPlayFabUser, or added to existing accounts using AddUsernamePassword. + /// + public void LoginWithPlayFab(LoginWithPlayFabRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithPlayFab", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a PlayStation :tm: Network authentication code, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public void LoginWithPSN(LoginWithPSNRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithPSN", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Steam authentication ticket, returning a session identifier that can subsequently be used for + /// API calls which require an authenticated user + /// + public void LoginWithSteam(LoginWithSteamRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithSteam", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Twitch access token. + /// + public void LoginWithTwitch(LoginWithTwitchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithTwitch", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Xbox Live Token, returning a session identifier that can subsequently be used for API calls + /// which require an authenticated user + /// + public void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/LoginWithXbox", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Attempts to locate a game session matching the given parameters. If the goal is to match the player into a specific + /// active session, only the LobbyId is required. Otherwise, the BuildVersion, GameMode, and Region are all required + /// parameters. Note that parameters specified in the search are required (they are not weighting factors). If a slot is + /// found in a server instance matching the parameters, the slot will be assigned to that player, removing it from the + /// availabe set. In that case, the information on the game session will be returned, otherwise the Status returned will be + /// GameNotFound. + /// + [Obsolete("Use 'Match/CreateMatchmakingTicket' instead", true)] + public void Matchmake(MatchmakeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/Matchmake", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Opens a new outstanding trade. Note that a given item instance may only be in one open trade at a time. + /// + public void OpenTrade(OpenTradeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/OpenTrade", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Selects a payment option for purchase order created via StartPurchase + /// + public void PayForPurchase(PayForPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/PayForPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Buys a single item with virtual currency. You must specify both the virtual currency to use to purchase, as well as what + /// the client believes the price to be. This lets the server fail the purchase if the price has changed. + /// + public void PurchaseItem(PurchaseItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/PurchaseItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RedeemCoupon", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Uses the supplied OAuth code to refresh the internally cached player PlayStation :tm: Network auth token + /// + public void RefreshPSNAuthToken(RefreshPSNAuthTokenRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RefreshPSNAuthToken", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers the iOS device to receive push notifications + /// + public void RegisterForIOSPushNotification(RegisterForIOSPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RegisterForIOSPushNotification", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers a new Playfab user account, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user. You must supply either a username or an email address. + /// + public void RegisterPlayFabUser(RegisterPlayFabUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + request.TitleId = request.TitleId ?? callSettings.TitleId; + PlayFabHttp.MakeApiCall("/Client/RegisterPlayFabUser", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a contact email from the player's profile. + /// + public void RemoveContactEmail(RemoveContactEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveContactEmail", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a specified user from the friend list of the local user + /// + public void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveFriend", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveGenericID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RemoveSharedGroupMembers", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Report player's ad activity + /// + public void ReportAdActivity(ReportAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ReportAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Write a PlayStream event to describe the provided player device information. This API method is not designed to be + /// called directly by developers. Each PlayFab client SDK will eventually report this information automatically. + /// + public void ReportDeviceInfo(DeviceInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ReportDeviceInfo", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report for another player (due to bad bahavior, etc.), so that customer service representatives for the title + /// can take action concerning potentially toxic players. + /// + public void ReportPlayer(ReportPlayerClientRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ReportPlayer", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Restores all in-app purchases based on the given restore receipt + /// + public void RestoreIOSPurchases(RestoreIOSPurchasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RestoreIOSPurchases", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Reward player's ad activity + /// + public void RewardAdActivity(RewardAdActivityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/RewardAdActivity", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Forces an email to be sent to the registered email address for the user's account, with a link allowing the user to + /// change the password.If an account recovery email template ID is provided, an email using the custom email template will + /// be used. + /// + public void SendAccountRecoveryEmail(SendAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + PlayFabHttp.MakeApiCall("/Client/SendAccountRecoveryEmail", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the tag list for a specified user in the friend list of the local user + /// + public void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/SetFriendTags", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/SetPlayerSecret", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates an order for a list of items from the title catalog + /// + public void StartPurchase(StartPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/StartPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make a VC + /// balance negative with this API. + /// + public void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/SubtractUserVirtualCurrency", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Android device identifier from the user's PlayFab account + /// + public void UnlinkAndroidDeviceID(UnlinkAndroidDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkAndroidDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Apple account from the user's PlayFab account. + /// + public void UnlinkApple(UnlinkAppleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkApple", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related custom identifier from the user's PlayFab account + /// + public void UnlinkCustomID(UnlinkCustomIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkCustomID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Facebook account from the user's PlayFab account + /// + public void UnlinkFacebookAccount(UnlinkFacebookAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Facebook Instant Game Ids from the user's PlayFab account + /// + public void UnlinkFacebookInstantGamesId(UnlinkFacebookInstantGamesIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkFacebookInstantGamesId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Game Center account from the user's PlayFab account + /// + public void UnlinkGameCenterAccount(UnlinkGameCenterAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkGameCenterAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Google account from the user's PlayFab account + /// (https://developers.google.com/android/reference/com/google/android/gms/auth/GoogleAuthUtil#public-methods). + /// + public void UnlinkGoogleAccount(UnlinkGoogleAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkGoogleAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Google Play Games account from the user's PlayFab account. + /// + public void UnlinkGooglePlayGamesServicesAccount(UnlinkGooglePlayGamesServicesAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkGooglePlayGamesServicesAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related iOS device identifier from the user's PlayFab account + /// + public void UnlinkIOSDeviceID(UnlinkIOSDeviceIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkIOSDeviceID", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Kongregate identifier from the user's PlayFab account + /// + public void UnlinkKongregate(UnlinkKongregateAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkKongregate", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account. + /// + public void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoServiceAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkNintendoSwitchDeviceId", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks an OpenID Connect account from a user's PlayFab account, based on the connection ID of an existing relationship + /// between a title and an Open ID Connect provider. + /// + public void UnlinkOpenIdConnect(UnlinkOpenIdConnectRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkOpenIdConnect", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkPSNAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Steam account from the user's PlayFab account + /// + public void UnlinkSteamAccount(UnlinkSteamAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkSteamAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Twitch account from the user's PlayFab account. + /// + public void UnlinkTwitch(UnlinkTwitchAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkTwitch", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlinkXboxAccount", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Opens the specified container, with the specified key (when required), and returns the contents of the opened container. + /// If the container (and key when relevant) are consumable (RemainingUses > 0), their RemainingUses will be decremented, + /// consistent with the operation of ConsumeItem. + /// + public void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlockContainerInstance", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Searches target inventory for an ItemInstance matching the given CatalogItemId, if necessary unlocks it using an + /// appropriate key, and returns the contents of the opened container. If the container (and key when relevant) are + /// consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UnlockContainerItem", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update the avatar URL of the player + /// + public void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateAvatarUrl", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character. By default, clients are not + /// permitted to update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateCharacterStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the user. By default, clients are not permitted to + /// update statistics. Developers may override this setting in the Game Manager > Settings > API Features. + /// + public void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdatePlayerStatistics", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group can update the data. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateSharedGroupData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the title-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateUserData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates and updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateUserPublisherData", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title specific display name for the user + /// + public void UpdateUserTitleDisplayName(UpdateUserTitleDisplayNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/UpdateUserTitleDisplayName", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Validates with Amazon that the receipt for an Amazon App Store in-app purchase is valid and that it matches the + /// purchased catalog item + /// + public void ValidateAmazonIAPReceipt(ValidateAmazonReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateAmazonIAPReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Validates a Google Play purchase and gives the corresponding item to the player. + /// + public void ValidateGooglePlayPurchase(ValidateGooglePlayPurchaseRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateGooglePlayPurchase", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Validates with the Apple store that the receipt for an iOS in-app purchase is valid and that it matches the purchased + /// catalog item + /// + public void ValidateIOSReceipt(ValidateIOSReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateIOSReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Validates with Windows that the receipt for an Windows App Store in-app purchase is valid and that it matches the + /// purchased catalog item + /// + public void ValidateWindowsStoreReceipt(ValidateWindowsReceiptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/ValidateWindowsStoreReceipt", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public void WriteCharacterEvent(WriteClientCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/WriteCharacterEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public void WritePlayerEvent(WriteClientPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/WritePlayerEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsClientLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Client/WriteTitleEvent", request, AuthType.LoginSession, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta new file mode 100644 index 00000000..b7573e77 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ddd185cc4cdc40643a08607da563ddc4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs new file mode 100644 index 00000000..7ff6f176 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs @@ -0,0 +1,7754 @@ +#if !DISABLE_PLAYFABCLIENT_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ClientModels +{ + [Serializable] + public class AcceptTradeRequest : PlayFabRequestCommon + { + /// + /// Items from the accepting player's inventory in exchange for the offered items in the trade. In the case of a gift, this + /// will be null. + /// + public List AcceptedInventoryInstanceIds; + /// + /// Player who opened the trade. + /// + public string OfferingPlayerId; + /// + /// Trade identifier. + /// + public string TradeId; + } + + [Serializable] + public class AcceptTradeResponse : PlayFabResultCommon + { + /// + /// Details about trade which was just accepted. + /// + public TradeInfo Trade; + } + + public enum AdActivity + { + Opened, + Closed, + Start, + End + } + + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AddFriendRequest : PlayFabRequestCommon + { + /// + /// Email address of the user to attempt to add to the local user's friend list. + /// + public string FriendEmail; + /// + /// PlayFab identifier of the user to attempt to add to the local user's friend list. + /// + public string FriendPlayFabId; + /// + /// Title-specific display name of the user to attempt to add to the local user's friend list. + /// + public string FriendTitleDisplayName; + /// + /// PlayFab username of the user to attempt to add to the local user's friend list. + /// + public string FriendUsername; + } + + [Serializable] + public class AddFriendResult : PlayFabResultCommon + { + /// + /// True if the friend request was processed successfully. + /// + public bool Created; + } + + [Serializable] + public class AddGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to add to the player account. + /// + public GenericServiceId GenericId; + } + + [Serializable] + public class AddGenericIDResult : PlayFabResultCommon + { + } + + /// + /// This API adds a contact email to the player's profile. If the player's profile already contains a contact email, it will + /// update the contact email to the email address specified. + /// + [Serializable] + public class AddOrUpdateContactEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The new contact email to associate with the player. + /// + public string EmailAddress; + } + + [Serializable] + public class AddOrUpdateContactEmailResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class AddSharedGroupMembersResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddUsernamePasswordRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// PlayFab username for the account (3-20 characters) + /// + public string Username; + } + + /// + /// Each account must have a unique username and email address in the PlayFab service. Once created, the account may be + /// associated with additional accounts (Steam, Facebook, Game Center, etc.), allowing for added social network lists and + /// achievements systems. This can also be used to provide a recovery method if the user loses their original means of + /// access. + /// + [Serializable] + public class AddUsernamePasswordResult : PlayFabResultCommon + { + /// + /// PlayFab unique user name. + /// + public string Username; + } + + /// + /// This API must be enabled for use as an option in the game manager website. It is disabled by default. + /// + [Serializable] + public class AddUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + /// + /// A single ad placement details including placement and reward information + /// + [Serializable] + public class AdPlacementDetails : PlayFabBaseModel + { + /// + /// Placement unique ID + /// + public string PlacementId; + /// + /// Placement name + /// + public string PlacementName; + /// + /// If placement has viewing limits indicates how many views are left + /// + public int? PlacementViewsRemaining; + /// + /// If placement has viewing limits indicates when they will next reset + /// + public double? PlacementViewsResetMinutes; + /// + /// Optional URL to a reward asset + /// + public string RewardAssetUrl; + /// + /// Reward description + /// + public string RewardDescription; + /// + /// Reward unique ID + /// + public string RewardId; + /// + /// Reward name + /// + public string RewardName; + } + + /// + /// Details for each item granted + /// + [Serializable] + public class AdRewardItemGranted : PlayFabBaseModel + { + /// + /// Catalog ID + /// + public string CatalogId; + /// + /// Catalog item display name + /// + public string DisplayName; + /// + /// Inventory instance ID + /// + public string InstanceId; + /// + /// Item ID + /// + public string ItemId; + } + + /// + /// Details on what was granted to the player + /// + [Serializable] + public class AdRewardResults : PlayFabBaseModel + { + /// + /// Array of the items granted to the player + /// + public List GrantedItems; + /// + /// Dictionary of virtual currencies that were granted to the player + /// + public Dictionary GrantedVirtualCurrencies; + /// + /// Dictionary of statistics that were modified for the player + /// + public Dictionary IncrementedStatistics; + } + + /// + /// More information can be found on configuring your game for the Google Cloud Messaging service in the Google developer + /// documentation, here: http://developer.android.com/google/gcm/client.html. The steps to configure and send Push + /// Notifications is described in the PlayFab tutorials, here: + /// https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart. + /// + [Serializable] + public class AndroidDevicePushNotificationRegistrationRequest : PlayFabRequestCommon + { + /// + /// Message to display when confirming push notification. + /// + public string ConfirmationMessage; + /// + /// Registration ID provided by the Google Cloud Messaging service when the title registered to receive push notifications + /// (see the GCM documentation, here: http://developer.android.com/google/gcm/client.html). + /// + public string DeviceToken; + /// + /// If true, send a test push message immediately after sucessful registration. Defaults to false. + /// + public bool? SendPushNotificationConfirmation; + } + + [Serializable] + public class AndroidDevicePushNotificationRegistrationResult : PlayFabResultCommon + { + } + + /// + /// If you have an ad attribution partner enabled, this will post an install to their service to track the device. It uses + /// the given device id to match based on clicks on ads. + /// + [Serializable] + public class AttributeInstallRequest : PlayFabRequestCommon + { + /// + /// The adid for this device. + /// + public string Adid; + /// + /// The IdentifierForAdvertisers for iOS Devices. + /// + public string Idfa; + } + + [Serializable] + public class AttributeInstallResult : PlayFabResultCommon + { + } + + [Serializable] + public class CancelTradeRequest : PlayFabRequestCommon + { + /// + /// Trade identifier. + /// + public string TradeId; + } + + [Serializable] + public class CancelTradeResponse : PlayFabResultCommon + { + /// + /// Details about trade which was just canceled. + /// + public TradeInfo Trade; + } + + [Serializable] + public class CartItem : PlayFabBaseModel + { + /// + /// Description of the catalog item. + /// + public string Description; + /// + /// Display name for the catalog item. + /// + public string DisplayName; + /// + /// Class name to which catalog item belongs. + /// + public string ItemClass; + /// + /// Unique identifier for the catalog item. + /// + public string ItemId; + /// + /// Unique instance identifier for this catalog item. + /// + public string ItemInstanceId; + /// + /// Cost of the catalog item for each applicable real world currency. + /// + public Dictionary RealCurrencyPrices; + /// + /// Amount of each applicable virtual currency which will be received as a result of purchasing this catalog item. + /// + public Dictionary VCAmount; + /// + /// Cost of the catalog item for each applicable virtual currency. + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// A purchasable item from the item catalog + /// + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// defines the bundle properties for the item - bundles are items which contain other items, including random drop tables + /// and virtual currencies + /// + public CatalogItemBundleInfo Bundle; + /// + /// if true, then an item instance of this type can be used to grant a character to a user. + /// + public bool CanBecomeCharacter; + /// + /// catalog version for this item + /// + public string CatalogVersion; + /// + /// defines the consumable properties (number of uses, timeout) for the item + /// + public CatalogItemConsumableInfo Consumable; + /// + /// defines the container properties for the item - what items it contains, including random drop tables and virtual + /// currencies, and what item (if any) is required to open it via the UnlockContainerItem API + /// + public CatalogItemContainerInfo Container; + /// + /// game specific custom data + /// + public string CustomData; + /// + /// text description of item, to show in-game + /// + public string Description; + /// + /// text name for the item, to show in-game + /// + public string DisplayName; + /// + /// If the item has IsLImitedEdition set to true, and this is the first time this ItemId has been defined as a limited + /// edition item, this value determines the total number of instances to allocate for the title. Once this limit has been + /// reached, no more instances of this ItemId can be created, and attempts to purchase or grant it will return a Result of + /// false for that ItemId. If the item has already been defined to have a limited edition count, or if this value is less + /// than zero, it will be ignored. + /// + public int InitialLimitedEditionCount; + /// + /// BETA: If true, then only a fixed number can ever be granted. + /// + public bool IsLimitedEdition; + /// + /// if true, then only one item instance of this type will exist and its remaininguses will be incremented instead. + /// RemainingUses will cap out at Int32.Max (2,147,483,647). All subsequent increases will be discarded + /// + public bool IsStackable; + /// + /// if true, then an item instance of this type can be traded between players using the trading APIs + /// + public bool IsTradable; + /// + /// class to which the item belongs + /// + public string ItemClass; + /// + /// unique identifier for this item + /// + public string ItemId; + /// + /// URL to the item image. For Facebook purchase to display the image on the item purchase page, this must be set to an HTTP + /// URL. + /// + public string ItemImageUrl; + /// + /// override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// list of item tags + /// + public List Tags; + /// + /// price of this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + [Serializable] + public class CatalogItemBundleInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory when the bundle is added + /// + public List BundledItems; + /// + /// unique TableId values for all RandomResultTable objects which are part of the bundle (random tables will be resolved and + /// add the relevant items to the player inventory when the bundle is added) + /// + public List BundledResultTables; + /// + /// virtual currency types and balances which will be added to the player inventory when the bundle is added + /// + public Dictionary BundledVirtualCurrencies; + } + + [Serializable] + public class CatalogItemConsumableInfo : PlayFabBaseModel + { + /// + /// number of times this object can be used, after which it will be removed from the player inventory + /// + public uint? UsageCount; + /// + /// duration in seconds for how long the item will remain in the player inventory - once elapsed, the item will be removed + /// (recommended minimum value is 5 seconds, as lower values can cause the item to expire before operations depending on + /// this item's details have completed) + /// + public uint? UsagePeriod; + /// + /// all inventory item instances in the player inventory sharing a non-null UsagePeriodGroup have their UsagePeriod values + /// added together, and share the result - when that period has elapsed, all the items in the group will be removed + /// + public string UsagePeriodGroup; + } + + /// + /// Containers are inventory items that can hold other items defined in the catalog, as well as virtual currency, which is + /// added to the player inventory when the container is unlocked, using the UnlockContainerItem API. The items can be + /// anything defined in the catalog, as well as RandomResultTable objects which will be resolved when the container is + /// unlocked. Containers and their keys should be defined as Consumable (having a limited number of uses) in their catalog + /// defintiions, unless the intent is for the player to be able to re-use them infinitely. + /// + [Serializable] + public class CatalogItemContainerInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory, once the container has been unlocked + /// + public List ItemContents; + /// + /// ItemId for the catalog item used to unlock the container, if any (if not specified, a call to UnlockContainerItem will + /// open the container, adding the contents to the player inventory and currency balances) + /// + public string KeyItemId; + /// + /// unique TableId values for all RandomResultTable objects which are part of the container (once unlocked, random tables + /// will be resolved and add the relevant items to the player inventory) + /// + public List ResultTableContents; + /// + /// virtual currency types and balances which will be added to the player inventory when the container is unlocked + /// + public Dictionary VirtualCurrencyContents; + } + + [Serializable] + public class CharacterInventory : PlayFabBaseModel + { + /// + /// The id of this character. + /// + public string CharacterId; + /// + /// The inventory of this character. + /// + public List Inventory; + } + + [Serializable] + public class CharacterLeaderboardEntry : PlayFabBaseModel + { + /// + /// PlayFab unique identifier of the character that belongs to the user for this leaderboard entry. + /// + public string CharacterId; + /// + /// Title-specific display name of the character for this leaderboard entry. + /// + public string CharacterName; + /// + /// Name of the character class for this entry. + /// + public string CharacterType; + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class CharacterResult : PlayFabBaseModel + { + /// + /// The id for this character on this player. + /// + public string CharacterId; + /// + /// The name of this character. + /// + public string CharacterName; + /// + /// The type-string that was given to this character on creation. + /// + public string CharacterType; + } + + public enum CloudScriptRevisionOption + { + Live, + Latest, + Specific + } + + /// + /// Collection filter to include and/or exclude collections with certain key-value pairs. The filter generates a collection + /// set defined by Includes rules and then remove collections that matches the Excludes rules. A collection is considered + /// matching a rule if the rule describes a subset of the collection. + /// + [Serializable] + public class CollectionFilter : PlayFabBaseModel + { + /// + /// List of Exclude rules, with any of which if a collection matches, it is excluded by the filter. + /// + public List Excludes; + /// + /// List of Include rules, with any of which if a collection matches, it is included by the filter, unless it is excluded by + /// one of the Exclude rule + /// + public List Includes; + } + + /// + /// The final step in the purchasing process, this API finalizes the purchase with the payment provider, where applicable, + /// adding virtual goods to the player inventory (including random drop table resolution and recursive addition of bundled + /// items) and adjusting virtual currency balances for funds used or added. Note that this is a pull operation, and should + /// be polled regularly when a purchase is in progress. Please note that the processing time for inventory grants and + /// purchases increases fractionally the more items are in the inventory, and the more items are in the grant/purchase + /// operation. + /// + [Serializable] + public class ConfirmPurchaseRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Purchase order identifier returned from StartPurchase. + /// + public string OrderId; + } + + /// + /// When the FailedByPaymentProvider error is returned, it's important to check the ProviderErrorCode, ProviderErrorMessage, + /// and ProviderErrorDetails to understand the specific reason the payment was rejected, as in some rare cases, this may + /// mean that the provider hasn't completed some operation required to finalize the purchase. + /// + [Serializable] + public class ConfirmPurchaseResult : PlayFabResultCommon + { + /// + /// Array of items purchased. + /// + public List Items; + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Date and time of the purchase. + /// + public DateTime PurchaseDate; + } + + [Serializable] + public class ConsumeItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Number of uses to consume from the item. + /// + public int ConsumeCount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique instance identifier of the item to be consumed. + /// + public string ItemInstanceId; + } + + [Serializable] + public class ConsumeItemResult : PlayFabResultCommon + { + /// + /// Unique instance identifier of the item with uses consumed. + /// + public string ItemInstanceId; + /// + /// Number of uses remaining on the item. + /// + public int RemainingUses; + } + + [Serializable] + public class ConsumeMicrosoftStoreEntitlementsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to use + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Marketplace specific payload containing details to fetch in app purchase transactions + /// + public MicrosoftStorePayload MarketplaceSpecificData; + } + + [Serializable] + public class ConsumeMicrosoftStoreEntitlementsResponse : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class ConsumePS5EntitlementsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to use + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Marketplace specific payload containing details to fetch in app purchase transactions + /// + public PlayStation5Payload MarketplaceSpecificData; + } + + [Serializable] + public class ConsumePS5EntitlementsResult : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class ConsumePSNEntitlementsRequest : PlayFabRequestCommon + { + /// + /// Which catalog to match granted entitlements against. If null, defaults to title default catalog + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the PlayStation :tm: Network service label to consume entitlements from + /// + public int ServiceLabel; + } + + [Serializable] + public class ConsumePSNEntitlementsResult : PlayFabResultCommon + { + /// + /// Array of items granted to the player as a result of consuming entitlements. + /// + public List ItemsGranted; + } + + [Serializable] + public class ConsumeXboxEntitlementsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to use + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class ConsumeXboxEntitlementsResult : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + /// + /// A data container + /// + [Serializable] + public class Container_Dictionary_String_String : PlayFabBaseModel + { + /// + /// Content of data + /// + public Dictionary Data; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW + } + + /// + /// If SharedGroupId is specified, the service will attempt to create a group with that identifier, and will return an error + /// if it is already in use. If no SharedGroupId is specified, a random identifier will be assigned. + /// + [Serializable] + public class CreateSharedGroupRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the shared group (a random identifier will be assigned, if one is not specified). + /// + public string SharedGroupId; + } + + [Serializable] + public class CreateSharedGroupResult : PlayFabResultCommon + { + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + public enum Currency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + [Serializable] + public class CurrentGamesRequest : PlayFabRequestCommon + { + /// + /// Build to match against. + /// + public string BuildVersion; + /// + /// Game mode to look for. + /// + public string GameMode; + /// + /// Region to check for Game Server Instances. + /// + public Region? Region; + /// + /// Statistic name to find statistic-based matches. + /// + public string StatisticName; + /// + /// Filter to include and/or exclude Game Server Instances associated with certain tags. + /// + public CollectionFilter TagFilter; + } + + [Serializable] + public class CurrentGamesResult : PlayFabResultCommon + { + /// + /// number of games running + /// + public int GameCount; + /// + /// array of games found + /// + public List Games; + /// + /// total number of players across all servers + /// + public int PlayerCount; + } + + /// + /// Any arbitrary information collected by the device + /// + [Serializable] + public class DeviceInfoRequest : PlayFabRequestCommon + { + /// + /// Information posted to the PlayStream Event. Currently arbitrary, and specific to the environment sending it. + /// + public Dictionary Info; + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + [Serializable] + public class EmptyResult : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityTokenResponse : PlayFabBaseModel + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + [Serializable] + public class ExecuteCloudScriptRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the first argument + /// + public object FunctionParameter; + /// + /// Generate a 'player_executed_cloudscript' PlayStream event containing the results of the function execution and other + /// contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + /// + /// Option for which revision of the CloudScript to execute. 'Latest' executes the most recently created revision, 'Live' + /// executes the current live, published revision, and 'Specific' executes the specified revision. The default value is + /// 'Specific', if the SpeificRevision parameter is specified, otherwise it is 'Live'. + /// + public CloudScriptRevisionOption? RevisionSelection; + /// + /// The specivic revision to execute, when RevisionSelection is set to 'Specific' + /// + public int? SpecificRevision; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabResultCommon + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + public enum ExternalFriendSources + { + None, + Steam, + Facebook, + Xbox, + Psn, + All + } + + [Serializable] + public class FacebookInstantGamesPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook Instant Games identifier for a user. + /// + public string FacebookInstantGamesId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook Instant Games identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FacebookPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook identifier for a user. + /// + public string FacebookId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FriendInfo : PlayFabBaseModel + { + /// + /// Available Facebook information (if the user and PlayFab friend are also connected in Facebook). + /// + public UserFacebookInfo FacebookInfo; + /// + /// PlayFab unique identifier for this friend. + /// + public string FriendPlayFabId; + /// + /// Available Game Center information (if the user and PlayFab friend are also connected in Game Center). + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Available PlayStation :tm: Network information, if the user and PlayFab friend are both connected to PlayStation :tm: + /// Network. + /// + public UserPsnInfo PSNInfo; + /// + /// Available Steam information (if the user and PlayFab friend are also connected in Steam). + /// + public UserSteamInfo SteamInfo; + /// + /// Tags which have been associated with this friend. + /// + public List Tags; + /// + /// Title-specific display name for this friend. + /// + public string TitleDisplayName; + /// + /// PlayFab unique username for this friend. + /// + public string Username; + /// + /// Available Xbox information, if the user and PlayFab friend are both connected to Xbox Live. + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class GameCenterPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Game Center identifier for a user. + /// + public string GameCenterId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Game Center identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GameInfo : PlayFabBaseModel + { + /// + /// build version this server is running + /// + public string BuildVersion; + /// + /// game mode this server is running + /// + public string GameMode; + /// + /// game session custom data + /// + public string GameServerData; + /// + /// game specific string denoting server configuration + /// + public GameInstanceState? GameServerStateEnum; + /// + /// last heartbeat of the game server instance, used in external game server provider mode + /// + public DateTime? LastHeartbeat; + /// + /// unique lobby identifier for this game server + /// + public string LobbyID; + /// + /// maximum players this server can support + /// + public int? MaxPlayers; + /// + /// array of current player IDs on this server + /// + public List PlayerUserIds; + /// + /// region to which this server is associated + /// + public Region? Region; + /// + /// duration in seconds this server has been running + /// + public uint RunTime; + /// + /// IPV4 address of the server + /// + public string ServerIPV4Address; + /// + /// IPV6 address of the server + /// + public string ServerIPV6Address; + /// + /// port number to use for non-http communications with the server + /// + public int? ServerPort; + /// + /// Public DNS name (if any) of the server + /// + public string ServerPublicDNSName; + /// + /// stastic used to match this game in player statistic matchmaking + /// + public string StatisticName; + /// + /// game session tags + /// + public Dictionary Tags; + } + + public enum GameInstanceState + { + Open, + Closed + } + + [Serializable] + public class GameServerRegionsRequest : PlayFabRequestCommon + { + /// + /// version of game server for which stats are being requested + /// + public string BuildVersion; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class GameServerRegionsResult : PlayFabResultCommon + { + /// + /// array of regions found matching the request parameters + /// + public List Regions; + } + + [Serializable] + public class GenericPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique generic service identifier for a user. + /// + public GenericServiceId GenericId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the given generic identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GenericServiceId : PlayFabBaseModel + { + /// + /// Name of the service for which the player has a unique identifier. + /// + public string ServiceName; + /// + /// Unique identifier of the player in that service. + /// + public string UserId; + } + + [Serializable] + public class GetAccountInfoRequest : PlayFabRequestCommon + { + /// + /// User email address for the account to find (if no Username is specified). + /// + public string Email; + /// + /// Unique PlayFab identifier of the user whose info is being requested. Optional, defaults to the authenticated user if no + /// other lookup identifier set. + /// + public string PlayFabId; + /// + /// Title-specific username for the account to find (if no Email is set). Note that if the non-unique Title Display Names + /// option is enabled for the title, attempts to look up users by Title Display Name will always return AccountNotFound. + /// + public string TitleDisplayName; + /// + /// PlayFab Username for the account to find (if no PlayFabId is specified). + /// + public string Username; + } + + /// + /// This API retrieves details regarding the player in the PlayFab service. Note that when this call is used to retrieve + /// data about another player (not the one signed into the local client), some data, such as Personally Identifying + /// Information (PII), will be omitted for privacy reasons or to comply with the requirements of the platform belongs to. + /// The user account returned will be based on the identifier provided in priority order: PlayFabId, Username, Email, then + /// TitleDisplayName. If no identifier is specified, the currently signed in user's information will be returned. + /// + [Serializable] + public class GetAccountInfoResult : PlayFabResultCommon + { + /// + /// Account information for the local user. + /// + public UserAccountInfo AccountInfo; + } + + /// + /// Using an AppId to return a list of valid ad placements for a player. + /// + [Serializable] + public class GetAdPlacementsRequest : PlayFabRequestCommon + { + /// + /// The current AppId to use + /// + public string AppId; + /// + /// Using the name or unique identifier, filter the result for get a specific placement. + /// + public NameIdentifier Identifier; + } + + /// + /// Array of AdPlacementDetails + /// + [Serializable] + public class GetAdPlacementsResult : PlayFabResultCommon + { + /// + /// Array of results + /// + public List AdPlacements; + } + + [Serializable] + public class GetCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being requested. If null, uses the default catalog. + /// + public string CatalogVersion; + } + + /// + /// If CatalogVersion is not specified, only inventory items associated with the most recent version of the catalog will be + /// returned. + /// + [Serializable] + public class GetCatalogItemsResult : PlayFabResultCommon + { + /// + /// Array of items which can be purchased. + /// + public List Catalog; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom character data will be returned. + /// + [Serializable] + public class GetCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab identifier of the user to load data for. Optional, defaults to yourself if not set. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterDataResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// All items currently in the character inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. Also returns their virtual currency balances. + /// + [Serializable] + public class GetCharacterInventoryRequest : PlayFabRequestCommon + { + /// + /// Used to limit results to only those from a specific catalog version. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetCharacterInventoryResult : PlayFabResultCommon + { + /// + /// Unique identifier of the character for this inventory. + /// + public string CharacterId; + /// + /// Array of inventory items belonging to the character. + /// + public List Inventory; + /// + /// Array of virtual currency balance(s) belonging to the character. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class GetCharacterLeaderboardRequest : PlayFabRequestCommon + { + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// First entry in the leaderboard to be retrieved. + /// + public int StartPosition; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note that the Position of the character in the results is for the overall leaderboard. + /// + [Serializable] + public class GetCharacterLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + } + + /// + /// In addition to being available for use by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetCharacterStatisticsResult : PlayFabResultCommon + { + /// + /// The requested character statistics. + /// + public Dictionary CharacterStatistics; + } + + [Serializable] + public class GetContentDownloadUrlRequest : PlayFabRequestCommon + { + /// + /// HTTP method to fetch item - GET or HEAD. Use HEAD when only fetching metadata. Default is GET. + /// + public string HttpMethod; + /// + /// Key of the content item to fetch, usually formatted as a path, e.g. images/a.png + /// + public string Key; + /// + /// True to download through CDN. CDN provides higher download bandwidth and lower latency. However, if you want the latest, + /// non-cached version of the content during development, set this to false. Default is true. + /// + public bool? ThruCDN; + } + + [Serializable] + public class GetContentDownloadUrlResult : PlayFabResultCommon + { + /// + /// URL for downloading content via HTTP GET or HEAD method. The URL will expire in approximately one hour. + /// + public string URL; + } + + [Serializable] + public class GetFriendLeaderboardAroundPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// PlayFab unique identifier of the user to center the leaderboard around. If null will center on the logged in user. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Statistic used to rank players for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the user defaults to 0 when the user does not have + /// the corresponding statistic.If Facebook friends are included, make sure the access token from previous LoginWithFacebook + /// call is still valid and not expired. If Xbox Live friends are included, make sure the access token from the previous + /// LoginWithXbox call is still valid and not expired. + /// + [Serializable] + public class GetFriendLeaderboardAroundPlayerResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetFriendLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Position in the leaderboard to start this listing (defaults to the first entry). + /// + public int StartPosition; + /// + /// Statistic used to rank friends for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + [Serializable] + public class GetFriendsListRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + /// + /// If any additional services are queried for the user's friends, those friends who also have a PlayFab account registered + /// for the title will be returned in the results. For Facebook, user has to have logged into the title's Facebook app + /// recently, and only friends who also plays this game will be included. For Xbox Live, user has to have logged into the + /// Xbox Live recently, and only friends who also play this game will be included. + /// + [Serializable] + public class GetFriendsListResult : PlayFabResultCommon + { + /// + /// Array of friends found. + /// + public List Friends; + } + + [Serializable] + public class GetLeaderboardAroundCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character on which to center the leaderboard. + /// + public string CharacterId; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the character defaults to 0 when the character does + /// not have the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundCharacterResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardAroundPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// PlayFab unique identifier of the user to center the leaderboard around. If null will center on the logged in user. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Statistic used to rank players for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the user defaults to 0 when the user does not have + /// the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundPlayerResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetLeaderboardForUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// NOTE: The position of the character in the results is relative to the other characters for that specific user. This mean + /// the values will always be between 0 and one less than the number of characters returned regardless of the size of the + /// actual leaderboard. + /// + [Serializable] + public class GetLeaderboardForUsersCharactersResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. Default 10, maximum 100. + /// + public int? MaxResultsCount; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Position in the leaderboard to start this listing (defaults to the first entry). + /// + public int StartPosition; + /// + /// Statistic used to rank players for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note: the user's Position is relative to the overall leaderboard. + /// + [Serializable] + public class GetLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetPaymentTokenRequest : PlayFabRequestCommon + { + /// + /// The name of service to provide the payment token. Allowed Values are: xsolla + /// + public string TokenProvider; + } + + [Serializable] + public class GetPaymentTokenResult : PlayFabResultCommon + { + /// + /// PlayFab's purchase order identifier. + /// + public string OrderId; + /// + /// The token from provider. + /// + public string ProviderToken; + } + + [Serializable] + public class GetPhotonAuthenticationTokenRequest : PlayFabRequestCommon + { + /// + /// The Photon applicationId for the game you wish to log into. + /// + public string PhotonApplicationId; + } + + [Serializable] + public class GetPhotonAuthenticationTokenResult : PlayFabResultCommon + { + /// + /// The Photon authentication token for this game-session. + /// + public string PhotonCustomAuthenticationToken; + } + + [Serializable] + public class GetPlayerCombinedInfoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// PlayFabId of the user whose data will be returned. If not filled included, we return the data for the calling player. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoRequestParams : PlayFabBaseModel + { + /// + /// Whether to get character inventories. Defaults to false. + /// + public bool GetCharacterInventories; + /// + /// Whether to get the list of characters. Defaults to false. + /// + public bool GetCharacterList; + /// + /// Whether to get player profile. Defaults to false. Has no effect for a new player. + /// + public bool GetPlayerProfile; + /// + /// Whether to get player statistics. Defaults to false. + /// + public bool GetPlayerStatistics; + /// + /// Whether to get title data. Defaults to false. + /// + public bool GetTitleData; + /// + /// Whether to get the player's account Info. Defaults to false + /// + public bool GetUserAccountInfo; + /// + /// Whether to get the player's custom data. Defaults to false + /// + public bool GetUserData; + /// + /// Whether to get the player's inventory. Defaults to false + /// + public bool GetUserInventory; + /// + /// Whether to get the player's read only data. Defaults to false + /// + public bool GetUserReadOnlyData; + /// + /// Whether to get the player's virtual currency balances. Defaults to false + /// + public bool GetUserVirtualCurrency; + /// + /// Specific statistics to retrieve. Leave null to get all keys. Has no effect if GetPlayerStatistics is false + /// + public List PlayerStatisticNames; + /// + /// Specifies the properties to return from the player profile. Defaults to returning the player's display name. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetTitleData is false + /// + public List TitleDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserData is false + /// + public List UserDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserReadOnlyData is + /// false + /// + public List UserReadOnlyDataKeys; + } + + /// + /// Returns whatever info is requested in the response for the user. If no user is explicitly requested this defaults to the + /// authenticated user. If the user is the same as the requester, PII (like email address, facebook id) is returned if + /// available. Otherwise, only public information is returned. All parameters default to false. + /// + [Serializable] + public class GetPlayerCombinedInfoResult : PlayFabResultCommon + { + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoResultPayload : PlayFabBaseModel + { + /// + /// Account information for the user. This is always retrieved. + /// + public UserAccountInfo AccountInfo; + /// + /// Inventories for each character for the user. + /// + public List CharacterInventories; + /// + /// List of characters for the user. + /// + public List CharacterList; + /// + /// The profile of the players. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + /// + /// List of statistics for this player. + /// + public List PlayerStatistics; + /// + /// Title data for this title. + /// + public Dictionary TitleData; + /// + /// User specific custom data. + /// + public Dictionary UserData; + /// + /// The version of the UserData that was returned. + /// + public uint UserDataVersion; + /// + /// Array of inventory items in the user's current inventory. + /// + public List UserInventory; + /// + /// User specific read-only data. + /// + public Dictionary UserReadOnlyData; + /// + /// The version of the Read-Only UserData that was returned. + /// + public uint UserReadOnlyDataVersion; + /// + /// Dictionary of virtual currency balance(s) belonging to the user. + /// + public Dictionary UserVirtualCurrency; + /// + /// Dictionary of remaining times and timestamps for virtual currencies. + /// + public Dictionary UserVirtualCurrencyRechargeTimes; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetPlayerProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + } + + [Serializable] + public class GetPlayerProfileResult : PlayFabResultCommon + { + /// + /// The profile of the player. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + } + + [Serializable] + public class GetPlayerSegmentsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetPlayerSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments the requested player currently belongs to. + /// + public List Segments; + } + + [Serializable] + public class GetPlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// statistics to return (current version will be returned for each) + /// + public List StatisticNames; + /// + /// statistics to return, if StatisticNames is not set (only statistics which have a version matching that provided will be + /// returned) + /// + public List StatisticNameVersions; + } + + /// + /// In addition to being available for use by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetPlayerStatisticsResult : PlayFabResultCommon + { + /// + /// User statistics for the requested user. + /// + public List Statistics; + } + + [Serializable] + public class GetPlayerStatisticVersionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + [Serializable] + public class GetPlayerStatisticVersionsResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public List StatisticVersions; + } + + /// + /// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace is not + /// provided, the result is a list of all canonical tags. TagName can be used for segmentation and Namespace is limited to + /// 128 characters. + /// + [Serializable] + public class GetPlayerTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional namespace to filter results by + /// + public string Namespace; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerTagsResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Canonical tags (including namespace and tag's name) for the requested user + /// + public List Tags; + } + + [Serializable] + public class GetPlayerTradesRequest : PlayFabRequestCommon + { + /// + /// Returns only trades with the given status. If null, returns all trades. + /// + public TradeStatus? StatusFilter; + } + + [Serializable] + public class GetPlayerTradesResponse : PlayFabResultCommon + { + /// + /// History of trades which this player has accepted. + /// + public List AcceptedTrades; + /// + /// The trades for this player which are currently available to be accepted. + /// + public List OpenedTrades; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook identifiers for which the title needs to get PlayFab identifiers. The array cannot exceed 2,000 + /// in length. + /// + public List FacebookIDs; + } + + /// + /// For Facebook identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook Instant Games identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 25 in length. + /// + public List FacebookInstantGamesIds; + } + + /// + /// For Facebook Instant Game identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook Instant Games identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGameCenterIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Game Center identifiers (the Player Identifier) for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 2,000 in length. + /// + public List GameCenterIDs; + } + + /// + /// For Game Center identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGameCenterIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Game Center identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGenericIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique generic service identifiers for which the title needs to get PlayFab identifiers. Currently limited to a + /// maximum of 10 in a single request. + /// + public List GenericIDs; + } + + /// + /// For generic service identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGenericIDsResult : PlayFabResultCommon + { + /// + /// Mapping of generic service identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGoogleIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Google identifiers (Google+ user IDs) for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List GoogleIDs; + } + + /// + /// For Google identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGoogleIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Google identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Google Play Games identifiers (Google+ user IDs) for which the title needs to get PlayFab identifiers. + /// The array cannot exceed 2,000 in length. + /// + public List GooglePlayGamesPlayerIDs; + } + + /// + /// For Google Play Games identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Google Play Games identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromKongregateIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Kongregate identifiers (Kongregate's user_id) for which the title needs to get PlayFab identifiers. The + /// array cannot exceed 2,000 in length. + /// + public List KongregateIDs; + } + + /// + /// For Kongregate identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromKongregateIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Kongregate identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Account identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoAccountIds; + } + + /// + /// For Nintendo Service Account identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Service Account identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Device identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoSwitchDeviceIds; + } + + /// + /// For Nintendo Switch identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Device identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsRequest : PlayFabRequestCommon + { + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Array of unique PlayStation :tm: Network identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List PSNAccountIDs; + } + + /// + /// For PlayStation :tm: Network identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsResult : PlayFabResultCommon + { + /// + /// Mapping of PlayStation :tm: Network identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromSteamIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Steam identifiers (Steam profile IDs) for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List SteamStringIDs; + } + + /// + /// For Steam identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromSteamIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Steam identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromTwitchIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Twitch identifiers (Twitch's _id) for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List TwitchIds; + } + + /// + /// For Twitch identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromTwitchIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Twitch identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsRequest : PlayFabRequestCommon + { + /// + /// The ID of Xbox Live sandbox. + /// + public string Sandbox; + /// + /// Array of unique Xbox Live account identifiers for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List XboxLiveAccountIDs; + } + + /// + /// For XboxLive identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Xbox Live identifiers to PlayFab identifiers. + /// + public List Data; + } + + /// + /// This API is designed to return publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. For more information email helloplayfab@microsoft.com. Note that there may up + /// to a minute delay in between updating title data and this API call returning the newest value. + /// + [Serializable] + public class GetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// array of keys to get back data from the Publisher data blob, set by the admin tools + /// + public List Keys; + } + + [Serializable] + public class GetPublisherDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetPurchaseRequest : PlayFabRequestCommon + { + /// + /// Purchase order identifier. + /// + public string OrderId; + } + + [Serializable] + public class GetPurchaseResult : PlayFabResultCommon + { + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Payment provider used for transaction (If not VC) + /// + public string PaymentProvider; + /// + /// Date and time of the purchase. + /// + public DateTime PurchaseDate; + /// + /// Provider transaction ID (If not VC) + /// + public string TransactionId; + /// + /// PlayFab transaction status + /// + public string TransactionStatus; + } + + [Serializable] + public class GetSegmentResult : PlayFabBaseModel + { + /// + /// Identifier of the segments AB Test, if it is attached to one. + /// + public string ABTestParent; + /// + /// Unique identifier for this segment. + /// + public string Id; + /// + /// Segment name. + /// + public string Name; + } + + [Serializable] + public class GetSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// If true, return the list of all members of the shared group. + /// + public bool? GetMembers; + /// + /// Specific keys to retrieve from the shared group (if not specified, all keys will be returned, while an empty array + /// indicates that no keys should be returned). + /// + public List Keys; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class GetSharedGroupDataResult : PlayFabResultCommon + { + /// + /// Data for the requested keys. + /// + public Dictionary Data; + /// + /// List of PlayFabId identifiers for the members of this group, if requested. + /// + public List Members; + } + + /// + /// A store contains an array of references to items defined in one or more catalog versions of the game, along with the + /// prices for the item, in both real world and virtual currencies. These prices act as an override to any prices defined in + /// the catalog. In this way, the base definitions of the items may be defined in the catalog, with all associated + /// properties, while the pricing can be set for each store, as needed. This allows for subsets of goods to be defined for + /// different purposes (in order to simplify showing some, but not all catalog items to users, based upon different + /// characteristics), along with unique prices. Note that all prices defined in the catalog and store definitions for the + /// item are considered valid, and that a compromised client can be made to send a request for an item based upon any of + /// these definitions. If no price is specified in the store for an item, the price set in the catalog should be displayed + /// to the user. + /// + [Serializable] + public class GetStoreItemsRequest : PlayFabRequestCommon + { + /// + /// Catalog version to store items from. Use default catalog version if null + /// + public string CatalogVersion; + /// + /// Unqiue identifier for the store which is being requested. + /// + public string StoreId; + } + + [Serializable] + public class GetStoreItemsResult : PlayFabResultCommon + { + /// + /// The base catalog that this store is a part of. + /// + public string CatalogVersion; + /// + /// Additional data about the store. + /// + public StoreMarketingModel MarketingData; + /// + /// How the store was last updated (Admin or a third party). + /// + public SourceType? Source; + /// + /// Array of items which can be purchased from this store. + /// + public List Store; + /// + /// The ID of this store. + /// + public string StoreId; + } + + /// + /// This query retrieves the current time from one of the servers in PlayFab. Please note that due to clock drift between + /// servers, there is a potential variance of up to 5 seconds. + /// + [Serializable] + public class GetTimeRequest : PlayFabRequestCommon + { + } + + /// + /// Time is always returned as Coordinated Universal Time (UTC). + /// + [Serializable] + public class GetTimeResult : PlayFabResultCommon + { + /// + /// Current server time when the request was received, in UTC + /// + public DateTime Time; + } + + /// + /// This API is designed to return title specific values which can be read, but not written to, by the client. For example, + /// a developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. If the player belongs to an experiment variant that uses title data overrides, the overrides are applied + /// automatically and returned with the title data. Note that there may up to a minute delay in between updating title data + /// and this API call returning the newest value. + /// + [Serializable] + public class GetTitleDataRequest : PlayFabRequestCommon + { + /// + /// Specific keys to search for in the title data (leave null to get all keys) + /// + public List Keys; + /// + /// Optional field that specifies the name of an override. This value is ignored when used by the game client; otherwise, + /// the overrides are applied automatically to the title data. + /// + public string OverrideLabel; + } + + [Serializable] + public class GetTitleDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetTitleNewsRequest : PlayFabRequestCommon + { + /// + /// Limits the results to the last n entries. Defaults to 10 if not set. + /// + public int? Count; + } + + [Serializable] + public class GetTitleNewsResult : PlayFabResultCommon + { + /// + /// Array of news items. + /// + public List News; + } + + /// + /// An RSA CSP blob to be used to encrypt the payload of account creation requests when that API requires a signature + /// header. For example if Client/LoginWithCustomId requires signature headers but the player does not have an account yet + /// follow these steps: 1) Call Client/GetTitlePublicKey with one of the title's shared secrets. 2) Convert the Base64 + /// encoded CSP blob to a byte array and create an RSA signing object. 3) Encrypt the UTF8 encoded JSON body of the + /// registration request and place the Base64 encoded result into the EncryptedRequest and with the TitleId field, all other + /// fields can be left empty when performing the API request. 4) Client receives authentication token as normal. Future + /// requests to LoginWithCustomId will require the X-PlayFab-Signature header. + /// + [Serializable] + public class GetTitlePublicKeyRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// The shared secret key for this title + /// + public string TitleSharedSecret; + } + + [Serializable] + public class GetTitlePublicKeyResult : PlayFabResultCommon + { + /// + /// Base64 encoded RSA CSP byte array blob containing the title's public RSA key + /// + public string RSAPublicKey; + } + + [Serializable] + public class GetTradeStatusRequest : PlayFabRequestCommon + { + /// + /// Player who opened trade. + /// + public string OfferingPlayerId; + /// + /// Trade identifier as returned by OpenTradeOffer. + /// + public string TradeId; + } + + [Serializable] + public class GetTradeStatusResponse : PlayFabResultCommon + { + /// + /// Information about the requested trade. + /// + public TradeInfo Trade; + } + + /// + /// Data is stored as JSON key-value pairs. Every time the data is updated via any source, the version counter is + /// incremented. If the Version parameter is provided, then this call will only return data if the current version on the + /// system is greater than the value provided. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetUserDataRequest : PlayFabRequestCommon + { + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// List of unique keys to load from. + /// + public List Keys; + /// + /// Unique PlayFab identifier of the user to load data for. Optional, defaults to yourself if not set. When specified to a + /// PlayFab id of another player, then this will only return public keys for that account. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserDataResult : PlayFabResultCommon + { + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + [Serializable] + public class GetUserInventoryRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// All items currently in the user inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. + /// + [Serializable] + public class GetUserInventoryResult : PlayFabResultCommon + { + /// + /// Array of inventory items belonging to the user. + /// + public List Inventory; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class GooglePlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Google identifier for a user. + /// + public string GoogleId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Google identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GooglePlayGamesPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Google Play Games identifier for a user. + /// + public string GooglePlayGamesPlayerId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Google Play Games identifier. + /// + public string PlayFabId; + } + + /// + /// Grants a character to the user of the type specified by the item ID. The user must already have an instance of this item + /// in their inventory in order to allow character creation. This item can come from a purchase or grant, which must be done + /// before calling to create the character. + /// + [Serializable] + public class GrantCharacterToUserRequest : PlayFabRequestCommon + { + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// Non-unique display name of the character being granted (1-40 characters in length). + /// + public string CharacterName; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Catalog item identifier of the item in the user's inventory that corresponds to the character in the catalog to be + /// created. + /// + public string ItemId; + } + + [Serializable] + public class GrantCharacterToUserResult : PlayFabResultCommon + { + /// + /// Unique identifier tagged to this character. + /// + public string CharacterId; + /// + /// Type of character that was created. + /// + public string CharacterType; + /// + /// Indicates whether this character was created successfully. + /// + public bool Result; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class ItemPurchaseRequest : PlayFabBaseModel + { + /// + /// Title-specific text concerning this purchase. + /// + public string Annotation; + /// + /// Unique ItemId of the item to purchase. + /// + public string ItemId; + /// + /// How many of this item to purchase. Min 1, maximum 25. + /// + public uint Quantity; + /// + /// Items to be upgraded as a result of this purchase (upgraded items are hidden, as they are "replaced" by the new items). + /// + public List UpgradeFromItems; + } + + [Serializable] + public class KongregatePlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Kongregate identifier for a user. + /// + public string KongregateId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Kongregate identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class LinkAndroidDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Specific model of the user's device. + /// + public string AndroidDevice; + /// + /// Android device identifier for the user's device. + /// + public string AndroidDeviceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the device, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + } + + [Serializable] + public class LinkAndroidDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkAppleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific Apple account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by Apple after login. Represented as the identityToken field in the authorization + /// credential payload. Used to validate the request and find the user ID (Apple subject) to link with. + /// + public string IdentityToken; + } + + [Serializable] + public class LinkCustomIDRequest : PlayFabRequestCommon + { + /// + /// Custom unique identifier for the user, generated by the title. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the custom ID, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkCustomIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + /// + /// Facebook sign-in is accomplished using the Facebook User Access Token. More information on the Token can be found in the + /// Facebook developer documentation (https://developers.facebook.com/docs/facebook-login/access-tokens/). In Unity, for + /// example, the Token is available as AccessToken in the Facebook SDK ScriptableObject FB. Note that titles should never + /// re-use the same Facebook applications between PlayFab Title IDs, as Facebook provides unique user IDs per application + /// and doing so can result in issues with the Facebook ID for the user in their PlayFab account information. If you must + /// re-use an application in a new PlayFab Title ID, please be sure to first unlink all accounts from Facebook, or delete + /// all users in the first Title ID. + /// + [Serializable] + public class LinkFacebookAccountRequest : PlayFabRequestCommon + { + /// + /// Unique identifier from Facebook for the user. + /// + public string AccessToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkFacebookAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkFacebookInstantGamesIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Facebook Instant Games signature for the user. + /// + public string FacebookInstantGamesSignature; + /// + /// If another user is already linked to the Facebook Instant Games ID, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkFacebookInstantGamesIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkGameCenterAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. If the current user is already + /// linked, link both accounts + /// + public bool? ForceLink; + /// + /// Game Center identifier for the player account to be linked. + /// + public string GameCenterId; + /// + /// The URL for the public encryption key that will be used to verify the signature. + /// + public string PublicKeyUrl; + /// + /// A random value used to compute the hash and keep it randomized. + /// + public string Salt; + /// + /// The verification signature of the authentication payload. + /// + public string Signature; + /// + /// The integer representation of date and time that the signature was created on. PlayFab will reject authentication + /// signatures not within 10 minutes of the server's current time. + /// + public string Timestamp; + } + + [Serializable] + public class LinkGameCenterAccountResult : PlayFabResultCommon + { + } + + /// + /// Google sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google sign-in for Android APIs on + /// the device and passing it to this API. + /// + [Serializable] + public class LinkGoogleAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. If the current user is already + /// linked, link both accounts + /// + public bool? ForceLink; + /// + /// Server authentication code obtained on the client by calling getServerAuthCode() + /// (https://developers.google.com/identity/sign-in/android/offline-access) from Google Play for the user. + /// + public string ServerAuthCode; + } + + [Serializable] + public class LinkGoogleAccountResult : PlayFabResultCommon + { + } + + /// + /// Google Play Games sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google Play Games sign-in + /// for Android APIs on the device and passing it to this API. + /// + [Serializable] + public class LinkGooglePlayGamesServicesAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. If the current user is already + /// linked, link both accounts + /// + public bool? ForceLink; + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the requestServerSideAccess() + /// (https://developers.google.com/games/services/android/signin) Google Play Games client API. + /// + public string ServerAuthCode; + } + + [Serializable] + public class LinkGooglePlayGamesServicesAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkIOSDeviceIDRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Vendor-specific iOS identifier for the user's device. + /// + public string DeviceId; + /// + /// Specific model of the user's device. + /// + public string DeviceModel; + /// + /// If another user is already linked to the device, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + } + + [Serializable] + public class LinkIOSDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkKongregateAccountRequest : PlayFabRequestCommon + { + /// + /// Valid session auth ticket issued by Kongregate + /// + public string AuthTicket; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Numeric user ID assigned by Kongregate + /// + public string KongregateId; + } + + [Serializable] + public class LinkKongregateAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific Nintendo Switch account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by Nintendo after login. Used to validate the request and find the user ID (Nintendo + /// Switch subject) to link with. + /// + public string IdentityToken; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the Nintendo Switch Device ID, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Nintendo Switch unique identifier for the user's device. + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkOpenIdConnectRequest : PlayFabRequestCommon + { + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum 100 characters. + /// + public string ConnectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific OpenId Connect user, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by the identity provider after login. Represented as the id_token field in the + /// identity provider's response. Used to validate the request and find the user ID (OpenID Connect subject) to link with. + /// + public string IdToken; + } + + [Serializable] + public class LinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// Authentication code provided by the PlayStation :tm: Network. + /// + public string AuthCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + } + + [Serializable] + public class LinkPSNAccountResult : PlayFabResultCommon + { + } + + /// + /// Steam authentication is accomplished with the Steam Session Ticket. More information on the Ticket can be found in the + /// Steamworks SDK, here: https://partner.steamgames.com/documentation/auth (requires sign-in). NOTE: For Steam + /// authentication to work, the title must be configured with the Steam Application ID and Publisher Key in the PlayFab Game + /// Manager (under Properties). Information on creating a Publisher Key (referred to as the Secret Key in PlayFab) for your + /// title can be found here: https://partner.steamgames.com/documentation/webapi#publisherkey. + /// + [Serializable] + public class LinkSteamAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Authentication token for the user, returned as a byte array from Steam, and converted to a string (for example, the byte + /// 0x08 should become "08"). + /// + public string SteamTicket; + } + + [Serializable] + public class LinkSteamAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkTwitchAccountRequest : PlayFabRequestCommon + { + /// + /// Valid token issued by Twitch + /// + public string AccessToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + } + + [Serializable] + public class LinkTwitchAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Returns a list of every character that currently belongs to a user. + /// + [Serializable] + public class ListUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ListUsersCharactersResult : PlayFabResultCommon + { + /// + /// The requested list of characters. + /// + public List Characters; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class LoginResult : PlayFabLoginResultCommon + { + /// + /// If LoginTitlePlayerAccountEntity flag is set on the login request the title_player_account will also be logged in and + /// returned. + /// + public EntityTokenResponse EntityToken; + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// The time of this user's previous login. If there was no previous login, then it's DateTime.MinValue + /// + public DateTime? LastLoginTime; + /// + /// True if the account was newly created on this login. + /// + public bool NewlyCreated; + /// + /// Player's unique PlayFabId. + /// + public string PlayFabId; + /// + /// Unique token authorizing the user and game at the server level, for the current session. + /// + public string SessionTicket; + /// + /// Settings specific to this user. + /// + public UserSettings SettingsForUser; + /// + /// The experimentation treatments for this user at the time of login. + /// + public TreatmentAssignment TreatmentAssignment; + } + + /// + /// On Android devices, the recommendation is to use the Settings.Secure.ANDROID_ID as the AndroidDeviceId, as described in + /// this blog post (http://android-developers.blogspot.com/2011/03/identifying-app-installations.html). More information on + /// this identifier can be found in the Android documentation + /// (http://developer.android.com/reference/android/provider/Settings.Secure.html). If this is the first time a user has + /// signed in with the Android device and CreateAccount is set to true, a new PlayFab account will be created and linked to + /// the Android device ID. In this case, no email or username will be associated with the PlayFab account. Otherwise, if no + /// PlayFab account is linked to the Android device, an error indicating this will be returned, so that the title can guide + /// the user through creation of a PlayFab account. Please note that while multiple devices of this type can be linked to a + /// single user account, only the one most recently used to login (or most recently linked) will be reflected in the user's + /// account information. We will be updating to show all linked devices in a future release. + /// + [Serializable] + public class LoginWithAndroidDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Specific model of the user's device. + /// + public string AndroidDevice; + /// + /// Android device identifier for the user's device. + /// + public string AndroidDeviceId; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithAppleRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// The JSON Web token (JWT) returned by Apple after login. Represented as the identityToken field in the authorization + /// credential payload. If you choose to ignore the expiration date for identity tokens, you will receive an NotAuthorized + /// error if Apple rotates the signing key. In this case, users have to login to provide a fresh identity token. + /// + public string IdentityToken; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// It is highly recommended that developers ensure that it is extremely unlikely that a customer could generate an ID which + /// is already in use by another customer. If this is the first time a user has signed in with the Custom ID and + /// CreateAccount is set to true, a new PlayFab account will be created and linked to the Custom ID. In this case, no email + /// or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Custom ID, an + /// error indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithCustomIDRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// Custom unique identifier for the user, generated by the title. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Email address and password lengths are provided for information purposes. The server will validate that data passed in + /// conforms to the field definition and report errors appropriately. It is recommended that developers not perform this + /// validation locally, so that future updates do not require client updates. + /// + [Serializable] + public class LoginWithEmailAddressRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Email address for the account. + /// + public string Email; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithFacebookInstantGamesIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Facebook Instant Games signature for the user. + /// + public string FacebookInstantGamesSignature; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Facebook sign-in is accomplished using the Facebook User Access Token. More information on the Token can be found in the + /// Facebook developer documentation (https://developers.facebook.com/docs/facebook-login/access-tokens/). In Unity, for + /// example, the Token is available as AccessToken in the Facebook SDK ScriptableObject FB. If this is the first time a user + /// has signed in with the Facebook account and CreateAccount is set to true, a new PlayFab account will be created and + /// linked to the provided account's Facebook ID. In this case, no email or username will be associated with the PlayFab + /// account. Otherwise, if no PlayFab account is linked to the Facebook account, an error indicating this will be returned, + /// so that the title can guide the user through creation of a PlayFab account. Note that titles should never re-use the + /// same Facebook applications between PlayFab Title IDs, as Facebook provides unique user IDs per application and doing so + /// can result in issues with the Facebook ID for the user in their PlayFab account information. If you must re-use an + /// application in a new PlayFab Title ID, please be sure to first unlink all accounts from Facebook, or delete all users in + /// the first Title ID. + /// + [Serializable] + public class LoginWithFacebookRequest : PlayFabRequestCommon + { + /// + /// Unique identifier from Facebook for the user. + /// + public string AccessToken; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// The Game Center player identifier + /// (https://developer.apple.com/library/ios/documentation/Accounts/Reference/ACAccountClassRef/index.html#//apple_ref/occ/instp/ACAccount/identifier) + /// is a generated string which is stored on the local device. As with device identifiers, care must be taken to never + /// expose a player's Game Center identifier to end users, as that could result in a user's account being compromised. If + /// this is the first time a user has signed in with Game Center and CreateAccount is set to true, a new PlayFab account + /// will be created and linked to the Game Center identifier. In this case, no email or username will be associated with the + /// PlayFab account. Otherwise, if no PlayFab account is linked to the Game Center account, an error indicating this will be + /// returned, so that the title can guide the user through creation of a PlayFab account. If an invalid iOS Game Center + /// player identifier is used, an error indicating this will be returned. + /// + [Serializable] + public class LoginWithGameCenterRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Unique Game Center player id. + /// + public string PlayerId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// The URL for the public encryption key that will be used to verify the signature. + /// + public string PublicKeyUrl; + /// + /// A random value used to compute the hash and keep it randomized. + /// + public string Salt; + /// + /// The verification signature of the authentication payload. + /// + public string Signature; + /// + /// The integer representation of date and time that the signature was created on. PlayFab will reject authentication + /// signatures not within 10 minutes of the server's current time. + /// + public string Timestamp; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Google sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google sign-in for Android APIs on + /// the device and passing it to this API. If this is the first time a user has signed in with the Google account and + /// CreateAccount is set to true, a new PlayFab account will be created and linked to the Google account. Otherwise, if no + /// PlayFab account is linked to the Google account, an error indicating this will be returned, so that the title can guide + /// the user through creation of a PlayFab account. The current (recommended) method for obtaining a Google account + /// credential in an Android application is to call GoogleSignInAccount.getServerAuthCode() and send the auth code as the + /// ServerAuthCode parameter of this API. Before doing this, you must create an OAuth 2.0 web application client ID in the + /// Google API Console and configure its client ID and secret in the PlayFab Game Manager Google Add-on for your title. This + /// method does not require prompting of the user for additional Google account permissions, resulting in a user experience + /// with the least possible friction. For more information about obtaining the server auth code, see + /// https://developers.google.com/identity/sign-in/android/offline-access. The previous (deprecated) method was to obtain an + /// OAuth access token by calling GetAccessToken() on the client and passing it as the AccessToken parameter to this API. + /// for the with the Google OAuth 2.0 Access Token. More information on this change can be found in the Google developer + /// documentation (https://android-developers.googleblog.com/2016/01/play-games-permissions-are-changing-in.html). + /// + [Serializable] + public class LoginWithGoogleAccountRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the getServerAuthCode() + /// (https://developers.google.com/identity/sign-in/android/offline-access) Google client API. + /// + public string ServerAuthCode; + /// + /// Optional boolean to opt out of setting the MPA email when creating a Google account, defaults to true. + /// + public bool? SetEmail; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Google Play Games sign-in is accomplished by obtaining a Google OAuth 2.0 credential using the Google Play Games sign-in + /// for Android APIs on the device and passing it to this API. If this is the first time a user has signed in with the + /// Google Play Games account and CreateAccount is set to true, a new PlayFab account will be created and linked to the + /// Google Play Games account. Otherwise, if no PlayFab account is linked to the Google Play Games account, an error + /// indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. The + /// current (recommended) method for obtaining a Google Play Games account credential in an Android application is to call + /// GamesSignInClient.requestServerSideAccess() and send the auth code as the ServerAuthCode parameter of this API. Before + /// doing this, you must create an OAuth 2.0 web application client ID in the Google API Console and configure its client ID + /// and secret in the PlayFab Game Manager Google Add-on for your title. This method does not require prompting of the user + /// for additional Google account permissions, resulting in a user experience with the least possible friction. For more + /// information about obtaining the server auth code, see https://developers.google.com/games/services/android/signin. + /// + [Serializable] + public class LoginWithGooglePlayGamesServicesRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// OAuth 2.0 server authentication code obtained on the client by calling the requestServerSideAccess() + /// (https://developers.google.com/games/services/android/signin) Google Play Games client API. + /// + public string ServerAuthCode; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// On iOS devices, the identifierForVendor + /// (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIDevice_Class/index.html#//apple_ref/occ/instp/UIDevice/identifierForVendor) + /// must be used as the DeviceId, as the UIDevice uniqueIdentifier has been deprecated as of iOS 5, and use of the + /// advertisingIdentifier for this purpose will result in failure of Apple's certification process. If this is the first + /// time a user has signed in with the iOS device and CreateAccount is set to true, a new PlayFab account will be created + /// and linked to the vendor-specific iOS device ID. In this case, no email or username will be associated with the PlayFab + /// account. Otherwise, if no PlayFab account is linked to the iOS device, an error indicating this will be returned, so + /// that the title can guide the user through creation of a PlayFab account. Please note that while multiple devices of this + /// type can be linked to a single user account, only the one most recently used to login (or most recently linked) will be + /// reflected in the user's account information. We will be updating to show all linked devices in a future release. + /// + [Serializable] + public class LoginWithIOSDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Vendor-specific iOS identifier for the user's device. + /// + public string DeviceId; + /// + /// Specific model of the user's device. + /// + public string DeviceModel; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Specific Operating System version for the user's device. + /// + public string OS; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// More details regarding Kongregate and their game authentication system can be found at + /// http://developers.kongregate.com/docs/virtual-goods/authentication. Developers must provide the Kongregate user ID and + /// auth token that are generated using the Kongregate client library. PlayFab will combine these identifiers with the + /// title's unique Kongregate app ID to log the player into the Kongregate system. If CreateAccount is set to true and there + /// is not already a user matched to this Kongregate ID, then PlayFab will create a new account for this user and link the + /// ID. In this case, no email or username will be associated with the PlayFab account. If there is already a different + /// PlayFab user linked with this account, then an error will be returned. + /// + [Serializable] + public class LoginWithKongregateRequest : PlayFabRequestCommon + { + /// + /// Token issued by Kongregate's client API for the user. + /// + public string AuthTicket; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Numeric user ID assigned by Kongregate + /// + public string KongregateId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// The JSON Web token (JWT) returned by Nintendo after login. + /// + public string IdentityToken; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Nintendo Switch unique identifier for the user's device. + /// + public string NintendoSwitchDeviceId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class LoginWithOpenIdConnectRequest : PlayFabRequestCommon + { + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum 100 characters. + /// + public string ConnectionId; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// The JSON Web token (JWT) returned by the identity provider after login. Represented as the id_token field in the + /// identity provider's response. + /// + public string IdToken; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Username and password lengths are provided for information purposes. The server will validate that data passed in + /// conforms to the field definition and report errors appropriately. It is recommended that developers not perform this + /// validation locally, so that future updates to the username or password do not require client updates. + /// + [Serializable] + public class LoginWithPlayFabRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// PlayFab username for the account. + /// + public string Username; + } + + /// + /// If this is the first time a user has signed in with the PlayStation :tm: Network account and CreateAccount is set to + /// true, a new PlayFab account will be created and linked to the PlayStation :tm: Network account. In this case, no email + /// or username will be associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the PlayStation + /// :tm: Network account, an error indicating this will be returned, so that the title can guide the user through creation + /// of a PlayFab account. + /// + [Serializable] + public class LoginWithPSNRequest : PlayFabRequestCommon + { + /// + /// Auth code provided by the PlayStation :tm: Network OAuth provider. + /// + public string AuthCode; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// Steam sign-in is accomplished with the Steam Session Ticket. More information on the Ticket can be found in the + /// Steamworks SDK, here: https://partner.steamgames.com/documentation/auth (requires sign-in). NOTE: For Steam + /// authentication to work, the title must be configured with the Steam Application ID and Web API Key in the PlayFab Game + /// Manager (under Steam in the Add-ons Marketplace). You can obtain a Web API Key from the Permissions page of any Group + /// associated with your App ID in the Steamworks site. If this is the first time a user has signed in with the Steam + /// account and CreateAccount is set to true, a new PlayFab account will be created and linked to the provided account's + /// Steam ID. In this case, no email or username will be associated with the PlayFab account. Otherwise, if no PlayFab + /// account is linked to the Steam account, an error indicating this will be returned, so that the title can guide the user + /// through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithSteamRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Authentication token for the user, returned as a byte array from Steam, and converted to a string (for example, the byte + /// 0x08 should become "08"). + /// + public string SteamTicket; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// More details regarding Twitch and their authentication system can be found at + /// https://github.com/justintv/Twitch-API/blob/master/authentication.md. Developers must provide the Twitch access token + /// that is generated using one of the Twitch authentication flows. PlayFab will use the title's unique Twitch Client ID to + /// authenticate the token and log in to the PlayFab system. If CreateAccount is set to true and there is not already a user + /// matched to the Twitch username that generated the token, then PlayFab will create a new account for this user and link + /// the ID. In this case, no email or username will be associated with the PlayFab account. If there is already a different + /// PlayFab user linked with this account, then an error will be returned. + /// + [Serializable] + public class LoginWithTwitchRequest : PlayFabRequestCommon + { + /// + /// Token issued by Twitch's API for the user. + /// + public string AccessToken; + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + /// + /// If this is the first time a user has signed in with the Xbox Live account and CreateAccount is set to true, a new + /// PlayFab account will be created and linked to the Xbox Live account. In this case, no email or username will be + /// associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error + /// indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithXboxRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + [Serializable] + public class MatchmakeRequest : PlayFabRequestCommon + { + /// + /// Build version to match against. [Note: Required if LobbyId is not specified] + /// + public string BuildVersion; + /// + /// Character to use for stats based matching. Leave null to use account stats. + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Game mode to match make against. [Note: Required if LobbyId is not specified] + /// + public string GameMode; + /// + /// Lobby identifier to match make against. This is used to select a specific Game Server Instance. + /// + public string LobbyId; + /// + /// Region to match make against. [Note: Required if LobbyId is not specified] + /// + public Region? Region; + /// + /// Start a game session if one with an open slot is not found. Defaults to true. + /// + public bool? StartNewIfNoneFound; + /// + /// Player statistic to use in finding a match. May be null for no stat-based matching. + /// + public string StatisticName; + /// + /// Filter to include and/or exclude Game Server Instances associated with certain Tags + /// + public CollectionFilter TagFilter; + } + + [Serializable] + public class MatchmakeResult : PlayFabResultCommon + { + /// + /// timestamp for when the server will expire, if applicable + /// + public string Expires; + /// + /// unique lobby identifier of the server matched + /// + public string LobbyID; + /// + /// time in milliseconds the application is configured to wait on matchmaking results + /// + public int? PollWaitTimeMS; + /// + /// IPV4 address of the server + /// + public string ServerIPV4Address; + /// + /// IPV6 address of the server + /// + public string ServerIPV6Address; + /// + /// port number to use for non-http communications with the server + /// + public int? ServerPort; + /// + /// Public DNS name (if any) of the server + /// + public string ServerPublicDNSName; + /// + /// result of match making process + /// + public MatchmakeStatus? Status; + /// + /// server authorization ticket (used by RedeemMatchmakerTicket to validate user insertion into the game) + /// + public string Ticket; + } + + public enum MatchmakeStatus + { + Complete, + Waiting, + GameNotFound, + NoAvailableSlots, + SessionClosed + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + [Serializable] + public class MicrosoftStorePayload : PlayFabBaseModel + { + /// + /// Microsoft store ID key. This is optional. Alternatively you can use XboxToken + /// + public string CollectionsMsIdKey; + /// + /// If collectionsMsIdKey is provided, this will verify the user id in the collectionsMsIdKey is the same. + /// + public string UserId; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). This is + /// optional. Alternatively can use CollectionsMsIdKey + /// + public string XboxToken; + } + + [Serializable] + public class ModifyUserVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Amount added or subtracted from the user's virtual currency. Maximum VC balance is Int32 (2,147,483,647). Any increase + /// over this value will be discarded. + /// + public int BalanceChange; + /// + /// User currency was subtracted from. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// Identifier by either name or ID. Note that a name may change due to renaming, or reused after being deleted. ID is + /// immutable and unique. + /// + [Serializable] + public class NameIdentifier : PlayFabBaseModel + { + /// + /// Id Identifier, if present + /// + public string Id; + /// + /// Name Identifier, if present + /// + public string Name; + } + + [Serializable] + public class NintendoServiceAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Service Account identifier for a user. + /// + public string NintendoServiceAccountId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Service Account + /// identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class NintendoSwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Device identifier for a user. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Device identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class OpenTradeRequest : PlayFabRequestCommon + { + /// + /// Players who are allowed to accept the trade. If null, the trade may be accepted by any player. If empty, the trade may + /// not be accepted by any player. + /// + public List AllowedPlayerIds; + /// + /// Player inventory items offered for trade. If not set, the trade is effectively a gift request + /// + public List OfferedInventoryInstanceIds; + /// + /// Catalog items accepted for the trade. If not set, the trade is effectively a gift. + /// + public List RequestedCatalogItemIds; + } + + [Serializable] + public class OpenTradeResponse : PlayFabResultCommon + { + /// + /// The information about the trade that was just opened. + /// + public TradeInfo Trade; + } + + /// + /// This is the second step in the purchasing process, initiating the purchase transaction with the payment provider (if + /// applicable). For payment provider scenarios, the title should next present the user with the payment provider'sinterface + /// for payment. Once the player has completed the payment with the provider, the title should call ConfirmPurchase + /// tofinalize the process and add the appropriate items to the player inventory. + /// + [Serializable] + public class PayForPurchaseRequest : PlayFabRequestCommon + { + /// + /// Currency to use to fund the purchase. + /// + public string Currency; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Purchase order identifier returned from StartPurchase. + /// + public string OrderId; + /// + /// Payment provider to use to fund the purchase. + /// + public string ProviderName; + /// + /// Payment provider transaction identifier. Required for Facebook Payments. + /// + public string ProviderTransactionId; + } + + /// + /// For web-based payment providers, this operation returns the URL to which the user should be directed inorder to approve + /// the purchase. Items added to the user inventory as a result of this operation will be marked as unconfirmed. + /// + [Serializable] + public class PayForPurchaseResult : PlayFabResultCommon + { + /// + /// Local credit applied to the transaction (provider specific). + /// + public uint CreditApplied; + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Provider used for the transaction. + /// + public string ProviderData; + /// + /// A token generated by the provider to authenticate the request (provider-specific). + /// + public string ProviderToken; + /// + /// URL to the purchase provider page that details the purchase. + /// + public string PurchaseConfirmationPageURL; + /// + /// Currency for the transaction, may be a virtual currency or real money. + /// + public string PurchaseCurrency; + /// + /// Cost of the transaction. + /// + public uint PurchasePrice; + /// + /// Status of the transaction. + /// + public TransactionStatus? Status; + /// + /// Virtual currencies granted by the transaction, if any. + /// + public Dictionary VCAmount; + /// + /// Current virtual currency balances for the user. + /// + public Dictionary VirtualCurrency; + } + + [Serializable] + public class PaymentOption : PlayFabBaseModel + { + /// + /// Specific currency to use to fund the purchase. + /// + public string Currency; + /// + /// Amount of the specified currency needed for the purchase. + /// + public uint Price; + /// + /// Name of the purchase provider for this option. + /// + public string ProviderName; + /// + /// Amount of existing credit the user has with the provider. + /// + public uint StoreCredit; + } + + [Serializable] + public class PlayerLeaderboardEntry : PlayFabBaseModel + { + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayerProfileViewConstraints : PlayFabBaseModel + { + /// + /// Whether to show player's avatar URL. Defaults to false + /// + public bool ShowAvatarUrl; + /// + /// Whether to show the banned until time. Defaults to false + /// + public bool ShowBannedUntil; + /// + /// Whether to show campaign attributions. Defaults to false + /// + public bool ShowCampaignAttributions; + /// + /// Whether to show contact email addresses. Defaults to false + /// + public bool ShowContactEmailAddresses; + /// + /// Whether to show the created date. Defaults to false + /// + public bool ShowCreated; + /// + /// Whether to show the display name. Defaults to false + /// + public bool ShowDisplayName; + /// + /// Whether to show player's experiment variants. Defaults to false + /// + public bool ShowExperimentVariants; + /// + /// Whether to show the last login time. Defaults to false + /// + public bool ShowLastLogin; + /// + /// Whether to show the linked accounts. Defaults to false + /// + public bool ShowLinkedAccounts; + /// + /// Whether to show player's locations. Defaults to false + /// + public bool ShowLocations; + /// + /// Whether to show player's membership information. Defaults to false + /// + public bool ShowMemberships; + /// + /// Whether to show origination. Defaults to false + /// + public bool ShowOrigination; + /// + /// Whether to show push notification registrations. Defaults to false + /// + public bool ShowPushNotificationRegistrations; + /// + /// Reserved for future development + /// + public bool ShowStatistics; + /// + /// Whether to show tags. Defaults to false + /// + public bool ShowTags; + /// + /// Whether to show the total value to date in usd. Defaults to false + /// + public bool ShowTotalValueToDateInUsd; + /// + /// Whether to show the values to date. Defaults to false + /// + public bool ShowValuesToDate; + } + + [Serializable] + public class PlayerStatisticVersion : PlayFabBaseModel + { + /// + /// time when the statistic version became active + /// + public DateTime ActivationTime; + /// + /// time when the statistic version became inactive due to statistic version incrementing + /// + public DateTime? DeactivationTime; + /// + /// time at which the statistic version was scheduled to become active, based on the configured ResetInterval + /// + public DateTime? ScheduledActivationTime; + /// + /// time at which the statistic version was scheduled to become inactive, based on the configured ResetInterval + /// + public DateTime? ScheduledDeactivationTime; + /// + /// name of the statistic when the version became active + /// + public string StatisticName; + /// + /// version of the statistic + /// + public uint Version; + } + + [Serializable] + public class PlayStation5Payload : PlayFabBaseModel + { + /// + /// An optional list of entitlement ids to query against PlayStation :tm: Network + /// + public List Ids; + /// + /// Id of the PlayStation :tm: Network service label to consume entitlements from + /// + public string ServiceLabel; + } + + [Serializable] + public class PSNAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the PlayStation :tm: Network + /// identifier. + /// + public string PlayFabId; + /// + /// Unique PlayStation :tm: Network identifier for a user. + /// + public string PSNAccountId; + } + + /// + /// Please note that the processing time for inventory grants and purchases increases fractionally the more items are in the + /// inventory, and the more items are in the grant/purchase operation (with each item in a bundle being a distinct add). + /// + [Serializable] + public class PurchaseItemRequest : PlayFabRequestCommon + { + /// + /// Catalog version for the items to be purchased (defaults to most recent version. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the item to purchase. + /// + public string ItemId; + /// + /// Price the client expects to pay for the item (in case a new catalog or store was uploaded, with new prices). + /// + public int Price; + /// + /// Store to buy this item through. If not set, prices default to those in the catalog. + /// + public string StoreId; + /// + /// Virtual currency to use to purchase the item. + /// + public string VirtualCurrency; + } + + [Serializable] + public class PurchaseItemResult : PlayFabResultCommon + { + /// + /// Details for the items purchased. + /// + public List Items; + } + + [Serializable] + public class PurchaseReceiptFulfillment : PlayFabBaseModel + { + /// + /// Items granted to the player in fulfillment of the validated receipt. + /// + public List FulfilledItems; + /// + /// Source of the payment price information for the recorded purchase transaction. A value of 'Request' indicates that the + /// price specified in the request was used, whereas a value of 'Catalog' indicates that the real-money price of the catalog + /// item matching the product ID in the validated receipt transaction and the currency specified in the request (defaulting + /// to USD) was used. + /// + public string RecordedPriceSource; + /// + /// Currency used to purchase the items (ISO 4217 currency code). + /// + public string RecordedTransactionCurrency; + /// + /// Amount of the stated currency paid for the items, in centesimal units + /// + public uint? RecordedTransactionTotal; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + /// + /// Coupon codes can be created for any item, or set of items, in the catalog for the title. This operation causes the + /// coupon to be consumed, and the specific items to be awarded to the user. Attempting to re-use an already consumed code, + /// or a code which has not yet been created in the service, will result in an error. + /// + [Serializable] + public class RedeemCouponRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the coupon. If null, uses the default catalog + /// + public string CatalogVersion; + /// + /// Optional identifier for the Character that should receive the item. If null, item is added to the player + /// + public string CharacterId; + /// + /// Generated coupon code to redeem. + /// + public string CouponCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class RedeemCouponResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of redeeming the coupon. + /// + public List GrantedItems; + } + + [Serializable] + public class RefreshPSNAuthTokenRequest : PlayFabRequestCommon + { + /// + /// Auth code returned by PlayStation :tm: Network OAuth system. + /// + public string AuthCode; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + } + + public enum Region + { + USCentral, + USEast, + EUWest, + Singapore, + Japan, + Brazil, + Australia + } + + [Serializable] + public class RegionInfo : PlayFabBaseModel + { + /// + /// indicates whether the server specified is available in this region + /// + public bool Available; + /// + /// name of the region + /// + public string Name; + /// + /// url to ping to get roundtrip time + /// + public string PingUrl; + /// + /// unique identifier for the region + /// + public Region? Region; + } + + /// + /// The steps to configure and send Push Notifications is described in the PlayFab tutorials, here: + /// https://docs.microsoft.com/gaming/playfab/features/engagement/push-notifications/quickstart + /// + [Serializable] + public class RegisterForIOSPushNotificationRequest : PlayFabRequestCommon + { + /// + /// Message to display when confirming push notification. + /// + public string ConfirmationMessage; + /// + /// Unique token generated by the Apple Push Notification service when the title registered to receive push notifications. + /// + public string DeviceToken; + /// + /// If true, send a test push message immediately after sucessful registration. Defaults to false. + /// + public bool? SendPushNotificationConfirmation; + } + + [Serializable] + public class RegisterForIOSPushNotificationResult : PlayFabResultCommon + { + } + + [Serializable] + public class RegisterPlayFabUserRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// An optional parameter for setting the display name for this title (3-25 characters). + /// + public string DisplayName; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Password for the PlayFab account (6-100 characters) + /// + public string Password; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// An optional parameter that specifies whether both the username and email parameters are required. If true, both + /// parameters are required; if false, the user must supply either the username or email parameter. The default value is + /// true. + /// + public bool? RequireBothUsernameAndEmail; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + /// + /// PlayFab username for the account (3-20 characters) + /// + public string Username; + } + + /// + /// Each account must have a unique email address in the PlayFab service. Once created, the account may be associated with + /// additional accounts (Steam, Facebook, Game Center, etc.), allowing for added social network lists and achievements + /// systems. + /// + [Serializable] + public class RegisterPlayFabUserResult : PlayFabLoginResultCommon + { + /// + /// If LoginTitlePlayerAccountEntity flag is set on the login request the title_player_account will also be logged in and + /// returned. + /// + public EntityTokenResponse EntityToken; + /// + /// PlayFab unique identifier for this newly created account. + /// + public string PlayFabId; + /// + /// Unique token identifying the user and game at the server level, for the current session. + /// + public string SessionTicket; + /// + /// Settings specific to this user. + /// + public UserSettings SettingsForUser; + /// + /// PlayFab unique user name. + /// + public string Username; + } + + /// + /// This API removes an existing contact email from the player's profile. + /// + [Serializable] + public class RemoveContactEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class RemoveContactEmailResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveFriendRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account which is to be removed. + /// + public string FriendPlayFabId; + } + + [Serializable] + public class RemoveFriendResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to be removed from the player. + /// + public GenericServiceId GenericId; + } + + [Serializable] + public class RemoveGenericIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class RemoveSharedGroupMembersResult : PlayFabResultCommon + { + } + + /// + /// Report ad activity + /// + [Serializable] + public class ReportAdActivityRequest : PlayFabRequestCommon + { + /// + /// Type of activity, may be Opened, Closed, Start or End + /// + public AdActivity Activity; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique ID of the placement to report for + /// + public string PlacementId; + /// + /// Unique ID of the reward the player was offered + /// + public string RewardId; + } + + /// + /// Report ad activity response has no body + /// + [Serializable] + public class ReportAdActivityResult : PlayFabResultCommon + { + } + + [Serializable] + public class ReportPlayerClientRequest : PlayFabRequestCommon + { + /// + /// Optional additional comment by reporting player. + /// + public string Comment; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier of the reported player. + /// + public string ReporteeId; + } + + /// + /// Players are currently limited to five reports per day. Attempts by a single user account to submit reports beyond five + /// will result in Updated being returned as false. + /// + [Serializable] + public class ReportPlayerClientResult : PlayFabResultCommon + { + /// + /// The number of remaining reports which may be filed today. + /// + public int SubmissionsRemaining; + } + + /// + /// The title should obtain a refresh receipt via restoreCompletedTransactions in the SKPaymentQueue of the Apple StoreKit + /// and pass that in to this call. The resultant receipt contains new receipt instances for all non-consumable goods + /// previously purchased by the user. This API call iterates through every purchase in the receipt and restores the items if + /// they still exist in the catalog and can be validated. + /// + [Serializable] + public class RestoreIOSPurchasesRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the restored items. If null, defaults to primary catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Base64 encoded receipt data, passed back by the App Store as a result of a successful purchase. + /// + public string ReceiptData; + } + + /// + /// Once verified, the valid items will be restored into the user's inventory. This result should be used for immediate + /// updates to the local client game state as opposed to the GetUserInventory API which can have an up to half second delay. + /// + [Serializable] + public class RestoreIOSPurchasesResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + /// + /// Details on which placement and reward to perform a grant on + /// + [Serializable] + public class RewardAdActivityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Placement unique ID + /// + public string PlacementId; + /// + /// Reward unique ID + /// + public string RewardId; + } + + /// + /// Result for rewarding an ad activity + /// + [Serializable] + public class RewardAdActivityResult : PlayFabResultCommon + { + /// + /// PlayStream Event ID that was generated by this reward (all subsequent events are associated with this event identifier) + /// + public string AdActivityEventId; + /// + /// Debug results from the grants + /// + public List DebugResults; + /// + /// Id of the placement the reward was for + /// + public string PlacementId; + /// + /// Name of the placement the reward was for + /// + public string PlacementName; + /// + /// If placement has viewing limits indicates how many views are left + /// + public int? PlacementViewsRemaining; + /// + /// If placement has viewing limits indicates when they will next reset + /// + public double? PlacementViewsResetMinutes; + /// + /// Reward results + /// + public AdRewardResults RewardResults; + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + /// + /// If the account in question is a "temporary" account (for example, one that was created via a call to + /// LoginFromIOSDeviceID), thisfunction will have no effect. Only PlayFab accounts which have valid email addresses will be + /// able to receive a password reset email using this API. + /// + [Serializable] + public class SendAccountRecoveryEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// The email template id of the account recovery email template to send. + /// + public string EmailTemplateId; + /// + /// Unique identifier for the title, found in the Settings > Game Properties section of the PlayFab developer site when a + /// title has been selected. + /// + public string TitleId; + } + + [Serializable] + public class SendAccountRecoveryEmailResult : PlayFabResultCommon + { + } + + /// + /// This operation is not additive. It will completely replace the tag list for the specified user. Please note that only + /// users in the PlayFab friends list can be assigned tags. Attempting to set a tag on a friend only included in the friends + /// list from a social site integration (such as Facebook or Steam) will return the AccountNotFound error. + /// + [Serializable] + public class SetFriendTagsRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account to which the tag(s) should be applied. + /// + public string FriendPlayFabId; + /// + /// Array of tags to set on the friend account. + /// + public List Tags; + } + + [Serializable] + public class SetFriendTagsResult : PlayFabResultCommon + { + } + + /// + /// APIs that require signatures require that the player have a configured Player Secret Key that is used to sign all + /// requests. Players that don't have a secret will be blocked from making API calls until it is configured. To create a + /// signature header add a SHA256 hashed string containing UTF8 encoded JSON body as it will be sent to the server, the + /// current time in UTC formatted to ISO 8601, and the players secret formatted as 'body.date.secret'. Place the resulting + /// hash into the header X-PlayFab-Signature, along with a header X-PlayFab-Timestamp of the same UTC timestamp used in the + /// signature. + /// + [Serializable] + public class SetPlayerSecretRequest : PlayFabRequestCommon + { + /// + /// Base64 encoded body that is encrypted with the Title's public RSA key (Enterprise Only). + /// + public string EncryptedRequest; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + } + + [Serializable] + public class SetPlayerSecretResult : PlayFabResultCommon + { + } + + [Serializable] + public class SharedGroupDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Unique PlayFab identifier of the user to last update this value. + /// + public string LastUpdatedBy; + /// + /// Indicates whether this data can be read by all users (public) or only members of the group (private). + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified group data key. + /// + public string Value; + } + + public enum SourceType + { + Admin, + BackEnd, + GameClient, + GameServer, + Partner, + Custom, + API + } + + /// + /// This is the first step in the purchasing process. For security purposes, once the order (or "cart") has been created, + /// additional inventory objects may no longer be added. In addition, inventory objects will be locked to the current + /// prices, regardless of any subsequent changes at the catalog level which may occur during the next two steps. + /// + [Serializable] + public class StartPurchaseRequest : PlayFabRequestCommon + { + /// + /// Catalog version for the items to be purchased. Defaults to most recent catalog. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of items to purchase. + /// + public List Items; + /// + /// Store through which to purchase items. If not set, prices will be pulled from the catalog itself. + /// + public string StoreId; + } + + [Serializable] + public class StartPurchaseResult : PlayFabResultCommon + { + /// + /// Cart items to be purchased. + /// + public List Contents; + /// + /// Purchase order identifier. + /// + public string OrderId; + /// + /// Available methods by which the user can pay. + /// + public List PaymentOptions; + /// + /// Current virtual currency totals for the user. + /// + public Dictionary VirtualCurrencyBalances; + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + [Serializable] + public class StatisticNameVersion : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// the version of the statistic to be returned + /// + public uint Version; + } + + [Serializable] + public class StatisticUpdate : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded. Null when + /// setting the statistic value for the first time. + /// + public uint? Version; + } + + [Serializable] + public class StatisticValue : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded + /// + public uint Version; + } + + [Serializable] + public class SteamPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Steam identifier. + /// + public string PlayFabId; + /// + /// Unique Steam identifier for a user. + /// + public string SteamStringId; + } + + /// + /// A store entry that list a catalog item at a particular price + /// + [Serializable] + public class StoreItem : PlayFabBaseModel + { + /// + /// Store specific custom data. The data only exists as part of this store; it is not transferred to item instances + /// + public object CustomData; + /// + /// Intended display position for this item. Note that 0 is the first position + /// + public uint? DisplayPosition; + /// + /// Unique identifier of the item as it exists in the catalog - note that this must exactly match the ItemId from the + /// catalog + /// + public string ItemId; + /// + /// Override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// Override prices for this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// Marketing data about a specific store + /// + [Serializable] + public class StoreMarketingModel : PlayFabBaseModel + { + /// + /// Tagline for a store. + /// + public string Description; + /// + /// Display name of a store as it will appear to users. + /// + public string DisplayName; + /// + /// Custom data about a store. + /// + public object Metadata; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + /// + /// This API must be enabled for use as an option in the game manager website. It is disabled by default. + /// + [Serializable] + public class SubtractUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + public enum TitleActivationStatus + { + None, + ActivatedTitleKey, + PendingSteam, + ActivatedSteam, + RevokedSteam + } + + [Serializable] + public class TitleNewsItem : PlayFabBaseModel + { + /// + /// News item text. + /// + public string Body; + /// + /// Unique identifier of news item. + /// + public string NewsId; + /// + /// Date and time when the news item was posted. + /// + public DateTime Timestamp; + /// + /// Title of the news item. + /// + public string Title; + } + + [Serializable] + public class TradeInfo : PlayFabBaseModel + { + /// + /// Item instances from the accepting player that are used to fulfill the trade. If null, no one has accepted the trade. + /// + public List AcceptedInventoryInstanceIds; + /// + /// The PlayFab ID of the player who accepted the trade. If null, no one has accepted the trade. + /// + public string AcceptedPlayerId; + /// + /// An optional list of players allowed to complete this trade. If null, anybody can complete the trade. + /// + public List AllowedPlayerIds; + /// + /// If set, The UTC time when this trade was canceled. + /// + public DateTime? CancelledAt; + /// + /// If set, The UTC time when this trade was fulfilled. + /// + public DateTime? FilledAt; + /// + /// If set, The UTC time when this trade was made invalid. + /// + public DateTime? InvalidatedAt; + /// + /// The catalogItem Ids of the item instances being offered. + /// + public List OfferedCatalogItemIds; + /// + /// The itemInstance Ids that are being offered. + /// + public List OfferedInventoryInstanceIds; + /// + /// The PlayFabId for the offering player. + /// + public string OfferingPlayerId; + /// + /// The UTC time when this trade was created. + /// + public DateTime? OpenedAt; + /// + /// The catalogItem Ids requested in exchange. + /// + public List RequestedCatalogItemIds; + /// + /// Describes the current state of this trade. + /// + public TradeStatus? Status; + /// + /// The identifier for this trade. + /// + public string TradeId; + } + + public enum TradeStatus + { + Invalid, + Opening, + Open, + Accepting, + Accepted, + Filled, + Cancelled + } + + public enum TransactionStatus + { + CreateCart, + Init, + Approved, + Succeeded, + FailedByProvider, + DisputePending, + RefundPending, + Refunded, + RefundFailed, + ChargedBack, + FailedByUber, + FailedByPlayFab, + Revoked, + TradePending, + Traded, + Upgraded, + StackPending, + Stacked, + Other, + Failed + } + + [Serializable] + public class TreatmentAssignment : PlayFabBaseModel + { + /// + /// List of the experiment variables. + /// + public List Variables; + /// + /// List of the experiment variants. + /// + public List Variants; + } + + [Serializable] + public class TwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Twitch identifier. + /// + public string PlayFabId; + /// + /// Unique Twitch identifier for a user. + /// + public string TwitchId; + } + + [Serializable] + public class UnlinkAndroidDeviceIDRequest : PlayFabRequestCommon + { + /// + /// Android device identifier for the user's device. If not specified, the most recently signed in Android Device ID will be + /// used. + /// + public string AndroidDeviceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkAndroidDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkAppleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkCustomIDRequest : PlayFabRequestCommon + { + /// + /// Custom unique identifier for the user, generated by the title. If not specified, the most recently signed in Custom ID + /// will be used. + /// + public string CustomId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkCustomIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkFacebookAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkFacebookAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkFacebookInstantGamesIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Facebook Instant Games identifier for the user. If not specified, the most recently signed in ID will be used. + /// + public string FacebookInstantGamesId; + } + + [Serializable] + public class UnlinkFacebookInstantGamesIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkGameCenterAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkGameCenterAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkGoogleAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkGoogleAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkGooglePlayGamesServicesAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkGooglePlayGamesServicesAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkIOSDeviceIDRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Vendor-specific iOS identifier for the user's device. If not specified, the most recently signed in iOS Device ID will + /// be used. + /// + public string DeviceId; + } + + [Serializable] + public class UnlinkIOSDeviceIDResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkKongregateAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkKongregateAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Nintendo Switch Device identifier for the user. If not specified, the most recently signed in device ID will be used. + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkOpenIdConnectRequest : PlayFabRequestCommon + { + /// + /// A name that identifies which configured OpenID Connect provider relationship to use. Maximum 100 characters. + /// + public string ConnectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkPSNAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkSteamAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkSteamAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkTwitchAccountRequest : PlayFabRequestCommon + { + /// + /// Valid token issued by Twitch. Used to specify which twitch account to unlink from the profile. By default it uses the + /// one that is present on the profile. + /// + public string AccessToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkTwitchAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UnlinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Specify the container and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerInstanceRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses catalog + /// associated with the item instance. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// ItemInstanceId of the container to unlock. + /// + public string ContainerItemInstanceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ItemInstanceId of the key that will be consumed by unlocking this container. If the container requires a key, this + /// parameter is required. + /// + public string KeyItemInstanceId; + } + + /// + /// Specify the type of container to open and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerItemRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses default/primary + /// catalog. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Catalog ItemId of the container type to unlock. + /// + public string ContainerItemId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// The items and vc found within the container. These will be added and stacked in the appropriate inventory. + /// + [Serializable] + public class UnlockContainerItemResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of unlocking the container. + /// + public List GrantedItems; + /// + /// Unique instance identifier of the container unlocked. + /// + public string UnlockedItemInstanceId; + /// + /// Unique instance identifier of the key used to unlock the container, if applicable. + /// + public string UnlockedWithItemInstanceId; + /// + /// Virtual currency granted to the player as a result of unlocking the container. + /// + public Dictionary VirtualCurrency; + } + + [Serializable] + public class UpdateAvatarUrlRequest : PlayFabRequestCommon + { + /// + /// URL of the avatar image. If empty, it removes the existing avatar URL. + /// + public string ImageUrl; + } + + /// + /// This function performs an additive update of the arbitrary strings containing the custom data for the character. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. New keys will be added, with the given values. No other key-value pairs will be + /// changed apart from those specified in the call. + /// + [Serializable] + public class UpdateCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + } + + [Serializable] + public class UpdateCharacterDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// Enable this option with the 'Allow Client to Post Player Statistics' option in PlayFab GameManager for your title. + /// However, this is not best practice, as this data will no longer be safely controlled by the server. This operation is + /// additive. Character Statistics not currently defined will be added, while those already defined will be updated with the + /// given values. All other user statistics will remain unchanged. Character statistics are used by the + /// character-leaderboard apis, and accessible for custom game-logic. + /// + [Serializable] + public class UpdateCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Statistics to be updated with the provided values, in the Key(string), Value(int) pattern. + /// + public Dictionary CharacterStatistics; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UpdateCharacterStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Enable this option with the 'Allow Client to Post Player Statistics' option in PlayFab GameManager for your title. + /// However, this is not best practice, as this data will no longer be safely controlled by the server. This operation is + /// additive. Statistics not currently defined will be added, while those already defined will be updated with the given + /// values. All other user statistics will remain unchanged. Note that if the statistic is intended to have a reset period, + /// the UpdatePlayerStatisticDefinition API call can be used to define that reset period. Once a statistic has been + /// versioned (reset), the now-previous version can still be written to for up a short, pre-defined period (currently 10 + /// seconds), using the Version parameter in this call. + /// + [Serializable] + public class UpdatePlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Statistics to be updated with the provided values + /// + public List Statistics; + } + + [Serializable] + public class UpdatePlayerStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Note that in the case of multiple calls to write to the same shared group data keys, the last write received by the + /// PlayFab service will determine the value available to subsequent read operations. For scenarios requiring coordination + /// of data updates, it is recommended that titles make use of user data with read permission set to public, or a + /// combination of user data and shared group data. + /// + [Serializable] + public class UpdateSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys in this request. + /// + public UserDataPermission? Permission; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class UpdateSharedGroupDataResult : PlayFabResultCommon + { + } + + /// + /// This function performs an additive update of the arbitrary strings containing the custom data for the user. In updating + /// the custom data object, keys which already exist in the object will have their values overwritten, while keys with null + /// values will be removed. New keys will be added, with the given values. No other key-value pairs will be changed apart + /// from those specified in the call. + /// + [Serializable] + public class UpdateUserDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. This is used + /// for requests by one player for information about another player; those requests will only return Public keys. + /// + public UserDataPermission? Permission; + } + + [Serializable] + public class UpdateUserDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// In addition to the PlayFab username, titles can make use of a DisplayName which is also a unique identifier, but + /// specific to the title. This allows for unique names which more closely match the theme or genre of a title, for example. + /// + [Serializable] + public class UpdateUserTitleDisplayNameRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// New title display name for the user - must be between 3 and 25 characters. + /// + public string DisplayName; + } + + [Serializable] + public class UpdateUserTitleDisplayNameResult : PlayFabResultCommon + { + /// + /// Current title display name for the user (this will be the original display name if the rename attempt failed). + /// + public string DisplayName; + } + + [Serializable] + public class UserAccountInfo : PlayFabBaseModel + { + /// + /// User Android device information, if an Android device has been linked + /// + public UserAndroidDeviceInfo AndroidDeviceInfo; + /// + /// Sign in with Apple account information, if an Apple account has been linked + /// + public UserAppleIdInfo AppleAccountInfo; + /// + /// Timestamp indicating when the user account was created + /// + public DateTime Created; + /// + /// Custom ID information, if a custom ID has been assigned + /// + public UserCustomIdInfo CustomIdInfo; + /// + /// User Facebook information, if a Facebook account has been linked + /// + public UserFacebookInfo FacebookInfo; + /// + /// Facebook Instant Games account information, if a Facebook Instant Games account has been linked + /// + public UserFacebookInstantGamesIdInfo FacebookInstantGamesIdInfo; + /// + /// User Gamecenter information, if a Gamecenter account has been linked + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// User Google account information, if a Google account has been linked + /// + public UserGoogleInfo GoogleInfo; + /// + /// User Google Play Games account information, if a Google Play Games account has been linked + /// + public UserGooglePlayGamesInfo GooglePlayGamesInfo; + /// + /// User iOS device information, if an iOS device has been linked + /// + public UserIosDeviceInfo IosDeviceInfo; + /// + /// User Kongregate account information, if a Kongregate account has been linked + /// + public UserKongregateInfo KongregateInfo; + /// + /// Nintendo Switch account information, if a Nintendo Switch account has been linked + /// + public UserNintendoSwitchAccountIdInfo NintendoSwitchAccountInfo; + /// + /// Nintendo Switch device information, if a Nintendo Switch device has been linked + /// + public UserNintendoSwitchDeviceIdInfo NintendoSwitchDeviceIdInfo; + /// + /// OpenID Connect information, if any OpenID Connect accounts have been linked + /// + public List OpenIdInfo; + /// + /// Unique identifier for the user account + /// + public string PlayFabId; + /// + /// Personal information for the user which is considered more sensitive + /// + public UserPrivateAccountInfo PrivateInfo; + /// + /// User PlayStation :tm: Network account information, if a PlayStation :tm: Network account has been linked + /// + public UserPsnInfo PsnInfo; + /// + /// User Steam information, if a Steam account has been linked + /// + public UserSteamInfo SteamInfo; + /// + /// Title-specific information for the user account + /// + public UserTitleInfo TitleInfo; + /// + /// User Twitch account information, if a Twitch account has been linked + /// + public UserTwitchInfo TwitchInfo; + /// + /// User account name in the PlayFab service + /// + public string Username; + /// + /// User XBox account information, if a XBox account has been linked + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class UserAndroidDeviceInfo : PlayFabBaseModel + { + /// + /// Android device ID + /// + public string AndroidDeviceId; + } + + [Serializable] + public class UserAppleIdInfo : PlayFabBaseModel + { + /// + /// Apple subject ID + /// + public string AppleSubjectId; + } + + [Serializable] + public class UserCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + /// + /// Indicates whether a given data key is private (readable only by the player) or public (readable by all players). When a + /// player makes a GetUserData request about another player, only keys marked Public will be returned. + /// + public enum UserDataPermission + { + Private, + Public + } + + [Serializable] + public class UserDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Indicates whether this data can be read by all users (public) or only the user (private). This is used for GetUserData + /// requests being made by one player about another player. + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified user data key. + /// + public string Value; + } + + [Serializable] + public class UserFacebookInfo : PlayFabBaseModel + { + /// + /// Facebook identifier + /// + public string FacebookId; + /// + /// Facebook full name + /// + public string FullName; + } + + [Serializable] + public class UserFacebookInstantGamesIdInfo : PlayFabBaseModel + { + /// + /// Facebook Instant Games ID + /// + public string FacebookInstantGamesId; + } + + [Serializable] + public class UserGameCenterInfo : PlayFabBaseModel + { + /// + /// Gamecenter identifier + /// + public string GameCenterId; + } + + [Serializable] + public class UserGoogleInfo : PlayFabBaseModel + { + /// + /// Email address of the Google account + /// + public string GoogleEmail; + /// + /// Gender information of the Google account + /// + public string GoogleGender; + /// + /// Google ID + /// + public string GoogleId; + /// + /// Locale of the Google account + /// + public string GoogleLocale; + /// + /// Name of the Google account user + /// + public string GoogleName; + } + + [Serializable] + public class UserGooglePlayGamesInfo : PlayFabBaseModel + { + /// + /// Avatar image url of the Google Play Games player + /// + public string GooglePlayGamesPlayerAvatarImageUrl; + /// + /// Display name of the Google Play Games player + /// + public string GooglePlayGamesPlayerDisplayName; + /// + /// Google Play Games player ID + /// + public string GooglePlayGamesPlayerId; + } + + [Serializable] + public class UserIosDeviceInfo : PlayFabBaseModel + { + /// + /// iOS device ID + /// + public string IosDeviceId; + } + + [Serializable] + public class UserKongregateInfo : PlayFabBaseModel + { + /// + /// Kongregate ID + /// + public string KongregateId; + /// + /// Kongregate Username + /// + public string KongregateName; + } + + [Serializable] + public class UserNintendoSwitchAccountIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch account subject ID + /// + public string NintendoSwitchAccountSubjectId; + } + + [Serializable] + public class UserNintendoSwitchDeviceIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch Device ID + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UserOpenIdInfo : PlayFabBaseModel + { + /// + /// OpenID Connection ID + /// + public string ConnectionId; + /// + /// OpenID Issuer + /// + public string Issuer; + /// + /// OpenID Subject + /// + public string Subject; + } + + public enum UserOrigination + { + Organic, + Steam, + Google, + Amazon, + Facebook, + Kongregate, + GamersFirst, + Unknown, + IOS, + LoadTest, + Android, + PSN, + GameCenter, + CustomId, + XboxLive, + Parse, + Twitch, + ServerCustomId, + NintendoSwitchDeviceId, + FacebookInstantGamesId, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class UserPrivateAccountInfo : PlayFabBaseModel + { + /// + /// user email address + /// + public string Email; + } + + [Serializable] + public class UserPsnInfo : PlayFabBaseModel + { + /// + /// PlayStation :tm: Network account ID + /// + public string PsnAccountId; + /// + /// PlayStation :tm: Network online ID + /// + public string PsnOnlineId; + } + + [Serializable] + public class UserSettings : PlayFabBaseModel + { + /// + /// Boolean for whether this player is eligible for gathering device info. + /// + public bool GatherDeviceInfo; + /// + /// Boolean for whether this player should report OnFocus play-time tracking. + /// + public bool GatherFocusInfo; + /// + /// Boolean for whether this player is eligible for ad tracking. + /// + public bool NeedsAttribution; + } + + [Serializable] + public class UserSteamInfo : PlayFabBaseModel + { + /// + /// what stage of game ownership the user is listed as being in, from Steam + /// + public TitleActivationStatus? SteamActivationStatus; + /// + /// the country in which the player resides, from Steam data + /// + public string SteamCountry; + /// + /// currency type set in the user Steam account + /// + public Currency? SteamCurrency; + /// + /// Steam identifier + /// + public string SteamId; + /// + /// Steam display name + /// + public string SteamName; + } + + [Serializable] + public class UserTitleInfo : PlayFabBaseModel + { + /// + /// URL to the player's avatar. + /// + public string AvatarUrl; + /// + /// timestamp indicating when the user was first associated with this game (this can differ significantly from when the user + /// first registered with PlayFab) + /// + public DateTime Created; + /// + /// name of the user, as it is displayed in-game + /// + public string DisplayName; + /// + /// timestamp indicating when the user first signed into this game (this can differ from the Created timestamp, as other + /// events, such as issuing a beta key to the user, can associate the title to the user) + /// + public DateTime? FirstLogin; + /// + /// boolean indicating whether or not the user is currently banned for a title + /// + public bool? isBanned; + /// + /// timestamp for the last user login for this title + /// + public DateTime? LastLogin; + /// + /// source by which the user first joined the game, if known + /// + public UserOrigination? Origination; + /// + /// Title player account entity for this user + /// + public EntityKey TitlePlayerAccount; + } + + [Serializable] + public class UserTwitchInfo : PlayFabBaseModel + { + /// + /// Twitch ID + /// + public string TwitchId; + /// + /// Twitch Username + /// + public string TwitchUserName; + } + + [Serializable] + public class UserXboxInfo : PlayFabBaseModel + { + /// + /// XBox user ID + /// + public string XboxUserId; + /// + /// XBox user sandbox + /// + public string XboxUserSandbox; + } + + [Serializable] + public class ValidateAmazonReceiptRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public int PurchasePrice; + /// + /// ReceiptId returned by the Amazon App Store in-app purchase API + /// + public string ReceiptId; + /// + /// AmazonId of the user making the purchase as returned by the Amazon App Store in-app purchase API + /// + public string UserId; + } + + /// + /// Once verified, the catalog item matching the Amazon item name will be added to the user's inventory. This result should + /// be used for immediate updates to the local client game state as opposed to the GetUserInventory API which can have an up + /// to half second delay. + /// + [Serializable] + public class ValidateAmazonReceiptResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + /// + /// The packageName and productId are defined in the GooglePlay store. The productId must match the ItemId of the inventory + /// item in the PlayFab catalog for the title. This enables the PlayFab service to securely validate that the purchase is + /// for the correct item, in order to prevent uses from passing valid receipts as being for more expensive items (passing a + /// receipt for a 99-cent purchase as being for a $19.99 purchase, for example). Each receipt may be validated only once to + /// avoid granting the same item over and over from a single purchase. + /// + [Serializable] + public class ValidateGooglePlayPurchaseRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public uint? PurchasePrice; + /// + /// Original JSON string returned by the Google Play IAB API. + /// + public string ReceiptJson; + /// + /// Signature returned by the Google Play IAB API. + /// + public string Signature; + } + + /// + /// Once verified, the catalog item (ItemId) matching the GooglePlay store item (productId) will be added to the user's + /// inventory. This result should be used for immediate updates to the local client game state as opposed to the + /// GetUserInventory API which can have an up to half second delay. + /// + [Serializable] + public class ValidateGooglePlayPurchaseResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + /// + /// The CurrencyCode and PurchasePrice must match the price which was set up for the item in the Apple store. In addition, + /// The ItemId of the inventory in the PlayFab Catalog must match the Product ID as it was set up in the Apple store. This + /// enables the PlayFab service to securely validate that the purchase is for the correct item, in order to prevent uses + /// from passing valid receipts as being for more expensive items (passing a receipt for a 99-cent purchase as being for a + /// $19.99 purchase, for example). + /// + [Serializable] + public class ValidateIOSReceiptRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public int PurchasePrice; + /// + /// Base64 encoded receipt data, passed back by the App Store as a result of a successful purchase. + /// + public string ReceiptData; + } + + /// + /// Once verified, the catalog item matching the iTunes item name will be added to the user's inventory. This result should + /// be used for immediate updates to the local client game state as opposed to the GetUserInventory API which can have an up + /// to half second delay. + /// + [Serializable] + public class ValidateIOSReceiptResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + [Serializable] + public class ValidateWindowsReceiptRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the fulfilled items. If null, defaults to the primary catalog. + /// + public string CatalogVersion; + /// + /// Currency used to pay for the purchase (ISO 4217 currency code). + /// + public string CurrencyCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Amount of the stated currency paid, in centesimal units. + /// + public uint PurchasePrice; + /// + /// XML Receipt returned by the Windows App Store in-app purchase API + /// + public string Receipt; + } + + /// + /// Once verified, the catalog item matching the Product name will be added to the user's inventory. This result should be + /// used for immediate updates to the local client game state as opposed to the GetUserInventory API which can have an up to + /// half second delay. + /// + [Serializable] + public class ValidateWindowsReceiptResult : PlayFabResultCommon + { + /// + /// Fulfilled inventory items and recorded purchases in fulfillment of the validated receipt transactions. + /// + public List Fulfillments; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } + + [Serializable] + public class Variable : PlayFabBaseModel + { + /// + /// Name of the variable. + /// + public string Name; + /// + /// Value of the variable. + /// + public string Value; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } + + /// + /// This API is designed to write a multitude of different client-defined events into PlayStream. It supports a flexible + /// JSON schema, which allowsfor arbitrary key-value pairs to describe any character-based event. The created event will be + /// locked to the authenticated title and player. + /// + [Serializable] + public class WriteClientCharacterEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any player-based event. The created event will be locked to the + /// authenticated title and player. + /// + [Serializable] + public class WriteClientPlayerEventRequest : PlayFabRequestCommon + { + /// + /// Custom data properties associated with the event. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + [Serializable] + public class WriteEventResponse : PlayFabResultCommon + { + /// + /// The unique identifier of the event. The values of this identifier consist of ASCII characters and are not constrained to + /// any particular format. + /// + public string EventId; + } + + /// + /// This API is designed to write a multitude of different client-defined events into PlayStream. It supports a flexible + /// JSON schema, which allowsfor arbitrary key-value pairs to describe any title-based event. The created event will be + /// locked to the authenticated title. + /// + [Serializable] + public class WriteTitleEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + [Serializable] + public class XboxLiveAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Unique Xbox Live identifier for a user. + /// + public string XboxLiveAccountId; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta new file mode 100644 index 00000000..e89f150a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabClientModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 3a0a4ef9b600e6540b14561880293235 +timeCreated: 1468524875 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs new file mode 100644 index 00000000..0c073966 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs @@ -0,0 +1,109 @@ +#if !DISABLE_PLAYFABCLIENT_API +using System.Collections.Generic; +using PlayFab.SharedModels; +using UnityEngine; + +namespace PlayFab.Internal +{ + public static class PlayFabDeviceUtil + { + private static bool _needsAttribution, _gatherDeviceInfo, _gatherScreenTime; + + #region Scrape Device Info + private static void SendDeviceInfoToPlayFab(PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) + { + if (settings.DisableDeviceInfo || !_gatherDeviceInfo) return; + + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var request = new ClientModels.DeviceInfoRequest + { + Info = serializer.DeserializeObject>(serializer.SerializeObject(new PlayFabDataGatherer())) + }; + var clientInstanceApi = instanceApi as PlayFabClientInstanceAPI; + if (clientInstanceApi != null) + clientInstanceApi.ReportDeviceInfo(request, null, OnGatherFail, settings); +#if !DISABLE_PLAYFAB_STATIC_API + else + PlayFabClientAPI.ReportDeviceInfo(request, null, OnGatherFail, settings); +#endif + } + private static void OnGatherFail(PlayFabError error) + { + Debug.Log("OnGatherFail: " + error.GenerateErrorReport()); + } + #endregion + + /// + /// When a PlayFab login occurs, check the result information, and + /// relay it to _OnPlayFabLogin where the information is used + /// + /// + public static void OnPlayFabLogin(PlayFabResultCommon result, PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) + { + var loginResult = result as ClientModels.LoginResult; + var registerResult = result as ClientModels.RegisterPlayFabUserResult; + if (loginResult == null && registerResult == null) + return; + + // Gather things common to the result types + ClientModels.UserSettings settingsForUser = null; + string playFabId = null; + string entityId = null; + string entityType = null; + + if (loginResult != null) + { + settingsForUser = loginResult.SettingsForUser; + playFabId = loginResult.PlayFabId; + if (loginResult.EntityToken != null) + { + entityId = loginResult.EntityToken.Entity.Id; + entityType = loginResult.EntityToken.Entity.Type; + } + } + else if (registerResult != null) + { + settingsForUser = registerResult.SettingsForUser; + playFabId = registerResult.PlayFabId; + if (registerResult.EntityToken != null) + { + entityId = registerResult.EntityToken.Entity.Id; + entityType = registerResult.EntityToken.Entity.Type; + } + } + + _OnPlayFabLogin(settingsForUser, playFabId, entityId, entityType, settings, instanceApi); + } + + /// + /// Separated from OnPlayFabLogin, to explicitly lose the refs to loginResult and registerResult, because + /// only one will be defined, but both usually have all the information we REALLY need here. + /// But the result signatures are different and clunky, so do the separation above, and processing here + /// + private static void _OnPlayFabLogin(ClientModels.UserSettings settingsForUser, string playFabId, string entityId, string entityType, PlayFabApiSettings settings, IPlayFabInstanceApi instanceApi) + { + _needsAttribution = _gatherDeviceInfo = _gatherScreenTime = false; + if (settingsForUser != null) + { + _needsAttribution = settingsForUser.NeedsAttribution; + _gatherDeviceInfo = settingsForUser.GatherDeviceInfo; + _gatherScreenTime = settingsForUser.GatherFocusInfo; + } + + // Device information gathering + SendDeviceInfoToPlayFab(settings, instanceApi); + +#if !DISABLE_PLAYFABENTITY_API + if (!string.IsNullOrEmpty(entityId) && !string.IsNullOrEmpty(entityType) && _gatherScreenTime) + { + PlayFabHttp.InitializeScreenTimeTracker(entityId, entityType, playFabId); + } + else + { + settings.DisableFocusTimeCollection = true; + } +#endif + } + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta new file mode 100644 index 00000000..c17526e9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabDeviceUtil.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: dd4190ddf909a304eb43068a0caea903 +timeCreated: 1494526811 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs new file mode 100644 index 00000000..78e95c70 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs @@ -0,0 +1,325 @@ +#if !DISABLE_PLAYFABCLIENT_API +using PlayFab.ClientModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabResultEvent OnLoginResultEvent; + + public event PlayFabRequestEvent OnAcceptTradeRequestEvent; + public event PlayFabResultEvent OnAcceptTradeResultEvent; + public event PlayFabRequestEvent OnAddFriendRequestEvent; + public event PlayFabResultEvent OnAddFriendResultEvent; + public event PlayFabRequestEvent OnAddGenericIDRequestEvent; + public event PlayFabResultEvent OnAddGenericIDResultEvent; + public event PlayFabRequestEvent OnAddOrUpdateContactEmailRequestEvent; + public event PlayFabResultEvent OnAddOrUpdateContactEmailResultEvent; + public event PlayFabRequestEvent OnAddSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnAddSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnAddUsernamePasswordRequestEvent; + public event PlayFabResultEvent OnAddUsernamePasswordResultEvent; + public event PlayFabRequestEvent OnAddUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnAddUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnAndroidDevicePushNotificationRegistrationRequestEvent; + public event PlayFabResultEvent OnAndroidDevicePushNotificationRegistrationResultEvent; + public event PlayFabRequestEvent OnAttributeInstallRequestEvent; + public event PlayFabResultEvent OnAttributeInstallResultEvent; + public event PlayFabRequestEvent OnCancelTradeRequestEvent; + public event PlayFabResultEvent OnCancelTradeResultEvent; + public event PlayFabRequestEvent OnConfirmPurchaseRequestEvent; + public event PlayFabResultEvent OnConfirmPurchaseResultEvent; + public event PlayFabRequestEvent OnConsumeItemRequestEvent; + public event PlayFabResultEvent OnConsumeItemResultEvent; + public event PlayFabRequestEvent OnConsumeMicrosoftStoreEntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumeMicrosoftStoreEntitlementsResultEvent; + public event PlayFabRequestEvent OnConsumePS5EntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumePS5EntitlementsResultEvent; + public event PlayFabRequestEvent OnConsumePSNEntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumePSNEntitlementsResultEvent; + public event PlayFabRequestEvent OnConsumeXboxEntitlementsRequestEvent; + public event PlayFabResultEvent OnConsumeXboxEntitlementsResultEvent; + public event PlayFabRequestEvent OnCreateSharedGroupRequestEvent; + public event PlayFabResultEvent OnCreateSharedGroupResultEvent; + public event PlayFabRequestEvent OnExecuteCloudScriptRequestEvent; + public event PlayFabResultEvent OnExecuteCloudScriptResultEvent; + public event PlayFabRequestEvent OnGetAccountInfoRequestEvent; + public event PlayFabResultEvent OnGetAccountInfoResultEvent; + public event PlayFabRequestEvent OnGetAdPlacementsRequestEvent; + public event PlayFabResultEvent OnGetAdPlacementsResultEvent; + public event PlayFabRequestEvent OnGetAllUsersCharactersRequestEvent; + public event PlayFabResultEvent OnGetAllUsersCharactersResultEvent; + public event PlayFabRequestEvent OnGetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnGetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnGetCharacterDataRequestEvent; + public event PlayFabResultEvent OnGetCharacterDataResultEvent; + public event PlayFabRequestEvent OnGetCharacterInventoryRequestEvent; + public event PlayFabResultEvent OnGetCharacterInventoryResultEvent; + public event PlayFabRequestEvent OnGetCharacterLeaderboardRequestEvent; + public event PlayFabResultEvent OnGetCharacterLeaderboardResultEvent; + public event PlayFabRequestEvent OnGetCharacterReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnGetCharacterReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnGetCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnGetCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnGetContentDownloadUrlRequestEvent; + public event PlayFabResultEvent OnGetContentDownloadUrlResultEvent; + public event PlayFabRequestEvent OnGetCurrentGamesRequestEvent; + public event PlayFabResultEvent OnGetCurrentGamesResultEvent; + public event PlayFabRequestEvent OnGetFriendLeaderboardRequestEvent; + public event PlayFabResultEvent OnGetFriendLeaderboardResultEvent; + public event PlayFabRequestEvent OnGetFriendLeaderboardAroundPlayerRequestEvent; + public event PlayFabResultEvent OnGetFriendLeaderboardAroundPlayerResultEvent; + public event PlayFabRequestEvent OnGetFriendsListRequestEvent; + public event PlayFabResultEvent OnGetFriendsListResultEvent; + public event PlayFabRequestEvent OnGetGameServerRegionsRequestEvent; + public event PlayFabResultEvent OnGetGameServerRegionsResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardAroundCharacterRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardAroundCharacterResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardAroundPlayerRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardAroundPlayerResultEvent; + public event PlayFabRequestEvent OnGetLeaderboardForUserCharactersRequestEvent; + public event PlayFabResultEvent OnGetLeaderboardForUserCharactersResultEvent; + public event PlayFabRequestEvent OnGetPaymentTokenRequestEvent; + public event PlayFabResultEvent OnGetPaymentTokenResultEvent; + public event PlayFabRequestEvent OnGetPhotonAuthenticationTokenRequestEvent; + public event PlayFabResultEvent OnGetPhotonAuthenticationTokenResultEvent; + public event PlayFabRequestEvent OnGetPlayerCombinedInfoRequestEvent; + public event PlayFabResultEvent OnGetPlayerCombinedInfoResultEvent; + public event PlayFabRequestEvent OnGetPlayerProfileRequestEvent; + public event PlayFabResultEvent OnGetPlayerProfileResultEvent; + public event PlayFabRequestEvent OnGetPlayerSegmentsRequestEvent; + public event PlayFabResultEvent OnGetPlayerSegmentsResultEvent; + public event PlayFabRequestEvent OnGetPlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnGetPlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnGetPlayerStatisticVersionsRequestEvent; + public event PlayFabResultEvent OnGetPlayerStatisticVersionsResultEvent; + public event PlayFabRequestEvent OnGetPlayerTagsRequestEvent; + public event PlayFabResultEvent OnGetPlayerTagsResultEvent; + public event PlayFabRequestEvent OnGetPlayerTradesRequestEvent; + public event PlayFabResultEvent OnGetPlayerTradesResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromFacebookIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromFacebookIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGameCenterIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGameCenterIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGenericIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGenericIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGoogleIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGoogleIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromKongregateIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromKongregateIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromPSNAccountIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromPSNAccountIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromSteamIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromSteamIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromTwitchIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromTwitchIDsResultEvent; + public event PlayFabRequestEvent OnGetPlayFabIDsFromXboxLiveIDsRequestEvent; + public event PlayFabResultEvent OnGetPlayFabIDsFromXboxLiveIDsResultEvent; + public event PlayFabRequestEvent OnGetPublisherDataRequestEvent; + public event PlayFabResultEvent OnGetPublisherDataResultEvent; + public event PlayFabRequestEvent OnGetPurchaseRequestEvent; + public event PlayFabResultEvent OnGetPurchaseResultEvent; + public event PlayFabRequestEvent OnGetSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnGetSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnGetStoreItemsRequestEvent; + public event PlayFabResultEvent OnGetStoreItemsResultEvent; + public event PlayFabRequestEvent OnGetTimeRequestEvent; + public event PlayFabResultEvent OnGetTimeResultEvent; + public event PlayFabRequestEvent OnGetTitleDataRequestEvent; + public event PlayFabResultEvent OnGetTitleDataResultEvent; + public event PlayFabRequestEvent OnGetTitleNewsRequestEvent; + public event PlayFabResultEvent OnGetTitleNewsResultEvent; + public event PlayFabRequestEvent OnGetTitlePublicKeyRequestEvent; + public event PlayFabResultEvent OnGetTitlePublicKeyResultEvent; + public event PlayFabRequestEvent OnGetTradeStatusRequestEvent; + public event PlayFabResultEvent OnGetTradeStatusResultEvent; + public event PlayFabRequestEvent OnGetUserDataRequestEvent; + public event PlayFabResultEvent OnGetUserDataResultEvent; + public event PlayFabRequestEvent OnGetUserInventoryRequestEvent; + public event PlayFabResultEvent OnGetUserInventoryResultEvent; + public event PlayFabRequestEvent OnGetUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnGetUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnGetUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnGetUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnGetUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnGetUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnGrantCharacterToUserRequestEvent; + public event PlayFabResultEvent OnGrantCharacterToUserResultEvent; + public event PlayFabRequestEvent OnLinkAndroidDeviceIDRequestEvent; + public event PlayFabResultEvent OnLinkAndroidDeviceIDResultEvent; + public event PlayFabRequestEvent OnLinkAppleRequestEvent; + public event PlayFabResultEvent OnLinkAppleResultEvent; + public event PlayFabRequestEvent OnLinkCustomIDRequestEvent; + public event PlayFabResultEvent OnLinkCustomIDResultEvent; + public event PlayFabRequestEvent OnLinkFacebookAccountRequestEvent; + public event PlayFabResultEvent OnLinkFacebookAccountResultEvent; + public event PlayFabRequestEvent OnLinkFacebookInstantGamesIdRequestEvent; + public event PlayFabResultEvent OnLinkFacebookInstantGamesIdResultEvent; + public event PlayFabRequestEvent OnLinkGameCenterAccountRequestEvent; + public event PlayFabResultEvent OnLinkGameCenterAccountResultEvent; + public event PlayFabRequestEvent OnLinkGoogleAccountRequestEvent; + public event PlayFabResultEvent OnLinkGoogleAccountResultEvent; + public event PlayFabRequestEvent OnLinkGooglePlayGamesServicesAccountRequestEvent; + public event PlayFabResultEvent OnLinkGooglePlayGamesServicesAccountResultEvent; + public event PlayFabRequestEvent OnLinkIOSDeviceIDRequestEvent; + public event PlayFabResultEvent OnLinkIOSDeviceIDResultEvent; + public event PlayFabRequestEvent OnLinkKongregateRequestEvent; + public event PlayFabResultEvent OnLinkKongregateResultEvent; + public event PlayFabRequestEvent OnLinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnLinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnLinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnLinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnLinkOpenIdConnectRequestEvent; + public event PlayFabResultEvent OnLinkOpenIdConnectResultEvent; + public event PlayFabRequestEvent OnLinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnLinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnLinkSteamAccountRequestEvent; + public event PlayFabResultEvent OnLinkSteamAccountResultEvent; + public event PlayFabRequestEvent OnLinkTwitchRequestEvent; + public event PlayFabResultEvent OnLinkTwitchResultEvent; + public event PlayFabRequestEvent OnLinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnLinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnLoginWithAndroidDeviceIDRequestEvent; + public event PlayFabRequestEvent OnLoginWithAppleRequestEvent; + public event PlayFabRequestEvent OnLoginWithCustomIDRequestEvent; + public event PlayFabRequestEvent OnLoginWithEmailAddressRequestEvent; + public event PlayFabRequestEvent OnLoginWithFacebookRequestEvent; + public event PlayFabRequestEvent OnLoginWithFacebookInstantGamesIdRequestEvent; + public event PlayFabRequestEvent OnLoginWithGameCenterRequestEvent; + public event PlayFabRequestEvent OnLoginWithGoogleAccountRequestEvent; + public event PlayFabRequestEvent OnLoginWithGooglePlayGamesServicesRequestEvent; + public event PlayFabRequestEvent OnLoginWithIOSDeviceIDRequestEvent; + public event PlayFabRequestEvent OnLoginWithKongregateRequestEvent; + public event PlayFabRequestEvent OnLoginWithNintendoServiceAccountRequestEvent; + public event PlayFabRequestEvent OnLoginWithNintendoSwitchDeviceIdRequestEvent; + public event PlayFabRequestEvent OnLoginWithOpenIdConnectRequestEvent; + public event PlayFabRequestEvent OnLoginWithPlayFabRequestEvent; + public event PlayFabRequestEvent OnLoginWithPSNRequestEvent; + public event PlayFabRequestEvent OnLoginWithSteamRequestEvent; + public event PlayFabRequestEvent OnLoginWithTwitchRequestEvent; + public event PlayFabRequestEvent OnLoginWithXboxRequestEvent; + public event PlayFabRequestEvent OnMatchmakeRequestEvent; + public event PlayFabResultEvent OnMatchmakeResultEvent; + public event PlayFabRequestEvent OnOpenTradeRequestEvent; + public event PlayFabResultEvent OnOpenTradeResultEvent; + public event PlayFabRequestEvent OnPayForPurchaseRequestEvent; + public event PlayFabResultEvent OnPayForPurchaseResultEvent; + public event PlayFabRequestEvent OnPurchaseItemRequestEvent; + public event PlayFabResultEvent OnPurchaseItemResultEvent; + public event PlayFabRequestEvent OnRedeemCouponRequestEvent; + public event PlayFabResultEvent OnRedeemCouponResultEvent; + public event PlayFabRequestEvent OnRefreshPSNAuthTokenRequestEvent; + public event PlayFabResultEvent OnRefreshPSNAuthTokenResultEvent; + public event PlayFabRequestEvent OnRegisterForIOSPushNotificationRequestEvent; + public event PlayFabResultEvent OnRegisterForIOSPushNotificationResultEvent; + public event PlayFabRequestEvent OnRegisterPlayFabUserRequestEvent; + public event PlayFabResultEvent OnRegisterPlayFabUserResultEvent; + public event PlayFabRequestEvent OnRemoveContactEmailRequestEvent; + public event PlayFabResultEvent OnRemoveContactEmailResultEvent; + public event PlayFabRequestEvent OnRemoveFriendRequestEvent; + public event PlayFabResultEvent OnRemoveFriendResultEvent; + public event PlayFabRequestEvent OnRemoveGenericIDRequestEvent; + public event PlayFabResultEvent OnRemoveGenericIDResultEvent; + public event PlayFabRequestEvent OnRemoveSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnRemoveSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnReportAdActivityRequestEvent; + public event PlayFabResultEvent OnReportAdActivityResultEvent; + public event PlayFabRequestEvent OnReportDeviceInfoRequestEvent; + public event PlayFabResultEvent OnReportDeviceInfoResultEvent; + public event PlayFabRequestEvent OnReportPlayerRequestEvent; + public event PlayFabResultEvent OnReportPlayerResultEvent; + public event PlayFabRequestEvent OnRestoreIOSPurchasesRequestEvent; + public event PlayFabResultEvent OnRestoreIOSPurchasesResultEvent; + public event PlayFabRequestEvent OnRewardAdActivityRequestEvent; + public event PlayFabResultEvent OnRewardAdActivityResultEvent; + public event PlayFabRequestEvent OnSendAccountRecoveryEmailRequestEvent; + public event PlayFabResultEvent OnSendAccountRecoveryEmailResultEvent; + public event PlayFabRequestEvent OnSetFriendTagsRequestEvent; + public event PlayFabResultEvent OnSetFriendTagsResultEvent; + public event PlayFabRequestEvent OnSetPlayerSecretRequestEvent; + public event PlayFabResultEvent OnSetPlayerSecretResultEvent; + public event PlayFabRequestEvent OnStartPurchaseRequestEvent; + public event PlayFabResultEvent OnStartPurchaseResultEvent; + public event PlayFabRequestEvent OnSubtractUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnSubtractUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnUnlinkAndroidDeviceIDRequestEvent; + public event PlayFabResultEvent OnUnlinkAndroidDeviceIDResultEvent; + public event PlayFabRequestEvent OnUnlinkAppleRequestEvent; + public event PlayFabResultEvent OnUnlinkAppleResultEvent; + public event PlayFabRequestEvent OnUnlinkCustomIDRequestEvent; + public event PlayFabResultEvent OnUnlinkCustomIDResultEvent; + public event PlayFabRequestEvent OnUnlinkFacebookAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkFacebookAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkFacebookInstantGamesIdRequestEvent; + public event PlayFabResultEvent OnUnlinkFacebookInstantGamesIdResultEvent; + public event PlayFabRequestEvent OnUnlinkGameCenterAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkGameCenterAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkGoogleAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkGoogleAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkGooglePlayGamesServicesAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkGooglePlayGamesServicesAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkIOSDeviceIDRequestEvent; + public event PlayFabResultEvent OnUnlinkIOSDeviceIDResultEvent; + public event PlayFabRequestEvent OnUnlinkKongregateRequestEvent; + public event PlayFabResultEvent OnUnlinkKongregateResultEvent; + public event PlayFabRequestEvent OnUnlinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnUnlinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnUnlinkOpenIdConnectRequestEvent; + public event PlayFabResultEvent OnUnlinkOpenIdConnectResultEvent; + public event PlayFabRequestEvent OnUnlinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkSteamAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkSteamAccountResultEvent; + public event PlayFabRequestEvent OnUnlinkTwitchRequestEvent; + public event PlayFabResultEvent OnUnlinkTwitchResultEvent; + public event PlayFabRequestEvent OnUnlinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnUnlinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnUnlockContainerInstanceRequestEvent; + public event PlayFabResultEvent OnUnlockContainerInstanceResultEvent; + public event PlayFabRequestEvent OnUnlockContainerItemRequestEvent; + public event PlayFabResultEvent OnUnlockContainerItemResultEvent; + public event PlayFabRequestEvent OnUpdateAvatarUrlRequestEvent; + public event PlayFabResultEvent OnUpdateAvatarUrlResultEvent; + public event PlayFabRequestEvent OnUpdateCharacterDataRequestEvent; + public event PlayFabResultEvent OnUpdateCharacterDataResultEvent; + public event PlayFabRequestEvent OnUpdateCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnUpdateCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnUpdatePlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnUpdatePlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnUpdateSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnUpdateSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnUpdateUserDataRequestEvent; + public event PlayFabResultEvent OnUpdateUserDataResultEvent; + public event PlayFabRequestEvent OnUpdateUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnUpdateUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnUpdateUserTitleDisplayNameRequestEvent; + public event PlayFabResultEvent OnUpdateUserTitleDisplayNameResultEvent; + public event PlayFabRequestEvent OnValidateAmazonIAPReceiptRequestEvent; + public event PlayFabResultEvent OnValidateAmazonIAPReceiptResultEvent; + public event PlayFabRequestEvent OnValidateGooglePlayPurchaseRequestEvent; + public event PlayFabResultEvent OnValidateGooglePlayPurchaseResultEvent; + public event PlayFabRequestEvent OnValidateIOSReceiptRequestEvent; + public event PlayFabResultEvent OnValidateIOSReceiptResultEvent; + public event PlayFabRequestEvent OnValidateWindowsStoreReceiptRequestEvent; + public event PlayFabResultEvent OnValidateWindowsStoreReceiptResultEvent; + public event PlayFabRequestEvent OnWriteCharacterEventRequestEvent; + public event PlayFabResultEvent OnWriteCharacterEventResultEvent; + public event PlayFabRequestEvent OnWritePlayerEventRequestEvent; + public event PlayFabResultEvent OnWritePlayerEventResultEvent; + public event PlayFabRequestEvent OnWriteTitleEventRequestEvent; + public event PlayFabResultEvent OnWriteTitleEventResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta new file mode 100644 index 00000000..e06d2d97 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Client/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: da33df462ae2fa04cb401398dc2b8a5d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript.meta new file mode 100644 index 00000000..a8493465 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 02094465bfb2b7541a0a06763843a2ee +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs new file mode 100644 index 00000000..1ea0efdd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs @@ -0,0 +1,218 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.CloudScriptModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// API methods for executing CloudScript using an Entity Profile + /// + public static class PlayFabCloudScriptAPI + { + static PlayFabCloudScriptAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public static void ExecuteEntityCloudScript(ExecuteEntityCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteEntityCloudScript", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public static void ExecuteFunction(ExecuteFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + var localApiServerString = PlayFabSettings.LocalApiServer; + if (!string.IsNullOrEmpty(localApiServerString)) + { + var baseUri = new Uri(localApiServerString); + var fullUri = new Uri(baseUri, "/CloudScript/ExecuteFunction".TrimStart('/')); + PlayFabHttp.MakeApiCallWithFullUri(fullUri.AbsoluteUri, request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + return; + } + + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets registered Azure Functions for a given title id and function name. + /// + public static void GetFunction(GetFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/GetFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all currently registered Azure Functions for a given title. + /// + public static void ListFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ListFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all currently registered HTTP triggered Azure Functions for a given title. + /// + public static void ListHttpFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ListHttpFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all currently registered Queue triggered Azure Functions for a given title. + /// + public static void ListQueuedFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/ListQueuedFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public static void PostFunctionResultForEntityTriggeredAction(PostFunctionResultForEntityTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForEntityTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public static void PostFunctionResultForFunctionExecution(PostFunctionResultForFunctionExecutionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForFunctionExecution", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate a player PlayStream event for the provided function result. + /// + public static void PostFunctionResultForPlayerTriggeredAction(PostFunctionResultForPlayerTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForPlayerTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Generate a PlayStream event for the provided function result. + /// + public static void PostFunctionResultForScheduledTask(PostFunctionResultForScheduledTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForScheduledTask", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers an HTTP triggered Azure function with a title. + /// + public static void RegisterHttpFunction(RegisterHttpFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/RegisterHttpFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Registers a queue triggered Azure Function with a title. + /// + public static void RegisterQueuedFunction(RegisterQueuedFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/RegisterQueuedFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unregisters an Azure Function with a title. + /// + public static void UnregisterFunction(UnregisterFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/CloudScript/UnregisterFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta new file mode 100644 index 00000000..833b2998 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e9b8ec61c6ab7d2438b7b65a4dd9ef59 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs new file mode 100644 index 00000000..f9dbdda6 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs @@ -0,0 +1,202 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.CloudScriptModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// API methods for executing CloudScript using an Entity Profile + /// + public class PlayFabCloudScriptInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabCloudScriptInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabCloudScriptInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public void ExecuteEntityCloudScript(ExecuteEntityCloudScriptRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteEntityCloudScript", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cloud Script is one of PlayFab's most versatile features. It allows client code to request execution of any kind of + /// custom server-side functionality you can implement, and it can be used in conjunction with virtually anything. + /// + public void ExecuteFunction(ExecuteFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ExecuteFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets registered Azure Functions for a given title id and function name. + /// + public void GetFunction(GetFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/GetFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all currently registered Azure Functions for a given title. + /// + public void ListFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ListFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all currently registered HTTP triggered Azure Functions for a given title. + /// + public void ListHttpFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ListHttpFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all currently registered Queue triggered Azure Functions for a given title. + /// + public void ListQueuedFunctions(ListFunctionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/ListQueuedFunctions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public void PostFunctionResultForEntityTriggeredAction(PostFunctionResultForEntityTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForEntityTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate an entity PlayStream event for the provided function result. + /// + public void PostFunctionResultForFunctionExecution(PostFunctionResultForFunctionExecutionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForFunctionExecution", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate a player PlayStream event for the provided function result. + /// + public void PostFunctionResultForPlayerTriggeredAction(PostFunctionResultForPlayerTriggeredActionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForPlayerTriggeredAction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Generate a PlayStream event for the provided function result. + /// + public void PostFunctionResultForScheduledTask(PostFunctionResultForScheduledTaskRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/PostFunctionResultForScheduledTask", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers an HTTP triggered Azure function with a title. + /// + public void RegisterHttpFunction(RegisterHttpFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/RegisterHttpFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Registers a queue triggered Azure Function with a title. + /// + public void RegisterQueuedFunction(RegisterQueuedFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/RegisterQueuedFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unregisters an Azure Function with a title. + /// + public void UnregisterFunction(UnregisterFunctionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/CloudScript/UnregisterFunction", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta new file mode 100644 index 00000000..e8e15c2f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ac313c777a2b7054e9632c96829e1f7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs new file mode 100644 index 00000000..ac61bbfe --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs @@ -0,0 +1,1130 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.CloudScriptModels +{ + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + public enum CloudScriptRevisionOption + { + Live, + Latest, + Specific + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResult : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabResultCommon + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + /// + /// Executes CloudScript with the entity profile that is defined in the request. + /// + [Serializable] + public class ExecuteEntityCloudScriptRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the first argument + /// + public object FunctionParameter; + /// + /// Generate a 'entity_executed_cloudscript' PlayStream event containing the results of the function execution and other + /// contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + /// + /// Option for which revision of the CloudScript to execute. 'Latest' executes the most recently created revision, 'Live' + /// executes the current live, published revision, and 'Specific' executes the specified revision. The default value is + /// 'Specific', if the SpecificRevision parameter is specified, otherwise it is 'Live'. + /// + public CloudScriptRevisionOption? RevisionSelection; + /// + /// The specific revision to execute, when RevisionSelection is set to 'Specific' + /// + public int? SpecificRevision; + } + + /// + /// Executes an Azure Function with the profile of the entity that is defined in the request. + /// + [Serializable] + public class ExecuteFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the FunctionArgument field of the FunctionExecutionContext data structure + /// + public object FunctionParameter; + /// + /// Generate a 'entity_executed_cloudscript_function' PlayStream event containing the results of the function execution and + /// other contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + } + + [Serializable] + public class ExecuteFunctionResult : PlayFabResultCommon + { + /// + /// Error from the CloudScript Azure Function. + /// + public FunctionExecutionError Error; + /// + /// The amount of time the function took to execute + /// + public int ExecutionTimeMilliseconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. + /// + public bool? FunctionResultTooLarge; + } + + [Serializable] + public class FunctionExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptAzureFunctionsExecutionTimeLimitExceeded, CloudScriptAzureFunctionsArgumentSizeExceeded, + /// CloudScriptAzureFunctionsReturnSizeExceeded or CloudScriptAzureFunctionsHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the function at which the error occurred, if any + /// + public string StackTrace; + } + + [Serializable] + public class FunctionModel : PlayFabBaseModel + { + /// + /// The address of the function. + /// + public string FunctionAddress; + /// + /// The name the function was registered under. + /// + public string FunctionName; + /// + /// The trigger type for the function. + /// + public string TriggerType; + } + + [Serializable] + public class GetFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + } + + [Serializable] + public class GetFunctionResult : PlayFabResultCommon + { + /// + /// The connection string for the storage account containing the queue for a queue trigger Azure Function. + /// + public string ConnectionString; + /// + /// The URL to be invoked to execute an HTTP triggered function. + /// + public string FunctionUrl; + /// + /// The name of the queue for a queue trigger Azure Function. + /// + public string QueueName; + /// + /// The trigger type for the function. + /// + public string TriggerType; + } + + [Serializable] + public class HttpFunctionModel : PlayFabBaseModel + { + /// + /// The name the function was registered under. + /// + public string FunctionName; + /// + /// The URL of the function. + /// + public string FunctionUrl; + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + /// + /// A title can have many functions, ListHttpFunctions will return a list of all the currently registered HTTP triggered + /// functions for a given title. + /// + [Serializable] + public class ListFunctionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListFunctionsResult : PlayFabResultCommon + { + /// + /// The list of functions that are currently registered for the title. + /// + public List Functions; + } + + [Serializable] + public class ListHttpFunctionsResult : PlayFabResultCommon + { + /// + /// The list of HTTP triggered functions that are currently registered for the title. + /// + public List Functions; + } + + [Serializable] + public class ListQueuedFunctionsResult : PlayFabResultCommon + { + /// + /// The list of Queue triggered functions that are currently registered for the title. + /// + public List Functions; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + /// + /// Identifier by either name or ID. Note that a name may change due to renaming, or reused after being deleted. ID is + /// immutable and unique. + /// + [Serializable] + public class NameIdentifier : PlayFabBaseModel + { + /// + /// Id Identifier, if present + /// + public string Id; + /// + /// Name Identifier, if present + /// + public string Name; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayStreamEventEnvelopeModel : PlayFabBaseModel + { + /// + /// The ID of the entity the event is about. + /// + public string EntityId; + /// + /// The type of the entity the event is about. + /// + public string EntityType; + /// + /// Data specific to this event. + /// + public string EventData; + /// + /// The name of the event. + /// + public string EventName; + /// + /// The namespace of the event. + /// + public string EventNamespace; + /// + /// Settings for the event. + /// + public string EventSettings; + } + + [Serializable] + public class PostFunctionResultForEntityTriggeredActionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The result of the function execution. + /// + public ExecuteFunctionResult FunctionResult; + } + + [Serializable] + public class PostFunctionResultForFunctionExecutionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The result of the function execution. + /// + public ExecuteFunctionResult FunctionResult; + } + + [Serializable] + public class PostFunctionResultForPlayerTriggeredActionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The result of the function execution. + /// + public ExecuteFunctionResult FunctionResult; + /// + /// The player profile the function was invoked with. + /// + public PlayerProfileModel PlayerProfile; + /// + /// The triggering PlayStream event, if any, that caused the function to be invoked. + /// + public PlayStreamEventEnvelopeModel PlayStreamEventEnvelope; + } + + [Serializable] + public class PostFunctionResultForScheduledTaskRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The result of the function execution + /// + public ExecuteFunctionResult FunctionResult; + /// + /// The id of the scheduled task that invoked the function. + /// + public NameIdentifier ScheduledTaskId; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class QueuedFunctionModel : PlayFabBaseModel + { + /// + /// The connection string for the Azure Storage Account that hosts the queue. + /// + public string ConnectionString; + /// + /// The name the function was registered under. + /// + public string FunctionName; + /// + /// The name of the queue that triggers the Azure Function. + /// + public string QueueName; + } + + [Serializable] + public class RegisterHttpFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + /// + /// Full URL for Azure Function that implements the function. + /// + public string FunctionUrl; + } + + /// + /// A title can have many functions, RegisterQueuedFunction associates a function name with a queue name and connection + /// string. + /// + [Serializable] + public class RegisterQueuedFunctionRequest : PlayFabRequestCommon + { + /// + /// A connection string for the storage account that hosts the queue for the Azure Function. + /// + public string ConnectionString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + /// + /// The name of the queue for the Azure Function. + /// + public string QueueName; + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + public enum TriggerType + { + HTTP, + Queue + } + + [Serializable] + public class UnregisterFunctionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the function to register + /// + public string FunctionName; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta new file mode 100644 index 00000000..d4e812ca --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabCloudScriptModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e51e70743e2edab4f88b8de52466db7d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs new file mode 100644 index 00000000..2ae29610 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs @@ -0,0 +1,36 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.CloudScriptModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnCloudScriptExecuteEntityCloudScriptRequestEvent; + public event PlayFabResultEvent OnCloudScriptExecuteEntityCloudScriptResultEvent; + public event PlayFabRequestEvent OnCloudScriptExecuteFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptExecuteFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptGetFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptGetFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptListFunctionsRequestEvent; + public event PlayFabResultEvent OnCloudScriptListFunctionsResultEvent; + public event PlayFabRequestEvent OnCloudScriptListHttpFunctionsRequestEvent; + public event PlayFabResultEvent OnCloudScriptListHttpFunctionsResultEvent; + public event PlayFabRequestEvent OnCloudScriptListQueuedFunctionsRequestEvent; + public event PlayFabResultEvent OnCloudScriptListQueuedFunctionsResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent; + public event PlayFabRequestEvent OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent; + public event PlayFabResultEvent OnCloudScriptPostFunctionResultForScheduledTaskResultEvent; + public event PlayFabRequestEvent OnCloudScriptRegisterHttpFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptRegisterHttpFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptRegisterQueuedFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptRegisterQueuedFunctionResultEvent; + public event PlayFabRequestEvent OnCloudScriptUnregisterFunctionRequestEvent; + public event PlayFabResultEvent OnCloudScriptUnregisterFunctionResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta new file mode 100644 index 00000000..d80817e0 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/CloudScript/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea444771567a8e747be86eb07cdef93a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data.meta new file mode 100644 index 00000000..c82ab9d8 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f754faf8b4b186c438c8419bed778294 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs new file mode 100644 index 00000000..8ef399bb --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs @@ -0,0 +1,133 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.DataModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Store arbitrary data associated with an entity. Objects are small (~1KB) JSON-compatible objects which are stored + /// directly on the entity profile. Objects are made available for use in other PlayFab contexts, such as PlayStream events + /// and CloudScript functions. Files can efficiently store data of any size or format. Both objects and files support a + /// flexible permissions system to control read and write access by other entities. + /// + public static class PlayFabDataAPI + { + static PlayFabDataAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Abort pending file uploads to an entity's profile. + /// + public static void AbortFileUploads(AbortFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/AbortFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete files on an entity's profile. + /// + public static void DeleteFiles(DeleteFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/DeleteFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Finalize file uploads to an entity's profile. + /// + public static void FinalizeFileUploads(FinalizeFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/FinalizeFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves file metadata from an entity's profile. + /// + public static void GetFiles(GetFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/GetFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves objects from an entity's profile. + /// + public static void GetObjects(GetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Object/GetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Initiates file uploads to an entity's profile. + /// + public static void InitiateFileUploads(InitiateFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/File/InitiateFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets objects on an entity's profile. + /// + public static void SetObjects(SetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Object/SetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta new file mode 100644 index 00000000..df22d502 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cb3cb06f2399ca44ad3395fed658494 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs new file mode 100644 index 00000000..f13c4535 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs @@ -0,0 +1,137 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.DataModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Store arbitrary data associated with an entity. Objects are small (~1KB) JSON-compatible objects which are stored + /// directly on the entity profile. Objects are made available for use in other PlayFab contexts, such as PlayStream events + /// and CloudScript functions. Files can efficiently store data of any size or format. Both objects and files support a + /// flexible permissions system to control read and write access by other entities. + /// + public class PlayFabDataInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabDataInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabDataInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Abort pending file uploads to an entity's profile. + /// + public void AbortFileUploads(AbortFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/AbortFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete files on an entity's profile. + /// + public void DeleteFiles(DeleteFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/DeleteFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Finalize file uploads to an entity's profile. + /// + public void FinalizeFileUploads(FinalizeFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/FinalizeFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves file metadata from an entity's profile. + /// + public void GetFiles(GetFilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/GetFiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves objects from an entity's profile. + /// + public void GetObjects(GetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Object/GetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Initiates file uploads to an entity's profile. + /// + public void InitiateFileUploads(InitiateFileUploadsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/File/InitiateFileUploads", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets objects on an entity's profile. + /// + public void SetObjects(SetObjectsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Object/SetObjects", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta new file mode 100644 index 00000000..f843ea55 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6c754c6db47f4d943954121319b071d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs new file mode 100644 index 00000000..f4b3ac2f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs @@ -0,0 +1,404 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.DataModels +{ + /// + /// Aborts the pending upload of the requested files. + /// + [Serializable] + public class AbortFileUploadsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to have their pending uploads aborted. + /// + public List FileNames; + /// + /// The expected version of the profile, if set and doesn't match the current version of the profile the operation will not + /// be performed. + /// + public int? ProfileVersion; + } + + [Serializable] + public class AbortFileUploadsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + /// + /// Deletes the requested files from the entity's profile. + /// + [Serializable] + public class DeleteFilesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to be deleted. + /// + public List FileNames; + /// + /// The expected version of the profile, if set and doesn't match the current version of the profile the operation will not + /// be performed. + /// + public int? ProfileVersion; + } + + [Serializable] + public class DeleteFilesResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + /// + /// Finalizes the upload of the requested files. Verifies that the files have been successfully uploaded and moves the file + /// pointers from pending to live. + /// + [Serializable] + public class FinalizeFileUploadsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to be finalized. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.' + /// + public List FileNames; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + [Serializable] + public class FinalizeFileUploadsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// Collection of metadata for the entity's files + /// + public Dictionary Metadata; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + [Serializable] + public class GetFileMetadata : PlayFabBaseModel + { + /// + /// Checksum value for the file, can be used to check if the file on the server has changed. + /// + public string Checksum; + /// + /// Download URL where the file can be retrieved + /// + public string DownloadUrl; + /// + /// Name of the file + /// + public string FileName; + /// + /// Last UTC time the file was modified + /// + public DateTime LastModified; + /// + /// Storage service's reported byte count + /// + public int Size; + } + + /// + /// Returns URLs that may be used to download the files for a profile for a limited length of time. Only returns files that + /// have been successfully uploaded, files that are still pending will either return the old value, if it exists, or + /// nothing. + /// + [Serializable] + public class GetFilesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetFilesResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// Collection of metadata for the entity's files + /// + public Dictionary Metadata; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + /// + /// Gets JSON objects from an entity profile and returns it. + /// + [Serializable] + public class GetObjectsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Determines whether the object will be returned as an escaped JSON string or as a un-escaped JSON object. Default is JSON + /// object. + /// + public bool? EscapeObject; + } + + [Serializable] + public class GetObjectsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// Requested objects that the calling entity has access to + /// + public Dictionary Objects; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + } + + [Serializable] + public class InitiateFileUploadMetadata : PlayFabBaseModel + { + /// + /// Name of the file. + /// + public string FileName; + /// + /// Location the data should be sent to via an HTTP PUT operation. + /// + public string UploadUrl; + } + + /// + /// Returns URLs that may be used to upload the files for a profile 5 minutes. After using the upload calls + /// FinalizeFileUploads must be called to move the file status from pending to live. + /// + [Serializable] + public class InitiateFileUploadsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Names of the files to be set. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.' + /// + public List FileNames; + /// + /// The expected version of the profile, if set and doesn't match the current version of the profile the operation will not + /// be performed. + /// + public int? ProfileVersion; + } + + [Serializable] + public class InitiateFileUploadsResponse : PlayFabResultCommon + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// Collection of file names and upload urls + /// + public List UploadDetails; + } + + [Serializable] + public class ObjectResult : PlayFabBaseModel + { + /// + /// Un-escaped JSON object, if EscapeObject false or default. + /// + public object DataObject; + /// + /// Escaped string JSON body of the object, if EscapeObject is true. + /// + public string EscapedDataObject; + /// + /// Name of the object. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.' + /// + public string ObjectName; + } + + public enum OperationTypes + { + Created, + Updated, + Deleted, + None + } + + [Serializable] + public class SetObject : PlayFabBaseModel + { + /// + /// Body of the object to be saved. If empty and DeleteObject is true object will be deleted if it exists, or no operation + /// will occur if it does not exist. Only one of Object or EscapedDataObject fields may be used. + /// + public object DataObject; + /// + /// Flag to indicate that this object should be deleted. Both DataObject and EscapedDataObject must not be set as well. + /// + public bool? DeleteObject; + /// + /// Body of the object to be saved as an escaped JSON string. If empty and DeleteObject is true object will be deleted if it + /// exists, or no operation will occur if it does not exist. Only one of DataObject or EscapedDataObject fields may be used. + /// + public string EscapedDataObject; + /// + /// Name of object. Restricted to a-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + public string ObjectName; + } + + [Serializable] + public class SetObjectInfo : PlayFabBaseModel + { + /// + /// Name of the object + /// + public string ObjectName; + /// + /// Optional reason to explain why the operation was the result that it was. + /// + public string OperationReason; + /// + /// Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + public OperationTypes? SetResult; + } + + /// + /// Sets JSON objects on the requested entity profile. May include a version number to be used to perform optimistic + /// concurrency operations during update. If the current version differs from the version in the request the request will be + /// ignored. If no version is set on the request then the value will always be updated if the values differ. Using the + /// version value does not guarantee a write though, ConcurrentEditError may still occur if multiple clients are attempting + /// to update the same profile. + /// + [Serializable] + public class SetObjectsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Optional field used for concurrency control. By specifying the previously returned value of ProfileVersion from + /// GetProfile API, you can ensure that the object set will only be performed if the profile has not been updated by any + /// other clients since the version you last loaded. + /// + public int? ExpectedProfileVersion; + /// + /// Collection of objects to set on the profile. + /// + public List Objects; + } + + [Serializable] + public class SetObjectsResponse : PlayFabResultCommon + { + /// + /// New version of the entity profile. + /// + public int ProfileVersion; + /// + /// New version of the entity profile. + /// + public List SetResults; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta new file mode 100644 index 00000000..a4423ea5 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabDataModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3ab3048b1bd63d747b28b2fe0b181743 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs new file mode 100644 index 00000000..39393df7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs @@ -0,0 +1,24 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.DataModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnDataAbortFileUploadsRequestEvent; + public event PlayFabResultEvent OnDataAbortFileUploadsResultEvent; + public event PlayFabRequestEvent OnDataDeleteFilesRequestEvent; + public event PlayFabResultEvent OnDataDeleteFilesResultEvent; + public event PlayFabRequestEvent OnDataFinalizeFileUploadsRequestEvent; + public event PlayFabResultEvent OnDataFinalizeFileUploadsResultEvent; + public event PlayFabRequestEvent OnDataGetFilesRequestEvent; + public event PlayFabResultEvent OnDataGetFilesResultEvent; + public event PlayFabRequestEvent OnDataGetObjectsRequestEvent; + public event PlayFabResultEvent OnDataGetObjectsResultEvent; + public event PlayFabRequestEvent OnDataInitiateFileUploadsRequestEvent; + public event PlayFabResultEvent OnDataInitiateFileUploadsResultEvent; + public event PlayFabRequestEvent OnDataSetObjectsRequestEvent; + public event PlayFabResultEvent OnDataSetObjectsResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta new file mode 100644 index 00000000..f8e51ea5 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Data/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: deeaf7c863e34d24591edc6c7cf96650 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy.meta new file mode 100644 index 00000000..e3b5f19c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ecd0b4fece474db4098610599e27e9af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs new file mode 100644 index 00000000..25081c1b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs @@ -0,0 +1,656 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.EconomyModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// API methods for managing the catalog. Inventory manages in-game assets for any given entity. + /// + public static class PlayFabEconomyAPI + { + static PlayFabEconomyAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Add inventory items. Up to 3500 stacks of items can be added to a single inventory collection. Stack size is uncapped. + /// + public static void AddInventoryItems(AddInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/AddInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new item in the working catalog using provided metadata. + /// + public static void CreateDraftItem(CreateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/CreateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates one or more upload URLs which can be used by the client to upload raw file data. Content URls and uploaded + /// content will be garbage collected after 24 hours if not attached to a draft or published item. Detailed pricing info + /// around uploading content can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/pricing/meters/catalog-meters + /// + public static void CreateUploadUrls(CreateUploadUrlsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/CreateUploadUrls", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes all reviews, helpfulness votes, and ratings submitted by the entity specified. + /// + public static void DeleteEntityItemReviews(DeleteEntityItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/DeleteEntityItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete an Inventory Collection. More information about Inventory Collections can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/collections + /// + public static void DeleteInventoryCollection(DeleteInventoryCollectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryCollection", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete inventory items + /// + public static void DeleteInventoryItems(DeleteInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes an item from working catalog and all published versions from the public catalog. + /// + public static void DeleteItem(DeleteItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/DeleteItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Execute a list of Inventory Operations. A maximum list of 10 operations can be performed by a single request. There is + /// also a limit to 250 items that can be modified/added in a single request. For example, adding a bundle with 50 items + /// counts as 50 items modified. All operations must be done within a single inventory collection. This API has a reduced + /// RPS compared to an individual inventory operation with Player Entities limited to 15 requests in 90 seconds and Title + /// Entities limited to 500 requests in 10 seconds. + /// + public static void ExecuteInventoryOperations(ExecuteInventoryOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/ExecuteInventoryOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the configuration for the catalog. Only Title Entities can call this API. There is a limit of 100 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public static void GetCatalogConfig(GetCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an item from the working catalog. This item represents the current working state of the item. GetDraftItem + /// does not work off a cache of the Catalog and should be used when trying to get recent item updates. However, please note + /// that item references data is cached and may take a few moments for changes to propagate. + /// + public static void GetDraftItem(GetDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog. Up to 50 IDs can be retrieved in a single request. + /// GetDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public static void GetDraftItems(GetDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog created by the Entity. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. + /// GetEntityDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public static void GetEntityDraftItems(GetEntityDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetEntityDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the submitted review for the specified item by the authenticated entity. Individual ratings and reviews data update + /// in near real time with delays within a few seconds. + /// + public static void GetEntityItemReview(GetEntityItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetEntityItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get Inventory Collection Ids. Up to 50 Ids can be returned at once. You can use continuation tokens to paginate through + /// results that return greater than the limit. It can take a few seconds for new collection Ids to show up. + /// + public static void GetInventoryCollectionIds(GetInventoryCollectionIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryCollectionIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get current inventory items. + /// + public static void GetInventoryItems(GetInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an item from the public catalog. GetItem does not work off a cache of the Catalog and should be used when + /// trying to get recent item updates. However, please note that item references data is cached and may take a few moments + /// for changes to propagate. + /// + public static void GetItem(GetItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Search for a given item and return a set of bundles and stores containing the item. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. This API is + /// intended for tooling/automation scenarios and has a reduced RPS with Player Entities limited to 30 requests in 300 + /// seconds and Title Entities limited to 100 requests in 10 seconds. + /// + public static void GetItemContainers(GetItemContainersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemContainers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public static void GetItemModerationState(GetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the status of a publish of an item. + /// + public static void GetItemPublishStatus(GetItemPublishStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemPublishStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a paginated set of reviews associated with the specified item. Individual ratings and reviews data update in near + /// real time with delays within a few seconds. + /// + public static void GetItemReviews(GetItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a summary of all ratings and reviews associated with the specified item. Summary ratings data is cached with update + /// data coming within 15 minutes. + /// + public static void GetItemReviewSummary(GetItemReviewSummaryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviewSummary", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves items from the public catalog. Up to 50 items can be returned at once. GetItems does not work off a cache of + /// the Catalog and should be used when trying to get recent item updates. However, please note that item references data is + /// cached and may take a few moments for changes to propagate. + /// + public static void GetItems(GetItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/GetItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the access tokens. + /// + public static void GetMicrosoftStoreAccessTokens(GetMicrosoftStoreAccessTokensRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetMicrosoftStoreAccessTokens", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get transaction history for a player. Up to 50 Events can be returned at once. You can use continuation tokens to + /// paginate through results that return greater than the limit. Getting transaction history has a lower RPS limit than + /// getting a Player's inventory with Player Entities having a limit of 30 requests in 300 seconds and Title Entities having + /// a limit of 100 requests in 10 seconds. + /// + public static void GetTransactionHistory(GetTransactionHistoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/GetTransactionHistory", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Initiates a publish of an item from the working catalog to the public catalog. You can use the GetItemPublishStatus API + /// to track the state of the item publish. + /// + public static void PublishDraftItem(PublishDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/PublishDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Purchase an item or bundle. Up to 3500 stacks of items can be added to a single inventory collection. Stack size is + /// uncapped. + /// + public static void PurchaseInventoryItems(PurchaseInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/PurchaseInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemAppleAppStoreInventoryItems(RedeemAppleAppStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemAppleAppStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemGooglePlayInventoryItems(RedeemGooglePlayInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemGooglePlayInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemMicrosoftStoreInventoryItems(RedeemMicrosoftStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemMicrosoftStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemNintendoEShopInventoryItems(RedeemNintendoEShopInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemNintendoEShopInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemPlayStationStoreInventoryItems(RedeemPlayStationStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemPlayStationStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Redeem items. + /// + public static void RedeemSteamInventoryItems(RedeemSteamInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/RedeemSteamInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report for an item, indicating in what way the item is inappropriate. + /// + public static void ReportItem(ReportItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/ReportItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report for a review + /// + public static void ReportItemReview(ReportItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/ReportItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates or updates a review for the specified item. More information around the caching surrounding item ratings and + /// reviews can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/ratings#ratings-design-and-caching + /// + public static void ReviewItem(ReviewItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/ReviewItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Executes a search against the public catalog using the provided search parameters and returns a set of paginated + /// results. SearchItems uses a cache of the catalog with item updates taking up to a few minutes to propagate. You should + /// use the GetItem API for when trying to immediately get recent item updates. More information about the Search API can be + /// found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search + /// + public static void SearchItems(SearchItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/SearchItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public static void SetItemModerationState(SetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/SetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a vote for a review, indicating whether the review was helpful or unhelpful. + /// + public static void SubmitItemReviewVote(SubmitItemReviewVoteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/SubmitItemReviewVote", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Subtract inventory items. + /// + public static void SubtractInventoryItems(SubtractInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/SubtractInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a request to takedown one or more reviews. + /// + public static void TakedownItemReviews(TakedownItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/TakedownItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Transfer inventory items. When transferring across collections, a 202 response indicates that the transfer is in + /// progress and will complete soon. More information about item transfer scenarios can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/?tabs=inventory-game-manager#transfer-inventory-items + /// + public static void TransferInventoryItems(TransferInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/TransferInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the configuration for the catalog. Only Title Entities can call this API. There is a limit of 10 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public static void UpdateCatalogConfig(UpdateCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/UpdateCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update the metadata for an item in the working catalog. + /// + public static void UpdateDraftItem(UpdateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Catalog/UpdateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update inventory items + /// + public static void UpdateInventoryItems(UpdateInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Inventory/UpdateInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + public static void SearchItems(SearchItemsRequest request, SearchItemsResponse response, Action value) + { + throw new NotImplementedException(); + } + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta new file mode 100644 index 00000000..29018c9e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 56036e5215ab72544b38afa65f5684e0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs new file mode 100644 index 00000000..d2e8b07b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs @@ -0,0 +1,583 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.EconomyModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// API methods for managing the catalog. Inventory manages in-game assets for any given entity. + /// + public class PlayFabEconomyInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabEconomyInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabEconomyInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Add inventory items. Up to 3500 stacks of items can be added to a single inventory collection. Stack size is uncapped. + /// + public void AddInventoryItems(AddInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/AddInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new item in the working catalog using provided metadata. + /// + public void CreateDraftItem(CreateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/CreateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates one or more upload URLs which can be used by the client to upload raw file data. Content URls and uploaded + /// content will be garbage collected after 24 hours if not attached to a draft or published item. Detailed pricing info + /// around uploading content can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/pricing/meters/catalog-meters + /// + public void CreateUploadUrls(CreateUploadUrlsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/CreateUploadUrls", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes all reviews, helpfulness votes, and ratings submitted by the entity specified. + /// + public void DeleteEntityItemReviews(DeleteEntityItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/DeleteEntityItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete an Inventory Collection. More information about Inventory Collections can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/collections + /// + public void DeleteInventoryCollection(DeleteInventoryCollectionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryCollection", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete inventory items + /// + public void DeleteInventoryItems(DeleteInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/DeleteInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes an item from working catalog and all published versions from the public catalog. + /// + public void DeleteItem(DeleteItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/DeleteItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Execute a list of Inventory Operations. A maximum list of 10 operations can be performed by a single request. There is + /// also a limit to 250 items that can be modified/added in a single request. For example, adding a bundle with 50 items + /// counts as 50 items modified. All operations must be done within a single inventory collection. This API has a reduced + /// RPS compared to an individual inventory operation with Player Entities limited to 15 requests in 90 seconds and Title + /// Entities limited to 500 requests in 10 seconds. + /// + public void ExecuteInventoryOperations(ExecuteInventoryOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/ExecuteInventoryOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the configuration for the catalog. Only Title Entities can call this API. There is a limit of 100 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public void GetCatalogConfig(GetCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an item from the working catalog. This item represents the current working state of the item. GetDraftItem + /// does not work off a cache of the Catalog and should be used when trying to get recent item updates. However, please note + /// that item references data is cached and may take a few moments for changes to propagate. + /// + public void GetDraftItem(GetDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog. Up to 50 IDs can be retrieved in a single request. + /// GetDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public void GetDraftItems(GetDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a paginated list of the items from the draft catalog created by the Entity. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. + /// GetEntityDraftItems does not work off a cache of the Catalog and should be used when trying to get recent item updates. + /// + public void GetEntityDraftItems(GetEntityDraftItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetEntityDraftItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the submitted review for the specified item by the authenticated entity. Individual ratings and reviews data update + /// in near real time with delays within a few seconds. + /// + public void GetEntityItemReview(GetEntityItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetEntityItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get Inventory Collection Ids. Up to 50 Ids can be returned at once. You can use continuation tokens to paginate through + /// results that return greater than the limit. It can take a few seconds for new collection Ids to show up. + /// + public void GetInventoryCollectionIds(GetInventoryCollectionIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryCollectionIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get current inventory items. + /// + public void GetInventoryItems(GetInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an item from the public catalog. GetItem does not work off a cache of the Catalog and should be used when + /// trying to get recent item updates. However, please note that item references data is cached and may take a few moments + /// for changes to propagate. + /// + public void GetItem(GetItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Search for a given item and return a set of bundles and stores containing the item. Up to 50 items can be returned at + /// once. You can use continuation tokens to paginate through results that return greater than the limit. This API is + /// intended for tooling/automation scenarios and has a reduced RPS with Player Entities limited to 30 requests in 300 + /// seconds and Title Entities limited to 100 requests in 10 seconds. + /// + public void GetItemContainers(GetItemContainersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemContainers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public void GetItemModerationState(GetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the status of a publish of an item. + /// + public void GetItemPublishStatus(GetItemPublishStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemPublishStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a paginated set of reviews associated with the specified item. Individual ratings and reviews data update in near + /// real time with delays within a few seconds. + /// + public void GetItemReviews(GetItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a summary of all ratings and reviews associated with the specified item. Summary ratings data is cached with update + /// data coming within 15 minutes. + /// + public void GetItemReviewSummary(GetItemReviewSummaryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItemReviewSummary", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves items from the public catalog. Up to 50 items can be returned at once. GetItems does not work off a cache of + /// the Catalog and should be used when trying to get recent item updates. However, please note that item references data is + /// cached and may take a few moments for changes to propagate. + /// + public void GetItems(GetItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/GetItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the access tokens. + /// + public void GetMicrosoftStoreAccessTokens(GetMicrosoftStoreAccessTokensRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetMicrosoftStoreAccessTokens", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get transaction history for a player. Up to 50 Events can be returned at once. You can use continuation tokens to + /// paginate through results that return greater than the limit. Getting transaction history has a lower RPS limit than + /// getting a Player's inventory with Player Entities having a limit of 30 requests in 300 seconds and Title Entities having + /// a limit of 100 requests in 10 seconds. + /// + public void GetTransactionHistory(GetTransactionHistoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/GetTransactionHistory", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Initiates a publish of an item from the working catalog to the public catalog. You can use the GetItemPublishStatus API + /// to track the state of the item publish. + /// + public void PublishDraftItem(PublishDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/PublishDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Purchase an item or bundle. Up to 3500 stacks of items can be added to a single inventory collection. Stack size is + /// uncapped. + /// + public void PurchaseInventoryItems(PurchaseInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/PurchaseInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemAppleAppStoreInventoryItems(RedeemAppleAppStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemAppleAppStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemGooglePlayInventoryItems(RedeemGooglePlayInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemGooglePlayInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemMicrosoftStoreInventoryItems(RedeemMicrosoftStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemMicrosoftStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemNintendoEShopInventoryItems(RedeemNintendoEShopInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemNintendoEShopInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemPlayStationStoreInventoryItems(RedeemPlayStationStoreInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemPlayStationStoreInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Redeem items. + /// + public void RedeemSteamInventoryItems(RedeemSteamInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/RedeemSteamInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report for an item, indicating in what way the item is inappropriate. + /// + public void ReportItem(ReportItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/ReportItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report for a review + /// + public void ReportItemReview(ReportItemReviewRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/ReportItemReview", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates or updates a review for the specified item. More information around the caching surrounding item ratings and + /// reviews can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/ratings#ratings-design-and-caching + /// + public void ReviewItem(ReviewItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/ReviewItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Executes a search against the public catalog using the provided search parameters and returns a set of paginated + /// results. SearchItems uses a cache of the catalog with item updates taking up to a few minutes to propagate. You should + /// use the GetItem API for when trying to immediately get recent item updates. More information about the Search API can be + /// found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search + /// + public void SearchItems(SearchItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/SearchItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the moderation state for an item, including the concern category and string reason. More information about + /// moderation states can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/ugc/moderation + /// + public void SetItemModerationState(SetItemModerationStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/SetItemModerationState", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a vote for a review, indicating whether the review was helpful or unhelpful. + /// + public void SubmitItemReviewVote(SubmitItemReviewVoteRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/SubmitItemReviewVote", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Subtract inventory items. + /// + public void SubtractInventoryItems(SubtractInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/SubtractInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a request to takedown one or more reviews. + /// + public void TakedownItemReviews(TakedownItemReviewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/TakedownItemReviews", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Transfer inventory items. When transferring across collections, a 202 response indicates that the transfer is in + /// progress and will complete soon. More information about item transfer scenarios can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/inventory/?tabs=inventory-game-manager#transfer-inventory-items + /// + public void TransferInventoryItems(TransferInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/TransferInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the configuration for the catalog. Only Title Entities can call this API. There is a limit of 10 requests in 10 + /// seconds for this API. More information about the Catalog Config can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/settings + /// + public void UpdateCatalogConfig(UpdateCatalogConfigRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/UpdateCatalogConfig", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update the metadata for an item in the working catalog. + /// + public void UpdateDraftItem(UpdateDraftItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Catalog/UpdateDraftItem", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update inventory items + /// + public void UpdateInventoryItems(UpdateInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Inventory/UpdateInventoryItems", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta new file mode 100644 index 00000000..448fa564 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 57229903c0965c74b90bc2ef8ccbc31c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs new file mode 100644 index 00000000..e5b2ff43 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs @@ -0,0 +1,3105 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.EconomyModels +{ + [Serializable] + public class AddInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to add to the current item amount. + /// + public int? Amount; + /// + /// The duration to add to the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this operation. + /// + public InitialValues NewStackValues; + } + + /// + /// Given an entity type, entity identifier and container details, will add the specified inventory items. + /// + [Serializable] + public class AddInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to add for the current item. + /// + public int? Amount; + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The duration to add to the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this request. + /// + public InitialValues NewStackValues; + } + + [Serializable] + public class AddInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class AlternateId : PlayFabBaseModel + { + /// + /// Type of the alternate ID. + /// + public string Type; + /// + /// Value of the alternate ID. + /// + public string Value; + } + + [Serializable] + public class CatalogAlternateId : PlayFabBaseModel + { + /// + /// Type of the alternate ID. + /// + public string Type; + /// + /// Value of the alternate ID. + /// + public string Value; + } + + [Serializable] + public class CatalogConfig : PlayFabBaseModel + { + /// + /// A list of player entity keys that will have admin permissions. There is a maximum of 64 entities that can be added. + /// + public List AdminEntities; + /// + /// The set of configuration that only applies to catalog items. + /// + public CatalogSpecificConfig Catalog; + /// + /// A list of deep link formats. Up to 10 can be added. + /// + public List DeepLinkFormats; + /// + /// A list of display properties to index. Up to 5 mappings can be added per Display Property Type. More info on display + /// properties can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/content-types-tags-and-properties#displayproperties + /// + public List DisplayPropertyIndexInfos; + /// + /// The set of configuration that only applies to Files. + /// + public FileConfig File; + /// + /// The set of configuration that only applies to Images. + /// + public ImageConfig Image; + /// + /// Flag defining whether catalog is enabled. + /// + public bool IsCatalogEnabled; + /// + /// A list of Platforms that can be applied to catalog items. Each platform can have a maximum character length of 40 and up + /// to 128 platforms can be listed. + /// + public List Platforms; + /// + /// A set of player entity keys that are allowed to review content. There is a maximum of 64 entities that can be added. + /// + public List ReviewerEntities; + /// + /// The set of configuration that only applies to user generated contents. + /// + public UserGeneratedContentSpecificConfig UserGeneratedContent; + } + + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// The alternate IDs associated with this item. An alternate ID can be set to 'FriendlyId' or any of the supported + /// marketplace names. + /// + public List AlternateIds; + /// + /// The set of content/files associated with this item. Up to 100 files can be added to an item. + /// + public List Contents; + /// + /// The client-defined type of the item. + /// + public string ContentType; + /// + /// The date and time when this item was created. + /// + public DateTime? CreationDate; + /// + /// The ID of the creator of this catalog item. + /// + public EntityKey CreatorEntity; + /// + /// The set of platform specific deep links for this item. + /// + public List DeepLinks; + /// + /// The Stack Id that will be used as default for this item in Inventory when an explicit one is not provided. This + /// DefaultStackId can be a static stack id or '{guid}', which will generate a unique stack id for the item. If null, + /// Inventory's default stack id will be used. + /// + public string DefaultStackId; + /// + /// A dictionary of localized descriptions. Key is language code and localized string is the value. The NEUTRAL locale is + /// required. Descriptions have a 10000 character limit per country code. + /// + public Dictionary Description; + /// + /// Game specific properties for display purposes. This is an arbitrary JSON blob. The Display Properties field has a 10000 + /// byte limit per item. + /// + public object DisplayProperties; + /// + /// The user provided version of the item for display purposes. Maximum character length of 50. + /// + public string DisplayVersion; + /// + /// The date of when the item will cease to be available. If not provided then the product will be available indefinitely. + /// + public DateTime? EndDate; + /// + /// The current ETag value that can be used for optimistic concurrency in the If-None-Match header. + /// + public string ETag; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The images associated with this item. Images can be thumbnails or screenshots. Up to 100 images can be added to an item. + /// Only .png, .jpg, .gif, and .bmp file types can be uploaded + /// + public List Images; + /// + /// Indicates if the item is hidden. + /// + public bool? IsHidden; + /// + /// The item references associated with this item. For example, the items in a Bundle/Store/Subscription. Every item can + /// have up to 50 item references. + /// + public List ItemReferences; + /// + /// A dictionary of localized keywords. Key is language code and localized list of keywords is the value. Keywords have a 50 + /// character limit per keyword and up to 32 keywords can be added per country code. + /// + public Dictionary Keywords; + /// + /// The date and time this item was last updated. + /// + public DateTime? LastModifiedDate; + /// + /// The moderation state for this item. + /// + public ModerationState Moderation; + /// + /// The platforms supported by this item. + /// + public List Platforms; + /// + /// The prices the item can be purchased for. + /// + public CatalogPriceOptions PriceOptions; + /// + /// Rating summary for this item. + /// + public Rating Rating; + /// + /// The date of when the item will be available. If not provided then the product will appear immediately. + /// + public DateTime? StartDate; + /// + /// Optional details for stores items. + /// + public StoreDetails StoreDetails; + /// + /// The list of tags that are associated with this item. Up to 32 tags can be added to an item. + /// + public List Tags; + /// + /// A dictionary of localized titles. Key is language code and localized string is the value. The NEUTRAL locale is + /// required. Titles have a 512 character limit per country code. + /// + public Dictionary Title; + /// + /// The high-level type of the item. The following item types are supported: bundle, catalogItem, currency, store, ugc. + /// + public string Type; + } + + [Serializable] + public class CatalogItemReference : PlayFabBaseModel + { + /// + /// The amount of the catalog item. + /// + public int? Amount; + /// + /// The unique ID of the catalog item. + /// + public string Id; + /// + /// The prices the catalog item can be purchased for. + /// + public CatalogPriceOptions PriceOptions; + } + + [Serializable] + public class CatalogPrice : PlayFabBaseModel + { + /// + /// The amounts of the catalog item price. Each price can have up to 15 item amounts. + /// + public List Amounts; + /// + /// The per-unit duration this price can be used to purchase. The maximum duration is 100 years. + /// + public double? UnitDurationInSeconds; + } + + [Serializable] + public class CatalogPriceAmount : PlayFabBaseModel + { + /// + /// The amount of the price. + /// + public int Amount; + /// + /// The Item Id of the price. + /// + public string ItemId; + } + + [Serializable] + public class CatalogPriceAmountOverride : PlayFabBaseModel + { + /// + /// The exact value that should be utilized in the override. + /// + public int? FixedValue; + /// + /// The id of the item this override should utilize. + /// + public string ItemId; + /// + /// The multiplier that will be applied to the base Catalog value to determine what value should be utilized in the + /// override. + /// + public double? Multiplier; + } + + [Serializable] + public class CatalogPriceOptions : PlayFabBaseModel + { + /// + /// Prices of the catalog item. An item can have up to 15 prices + /// + public List Prices; + } + + [Serializable] + public class CatalogPriceOptionsOverride : PlayFabBaseModel + { + /// + /// The prices utilized in the override. + /// + public List Prices; + } + + [Serializable] + public class CatalogPriceOverride : PlayFabBaseModel + { + /// + /// The currency amounts utilized in the override for a singular price. + /// + public List Amounts; + } + + [Serializable] + public class CatalogSpecificConfig : PlayFabBaseModel + { + /// + /// The set of content types that will be used for validation. Each content type can have a maximum character length of 40 + /// and up to 128 types can be listed. + /// + public List ContentTypes; + /// + /// The set of tags that will be used for validation. Each tag can have a maximum character length of 32 and up to 1024 tags + /// can be listed. + /// + public List Tags; + } + + public enum ConcernCategory + { + None, + OffensiveContent, + ChildExploitation, + MalwareOrVirus, + PrivacyConcerns, + MisleadingApp, + PoorPerformance, + ReviewResponse, + SpamAdvertising, + Profanity + } + + [Serializable] + public class Content : PlayFabBaseModel + { + /// + /// The content unique ID. + /// + public string Id; + /// + /// The maximum client version that this content is compatible with. Client Versions can be up to 3 segments separated by + /// periods(.) and each segment can have a maximum value of 65535. + /// + public string MaxClientVersion; + /// + /// The minimum client version that this content is compatible with. Client Versions can be up to 3 segments separated by + /// periods(.) and each segment can have a maximum value of 65535. + /// + public string MinClientVersion; + /// + /// The list of tags that are associated with this content. Tags must be defined in the Catalog Config before being used in + /// content. + /// + public List Tags; + /// + /// The client-defined type of the content. Content Types must be defined in the Catalog Config before being used. + /// + public string Type; + /// + /// The Azure CDN URL for retrieval of the catalog item binary content. + /// + public string Url; + } + + [Serializable] + public class ContentFeed : PlayFabBaseModel + { + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW + } + + /// + /// The item will not be published to the public catalog until the PublishItem API is called for the item. + /// + [Serializable] + public class CreateDraftItemRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Metadata describing the new catalog item to be created. + /// + public CatalogItem Item; + /// + /// Whether the item should be published immediately. This value is optional, defaults to false. + /// + public bool Publish; + } + + [Serializable] + public class CreateDraftItemResponse : PlayFabResultCommon + { + /// + /// Updated metadata describing the catalog item just created. + /// + public CatalogItem Item; + } + + /// + /// Upload URLs point to Azure Blobs; clients must follow the Microsoft Azure Storage Blob Service REST API pattern for + /// uploading content. The response contains upload URLs and IDs for each file. The IDs and URLs returned must be added to + /// the item metadata and committed using the CreateDraftItem or UpdateDraftItem Item APIs. + /// + [Serializable] + public class CreateUploadUrlsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the files to be uploaded by the client. + /// + public List Files; + } + + [Serializable] + public class CreateUploadUrlsResponse : PlayFabResultCommon + { + /// + /// List of URLs metadata for the files to be uploaded by the client. + /// + public List UploadUrls; + } + + [Serializable] + public class DeepLink : PlayFabBaseModel + { + /// + /// Target platform for this deep link. + /// + public string Platform; + /// + /// The deep link for this platform. + /// + public string Url; + } + + [Serializable] + public class DeepLinkFormat : PlayFabBaseModel + { + /// + /// The format of the deep link to return. The format should contain '{id}' to represent where the item ID should be placed. + /// + public string Format; + /// + /// The target platform for the deep link. + /// + public string Platform; + } + + [Serializable] + public class DeleteEntityItemReviewsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + } + + [Serializable] + public class DeleteEntityItemReviewsResponse : PlayFabResultCommon + { + } + + /// + /// Delete an Inventory Collection by the specified Id for an Entity + /// + [Serializable] + public class DeleteInventoryCollectionRequest : PlayFabRequestCommon + { + /// + /// The inventory collection id the request applies to. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity the request is about. Set to the caller by default. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + } + + [Serializable] + public class DeleteInventoryCollectionResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + } + + /// + /// Given an entity type, entity identifier and container details, will delete the entity's inventory items + /// + [Serializable] + public class DeleteInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + } + + [Serializable] + public class DeleteInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class DeleteItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class DeleteItemResponse : PlayFabResultCommon + { + } + + [Serializable] + public class DisplayPropertyIndexInfo : PlayFabBaseModel + { + /// + /// The property name in the 'DisplayProperties' property to be indexed. + /// + public string Name; + /// + /// The type of the property to be indexed. + /// + public DisplayPropertyType? Type; + } + + public enum DisplayPropertyType + { + None, + QueryDateTime, + QueryDouble, + QueryString, + SearchString + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + /// + /// Execute a list of Inventory Operations for an Entity + /// + [Serializable] + public class ExecuteInventoryOperationsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The operations to run transactionally. The operations will be executed in-order sequentially and will succeed or fail as + /// a batch. Up to 10 operations can be added. + /// + public List Operations; + } + + [Serializable] + public class ExecuteInventoryOperationsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of the transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class FileConfig : PlayFabBaseModel + { + /// + /// The set of content types that will be used for validation. Each content type can have a maximum character length of 40 + /// and up to 128 types can be listed. + /// + public List ContentTypes; + /// + /// The set of tags that will be used for validation. Each tag can have a maximum character length of 32 and up to 1024 tags + /// can be listed. + /// + public List Tags; + } + + [Serializable] + public class FilterOptions : PlayFabBaseModel + { + /// + /// The OData filter utilized. Mutually exclusive with 'IncludeAllItems'. More info about Filter Complexity limits can be + /// found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search#limits + /// + public string Filter; + /// + /// The flag that overrides the filter and allows for returning all catalog items. Mutually exclusive with 'Filter'. + /// + public bool? IncludeAllItems; + } + + [Serializable] + public class GetCatalogConfigRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetCatalogConfigResponse : PlayFabResultCommon + { + /// + /// The catalog configuration. + /// + public CatalogConfig Config; + } + + [Serializable] + public class GetDraftItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetDraftItemResponse : PlayFabResultCommon + { + /// + /// Full metadata of the catalog item requested. + /// + public CatalogItem Item; + } + + [Serializable] + public class GetDraftItemsRequest : PlayFabRequestCommon + { + /// + /// List of item alternate IDs. + /// + public List AlternateIds; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// List of Item Ids. + /// + public List Ids; + } + + [Serializable] + public class GetDraftItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// A set of items created by the entity. + /// + public List Items; + } + + [Serializable] + public class GetEntityDraftItemsRequest : PlayFabRequestCommon + { + /// + /// An opaque token used to retrieve the next page of items created by the caller, if any are available. Should be null on + /// initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// OData Filter to refine the items returned. CatalogItem properties 'type' can be used in the filter. For example: "type + /// eq 'ugc'" + /// + public string Filter; + } + + [Serializable] + public class GetEntityDraftItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// A set of items created by the entity. + /// + public List Items; + } + + [Serializable] + public class GetEntityItemReviewRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetEntityItemReviewResponse : PlayFabResultCommon + { + /// + /// The review the entity submitted for the requested item. + /// + public Review Review; + } + + /// + /// Get a list of Inventory Collection Ids for the specified Entity + /// + [Serializable] + public class GetInventoryCollectionIdsRequest : PlayFabRequestCommon + { + /// + /// An opaque token used to retrieve the next page of collection ids, if any are available. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. The default value is 10 + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity the request is about. Set to the caller by default. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetInventoryCollectionIdsResponse : PlayFabResultCommon + { + /// + /// The requested inventory collection ids. + /// + public List CollectionIds; + /// + /// An opaque token used to retrieve the next page of collection ids, if any are available. + /// + public string ContinuationToken; + } + + /// + /// Given an entity type, entity identifier and container details, will get the entity's inventory items. + /// + [Serializable] + public class GetInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// An opaque token used to retrieve the next page of items in the inventory, if any are available. Should be null on + /// initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Maximum page size is 50. The default value is 10 + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// OData Filter to refine the items returned. InventoryItem properties 'type', 'id', and 'stackId' can be used in the + /// filter. For example: "type eq 'currency'" + /// + public string Filter; + } + + [Serializable] + public class GetInventoryItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The requested inventory items. + /// + public List Items; + } + + /// + /// Given an item, return a set of bundles and stores containing the item. + /// + [Serializable] + public class GetItemContainersRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// An opaque token used to retrieve the next page of items in the inventory, if any are available. Should be null on + /// initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemContainersResponse : PlayFabResultCommon + { + /// + /// List of Bundles and Stores containing the requested items. + /// + public List Containers; + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + } + + [Serializable] + public class GetItemModerationStateRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemModerationStateResponse : PlayFabResultCommon + { + /// + /// The current moderation state for the requested item. + /// + public ModerationState State; + } + + [Serializable] + public class GetItemPublishStatusRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemPublishStatusResponse : PlayFabResultCommon + { + /// + /// High level status of the published item. + /// + public PublishResult? Result; + /// + /// Descriptive message about the current status of the publish. + /// + public string StatusMessage; + } + + [Serializable] + public class GetItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + } + + /// + /// Get item result. + /// + [Serializable] + public class GetItemResponse : PlayFabResultCommon + { + /// + /// The item result. + /// + public CatalogItem Item; + } + + [Serializable] + public class GetItemReviewsRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// An OData orderBy used to order the results of the query. Possible values are Helpfulness, Rating, and Submitted (For + /// example: "Submitted desc") + /// + public string OrderBy; + } + + [Serializable] + public class GetItemReviewsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// The paginated set of results. + /// + public List Reviews; + } + + [Serializable] + public class GetItemReviewSummaryRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class GetItemReviewSummaryResponse : PlayFabResultCommon + { + /// + /// The least favorable review for this item. + /// + public Review LeastFavorableReview; + /// + /// The most favorable review for this item. + /// + public Review MostFavorableReview; + /// + /// The summary of ratings associated with this item. + /// + public Rating Rating; + /// + /// The total number of reviews associated with this item. + /// + public int ReviewsCount; + } + + [Serializable] + public class GetItemsRequest : PlayFabRequestCommon + { + /// + /// List of item alternate IDs. + /// + public List AlternateIds; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// List of Item Ids. + /// + public List Ids; + } + + [Serializable] + public class GetItemsResponse : PlayFabResultCommon + { + /// + /// Metadata of set of items. + /// + public List Items; + } + + /// + /// Gets the access tokens for Microsoft Store authentication. + /// + [Serializable] + public class GetMicrosoftStoreAccessTokensRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetMicrosoftStoreAccessTokensResponse : PlayFabResultCommon + { + /// + /// The collections access token for calling https://onestore.microsoft.com/b2b/keys/create/collections to obtain a + /// CollectionsIdKey for the user + /// + public string CollectionsAccessToken; + /// + /// The date the collections access token expires + /// + public DateTime CollectionsAccessTokenExpirationDate; + } + + /// + /// Get transaction history for specified entity and collection. + /// + [Serializable] + public class GetTransactionHistoryRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// An opaque token used to retrieve the next page of items, if any are available. Should be null on initial request. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. The default value is 10 + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// An OData filter used to refine the TransactionHistory. Transaction property 'timestamp' can be used in the filter. For + /// example: "timestamp ge 'timestamp ge'" By default, a 6 month timespan from the current date is used. + /// + public string Filter; + } + + [Serializable] + public class GetTransactionHistoryResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. Should be null on initial request. + /// + public string ContinuationToken; + /// + /// The requested inventory transactions. + /// + public List Transactions; + } + + [Serializable] + public class GooglePlayProductPurchase : PlayFabBaseModel + { + /// + /// The Product ID (SKU) of the InApp product purchased from the Google Play store. + /// + public string ProductId; + /// + /// The token provided to the player's device when the product was purchased + /// + public string Token; + } + + public enum HelpfulnessVote + { + None, + UnHelpful, + Helpful + } + + [Serializable] + public class Image : PlayFabBaseModel + { + /// + /// The image unique ID. + /// + public string Id; + /// + /// The client-defined tag associated with this image. Tags must be defined in the Catalog Config before being used in + /// images + /// + public string Tag; + /// + /// Images can be defined as either a "thumbnail" or "screenshot". There can only be one "thumbnail" image per item. + /// + public string Type; + /// + /// The URL for retrieval of the image. + /// + public string Url; + } + + [Serializable] + public class ImageConfig : PlayFabBaseModel + { + /// + /// The set of tags that will be used for validation. Each tag can have a maximum character length of 32 and up to 1024 tags + /// can be listed. + /// + public List Tags; + } + + [Serializable] + public class InitialValues : PlayFabBaseModel + { + /// + /// Game specific properties for display purposes. The Display Properties field has a 1000 byte limit. + /// + public object DisplayProperties; + } + + [Serializable] + public class InventoryItem : PlayFabBaseModel + { + /// + /// The amount of the item. + /// + public int? Amount; + /// + /// Game specific properties for display purposes. This is an arbitrary JSON blob. The Display Properties field has a 1000 + /// byte limit. + /// + public object DisplayProperties; + /// + /// Only used for subscriptions. The date of when the item will expire in UTC. + /// + public DateTime? ExpirationDate; + /// + /// The id of the item. This should correspond to the item id in the catalog. + /// + public string Id; + /// + /// The stack id of the item. + /// + public string StackId; + /// + /// The type of the item. This should correspond to the item type in the catalog. + /// + public string Type; + } + + [Serializable] + public class InventoryItemReference : PlayFabBaseModel + { + /// + /// The inventory item alternate id the request applies to. + /// + public AlternateId AlternateId; + /// + /// The inventory item id the request applies to. + /// + public string Id; + /// + /// The inventory stack id the request should redeem to. (Default="default") + /// + public string StackId; + } + + [Serializable] + public class InventoryOperation : PlayFabBaseModel + { + /// + /// The add operation. + /// + public AddInventoryItemsOperation Add; + /// + /// The delete operation. + /// + public DeleteInventoryItemsOperation Delete; + /// + /// The purchase operation. + /// + public PurchaseInventoryItemsOperation Purchase; + /// + /// The subtract operation. + /// + public SubtractInventoryItemsOperation Subtract; + /// + /// The transfer operation. + /// + public TransferInventoryItemsOperation Transfer; + /// + /// The update operation. + /// + public UpdateInventoryItemsOperation Update; + } + + [Serializable] + public class KeywordSet : PlayFabBaseModel + { + /// + /// A list of localized keywords. + /// + public List Values; + } + + [Serializable] + public class ModerationState : PlayFabBaseModel + { + /// + /// The date and time this moderation state was last updated. + /// + public DateTime? LastModifiedDate; + /// + /// The current stated reason for the associated item being moderated. + /// + public string Reason; + /// + /// The current moderation status for the associated item. + /// + public ModerationStatus? Status; + } + + public enum ModerationStatus + { + Unknown, + AwaitingModeration, + Approved, + Rejected + } + + [Serializable] + public class PayoutDetails : PlayFabBaseModel + { + } + + /// + /// The call kicks off a workflow to publish the item to the public catalog. The Publish Status API should be used to + /// monitor the publish job. + /// + [Serializable] + public class PublishDraftItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETag of the catalog item to published from the working catalog to the public catalog. Used for optimistic concurrency. + /// If the provided ETag does not match the ETag in the current working catalog, the request will be rejected. If not + /// provided, the current version of the document in the working catalog will be published. + /// + public string ETag; + /// + /// The unique ID of the item. + /// + public string Id; + } + + [Serializable] + public class PublishDraftItemResponse : PlayFabResultCommon + { + } + + public enum PublishResult + { + Unknown, + Pending, + Succeeded, + Failed, + Canceled + } + + [Serializable] + public class PurchaseInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to purchase. + /// + public int? Amount; + /// + /// Indicates whether stacks reduced to an amount of 0 during the operation should be deleted from the inventory. (Default = + /// false) + /// + public bool DeleteEmptyStacks; + /// + /// The duration to purchase. + /// + public double? DurationInSeconds; + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this operation. + /// + public InitialValues NewStackValues; + /// + /// The per-item price the item is expected to be purchased at. This must match a value configured in the Catalog or + /// specified Store. + /// + public List PriceAmounts; + /// + /// The id of the Store to purchase the item from. + /// + public string StoreId; + } + + /// + /// Purchase a single item or bundle, paying the associated price. + /// + [Serializable] + public class PurchaseInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to purchase. + /// + public int? Amount; + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. + /// (Default=false) + /// + public bool DeleteEmptyStacks; + /// + /// The duration to purchase. + /// + public double? DurationInSeconds; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + /// + /// The values to apply to a stack newly created by this request. + /// + public InitialValues NewStackValues; + /// + /// The per-item price the item is expected to be purchased at. This must match a value configured in the Catalog or + /// specified Store. + /// + public List PriceAmounts; + /// + /// The id of the Store to purchase the item from. + /// + public string StoreId; + } + + [Serializable] + public class PurchaseInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class PurchaseOverride : PlayFabBaseModel + { + } + + [Serializable] + public class PurchasePriceAmount : PlayFabBaseModel + { + /// + /// The amount of the inventory item to use in the purchase . + /// + public int Amount; + /// + /// The inventory item id to use in the purchase . + /// + public string ItemId; + /// + /// The inventory stack id the to use in the purchase. Set to "default" by default + /// + public string StackId; + } + + [Serializable] + public class Rating : PlayFabBaseModel + { + /// + /// The average rating for this item. + /// + public float? Average; + /// + /// The total count of 1 star ratings for this item. + /// + public int? Count1Star; + /// + /// The total count of 2 star ratings for this item. + /// + public int? Count2Star; + /// + /// The total count of 3 star ratings for this item. + /// + public int? Count3Star; + /// + /// The total count of 4 star ratings for this item. + /// + public int? Count4Star; + /// + /// The total count of 5 star ratings for this item. + /// + public int? Count5Star; + /// + /// The total count of ratings for this item. + /// + public int? TotalCount; + } + + /// + /// Redeem items from the Apple App Store. + /// + [Serializable] + public class RedeemAppleAppStoreInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The receipt provided by the Apple marketplace upon successful purchase. + /// + public string Receipt; + } + + [Serializable] + public class RedeemAppleAppStoreInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the Google Play Store. + /// + [Serializable] + public class RedeemGooglePlayInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The list of purchases to redeem + /// + public List Purchases; + } + + [Serializable] + public class RedeemGooglePlayInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the Microsoft Store. + /// + [Serializable] + public class RedeemMicrosoftStoreInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The OneStore Collections Id Key used for AAD authentication. + /// + public string CollectionsIdKey; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Xbox Token used for delegated business partner authentication. + /// + public string XboxToken; + } + + [Serializable] + public class RedeemMicrosoftStoreInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the Nintendo EShop. + /// + [Serializable] + public class RedeemNintendoEShopInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The Nintendo provided token authorizing redemption + /// + public string NintendoServiceAccountIdToken; + } + + [Serializable] + public class RedeemNintendoEShopInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem items from the PlayStation Store. + /// + [Serializable] + public class RedeemPlayStationStoreInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// Auth code returned by PlayStation :tm: Network OAuth system. + /// + public string AuthorizationCode; + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + /// + /// Optional Service Label to pass into the request. + /// + public string ServiceLabel; + } + + [Serializable] + public class RedeemPlayStationStoreInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + /// + /// Redeem inventory items from Steam. + /// + [Serializable] + public class RedeemSteamInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default") + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + } + + [Serializable] + public class RedeemSteamInventoryItemsResponse : PlayFabResultCommon + { + /// + /// The list of failed redemptions from the external marketplace. + /// + public List Failed; + /// + /// The list of successful redemptions from the external marketplace. + /// + public List Succeeded; + /// + /// The Transaction IDs associated with the inventory modifications + /// + public List TransactionIds; + } + + [Serializable] + public class RedemptionFailure : PlayFabBaseModel + { + /// + /// The marketplace failure code. + /// + public string FailureCode; + /// + /// The marketplace error details explaining why the offer failed to redeem. + /// + public string FailureDetails; + /// + /// The transaction id in the external marketplace. + /// + public string MarketplaceTransactionId; + /// + /// The ID of the offer being redeemed. + /// + public string OfferId; + } + + [Serializable] + public class RedemptionSuccess : PlayFabBaseModel + { + /// + /// The transaction id in the external marketplace. + /// + public string MarketplaceTransactionId; + /// + /// The ID of the offer being redeemed. + /// + public string OfferId; + /// + /// The timestamp for when the redeem was completed. + /// + public DateTime SuccessTimestamp; + } + + [Serializable] + public class ReportItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// Category of concern for this report. + /// + public ConcernCategory? ConcernCategory; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The string reason for this report. + /// + public string Reason; + } + + [Serializable] + public class ReportItemResponse : PlayFabResultCommon + { + } + + /// + /// Submit a report for an inappropriate review, allowing the submitting user to specify their concern. + /// + [Serializable] + public class ReportItemReviewRequest : PlayFabRequestCommon + { + /// + /// An alternate ID of the item associated with the review. + /// + public CatalogAlternateId AlternateId; + /// + /// The reason this review is being reported. + /// + public ConcernCategory? ConcernCategory; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The string ID of the item associated with the review. + /// + public string ItemId; + /// + /// The string reason for this report. + /// + public string Reason; + /// + /// The ID of the review to submit a report for. + /// + public string ReviewId; + } + + [Serializable] + public class ReportItemReviewResponse : PlayFabResultCommon + { + } + + [Serializable] + public class Review : PlayFabBaseModel + { + /// + /// The number of negative helpfulness votes for this review. + /// + public int HelpfulNegative; + /// + /// The number of positive helpfulness votes for this review. + /// + public int HelpfulPositive; + /// + /// Indicates whether the review author has the item installed. + /// + public bool IsInstalled; + /// + /// The ID of the item being reviewed. + /// + public string ItemId; + /// + /// The version of the item being reviewed. + /// + public string ItemVersion; + /// + /// The locale for which this review was submitted in. + /// + public string Locale; + /// + /// Star rating associated with this review. + /// + public int Rating; + /// + /// The ID of the author of the review. + /// + public EntityKey ReviewerEntity; + /// + /// Deprecated. Use ReviewerEntity instead. This property will be removed in a future release. + /// + public string ReviewerId; + /// + /// The ID of the review. + /// + public string ReviewId; + /// + /// The full text of this review. + /// + public string ReviewText; + /// + /// The date and time this review was last submitted. + /// + public DateTime Submitted; + /// + /// The title of this review. + /// + public string Title; + } + + [Serializable] + public class ReviewItemRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The review to submit. + /// + public Review Review; + } + + [Serializable] + public class ReviewItemResponse : PlayFabResultCommon + { + } + + [Serializable] + public class ReviewTakedown : PlayFabBaseModel + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The ID of the item associated with the review to take down. + /// + public string ItemId; + /// + /// The ID of the review to take down. + /// + public string ReviewId; + } + + [Serializable] + public class ScanResult : PlayFabBaseModel + { + /// + /// The URL of the item which failed the scan. + /// + public string Url; + } + + [Serializable] + public class SearchItemsRequest : PlayFabRequestCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// Number of items to retrieve. This value is optional. Maximum page size is 50. Default value is 10. + /// + public int Count; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// An OData filter used to refine the search query (For example: "type eq 'ugc'"). More info about Filter Complexity limits + /// can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/search#limits + /// + public string Filter; + /// + /// An OData orderBy used to order the results of the search query. For example: "rating/average asc" + /// + public string OrderBy; + /// + /// The text to search for. + /// + public string Search; + /// + /// An OData select query option used to augment the search results. If not defined, the default search result metadata will + /// be returned. + /// + public string Select; + /// + /// The store to restrict the search request to. + /// + public StoreReference Store; + } + + [Serializable] + public class SearchItemsResponse : PlayFabResultCommon + { + /// + /// An opaque token used to retrieve the next page of items, if any are available. + /// + public string ContinuationToken; + /// + /// The paginated set of results for the search query. + /// + public List Items; + } + + [Serializable] + public class SetItemModerationStateRequest : PlayFabRequestCommon + { + /// + /// An alternate ID associated with this item. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The unique ID of the item. + /// + public string Id; + /// + /// The reason for the moderation state change for the associated item. + /// + public string Reason; + /// + /// The status to set for the associated item. + /// + public ModerationStatus? Status; + } + + [Serializable] + public class SetItemModerationStateResponse : PlayFabResultCommon + { + } + + [Serializable] + public class StoreDetails : PlayFabBaseModel + { + /// + /// The options for the filter in filter-based stores. These options are mutually exclusive with item references. + /// + public FilterOptions FilterOptions; + /// + /// The global prices utilized in the store. These options are mutually exclusive with price options in item references. + /// + public CatalogPriceOptionsOverride PriceOptionsOverride; + } + + [Serializable] + public class StoreReference : PlayFabBaseModel + { + /// + /// An alternate ID of the store. + /// + public CatalogAlternateId AlternateId; + /// + /// The unique ID of the store. + /// + public string Id; + } + + [Serializable] + public class SubmitItemReviewVoteRequest : PlayFabRequestCommon + { + /// + /// An alternate ID of the item associated with the review. + /// + public CatalogAlternateId AlternateId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The string ID of the item associated with the review. + /// + public string ItemId; + /// + /// The ID of the review to submit a helpfulness vote for. + /// + public string ReviewId; + /// + /// The helpfulness vote of the review. + /// + public HelpfulnessVote? Vote; + } + + [Serializable] + public class SubmitItemReviewVoteResponse : PlayFabResultCommon + { + } + + [Serializable] + public class SubscriptionDetails : PlayFabBaseModel + { + /// + /// The length of time that the subscription will last in seconds. + /// + public double DurationInSeconds; + } + + [Serializable] + public class SubtractInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to subtract from the current item amount. + /// + public int? Amount; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. (Default = + /// false). + /// + public bool DeleteEmptyStacks; + /// + /// The duration to subtract from the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The inventory item the operation applies to. + /// + public InventoryItemReference Item; + } + + /// + /// Given an entity type, entity identifier and container details, will subtract the specified inventory items. + /// + [Serializable] + public class SubtractInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to subtract for the current item. + /// + public int? Amount; + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. + /// (Default=false) + /// + public bool DeleteEmptyStacks; + /// + /// The duration to subtract from the current item expiration date. + /// + public double? DurationInSeconds; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item the request applies to. + /// + public InventoryItemReference Item; + } + + [Serializable] + public class SubtractInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + /// + /// Submit a request to takedown one or more reviews, removing them from public view. Authors will still be able to see + /// their reviews after being taken down. + /// + [Serializable] + public class TakedownItemReviewsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The set of reviews to take down. + /// + public List Reviews; + } + + [Serializable] + public class TakedownItemReviewsResponse : PlayFabResultCommon + { + } + + [Serializable] + public class Transaction : PlayFabBaseModel + { + /// + /// The API call that caused this transaction. + /// + public string ApiName; + /// + /// The type of item that the the operation occurred on. + /// + public string ItemType; + /// + /// The operations that occurred. + /// + public List Operations; + /// + /// The type of operation that was run. + /// + public string OperationType; + /// + /// Additional details about the transaction. Null if it was not a purchase operation. + /// + public TransactionPurchaseDetails PurchaseDetails; + /// + /// Additional details about the transaction. Null if it was not a redeem operation. + /// + public TransactionRedeemDetails RedeemDetails; + /// + /// The time this transaction occurred in UTC. + /// + public DateTime Timestamp; + /// + /// The id of the transaction. This should be treated like an opaque token. + /// + public string TransactionId; + /// + /// Additional details about the transaction. Null if it was not a transfer operation. + /// + public TransactionTransferDetails TransferDetails; + } + + [Serializable] + public class TransactionOperation : PlayFabBaseModel + { + /// + /// The amount of items in this transaction. + /// + public int? Amount; + /// + /// The duration modified in this transaction. + /// + public double? DurationInSeconds; + /// + /// The item id of the items in this transaction. + /// + public string ItemId; + /// + /// The type of item that the operation occurred on. + /// + public string ItemType; + /// + /// The stack id of the items in this transaction. + /// + public string StackId; + /// + /// The type of the operation that occurred. + /// + public string Type; + } + + [Serializable] + public class TransactionPurchaseDetails : PlayFabBaseModel + { + /// + /// The id of the Store the item was purchased from or null. + /// + public string StoreId; + } + + [Serializable] + public class TransactionRedeemDetails : PlayFabBaseModel + { + /// + /// The marketplace that the offer is being redeemed from. + /// + public string Marketplace; + /// + /// The transaction Id returned from the marketplace. + /// + public string MarketplaceTransactionId; + /// + /// The offer Id of the item being redeemed. + /// + public string OfferId; + } + + [Serializable] + public class TransactionTransferDetails : PlayFabBaseModel + { + /// + /// The collection id the items were transferred from or null if it was the current collection. + /// + public string GivingCollectionId; + /// + /// The entity the items were transferred from or null if it was the current entity. + /// + public EntityKey GivingEntity; + /// + /// The collection id the items were transferred to or null if it was the current collection. + /// + public string ReceivingCollectionId; + /// + /// The entity the items were transferred to or null if it was the current entity. + /// + public EntityKey ReceivingEntity; + /// + /// The id of the transfer that occurred. + /// + public string TransferId; + } + + [Serializable] + public class TransferInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The amount to transfer. + /// + public int? Amount; + /// + /// Indicates whether stacks reduced to an amount of 0 during the operation should be deleted from the inventory. (Default = + /// false) + /// + public bool DeleteEmptyStacks; + /// + /// The inventory item the operation is transferring from. + /// + public InventoryItemReference GivingItem; + /// + /// The values to apply to a stack newly created by this operation. + /// + public InitialValues NewStackValues; + /// + /// The inventory item the operation is transferring to. + /// + public InventoryItemReference ReceivingItem; + } + + /// + /// Transfer the specified inventory items of an entity's container Id to another entity's container Id. + /// + [Serializable] + public class TransferInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The amount to transfer . + /// + public int? Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether stacks reduced to an amount of 0 during the request should be deleted from the inventory. (Default = + /// false) + /// + public bool DeleteEmptyStacks; + /// + /// The inventory collection id the request is transferring from. (Default="default") + /// + public string GivingCollectionId; + /// + /// The entity the request is transferring from. Set to the caller by default. + /// + public EntityKey GivingEntity; + /// + /// ETags are used for concurrency checking when updating resources (before transferring from). More information about using + /// ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string GivingETag; + /// + /// The inventory item the request is transferring from. + /// + public InventoryItemReference GivingItem; + /// + /// The idempotency id for the request. + /// + public string IdempotencyId; + /// + /// The values to apply to a stack newly created by this request. + /// + public InitialValues NewStackValues; + /// + /// The inventory collection id the request is transferring to. (Default="default") + /// + public string ReceivingCollectionId; + /// + /// The entity the request is transferring to. Set to the caller by default. + /// + public EntityKey ReceivingEntity; + /// + /// The inventory item the request is transferring to. + /// + public InventoryItemReference ReceivingItem; + } + + [Serializable] + public class TransferInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources (after transferring from). More information about using + /// ETags can be found here: https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string GivingETag; + /// + /// The ids of transactions that occurred as a result of the request's giving action. + /// + public List GivingTransactionIds; + /// + /// The idempotency id for the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request's receiving action. + /// + public List ReceivingTransactionIds; + } + + [Serializable] + public class UpdateCatalogConfigRequest : PlayFabRequestCommon + { + /// + /// The updated catalog configuration. + /// + public CatalogConfig Config; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class UpdateCatalogConfigResponse : PlayFabResultCommon + { + } + + [Serializable] + public class UpdateDraftItemRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Updated metadata describing the catalog item to be updated. + /// + public CatalogItem Item; + /// + /// Whether the item should be published immediately. This value is optional, defaults to false. + /// + public bool Publish; + } + + [Serializable] + public class UpdateDraftItemResponse : PlayFabResultCommon + { + /// + /// Updated metadata describing the catalog item just updated. + /// + public CatalogItem Item; + } + + [Serializable] + public class UpdateInventoryItemsOperation : PlayFabBaseModel + { + /// + /// The inventory item to update with the specified values. + /// + public InventoryItem Item; + } + + /// + /// Given an entity type, entity identifier and container details, will update the entity's inventory items + /// + [Serializable] + public class UpdateInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// The id of the entity's collection to perform this action on. (Default="default"). The number of inventory collections is + /// unlimited. + /// + public string CollectionId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The Idempotency ID for this request. Idempotency IDs can be used to prevent operation replay in the medium term but will + /// be garbage collected eventually. + /// + public string IdempotencyId; + /// + /// The inventory item to update with the specified values. + /// + public InventoryItem Item; + } + + [Serializable] + public class UpdateInventoryItemsResponse : PlayFabResultCommon + { + /// + /// ETags are used for concurrency checking when updating resources. More information about using ETags can be found here: + /// https://learn.microsoft.com/en-us/gaming/playfab/features/economy-v2/catalog/etags + /// + public string ETag; + /// + /// The idempotency id used in the request. + /// + public string IdempotencyId; + /// + /// The ids of transactions that occurred as a result of the request. + /// + public List TransactionIds; + } + + [Serializable] + public class UploadInfo : PlayFabBaseModel + { + /// + /// Name of the file to be uploaded. + /// + public string FileName; + } + + [Serializable] + public class UploadUrlMetadata : PlayFabBaseModel + { + /// + /// Name of the file for which this upload URL was requested. + /// + public string FileName; + /// + /// Unique ID for the binary content to be uploaded to the target URL. + /// + public string Id; + /// + /// URL for the binary content to be uploaded to. + /// + public string Url; + } + + [Serializable] + public class UserGeneratedContentSpecificConfig : PlayFabBaseModel + { + /// + /// The set of content types that will be used for validation. + /// + public List ContentTypes; + /// + /// The set of tags that will be used for validation. + /// + public List Tags; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta new file mode 100644 index 00000000..72068f41 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEconomyModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9e420d6be63cf50498180c2df1199abc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs new file mode 100644 index 00000000..608b894f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs @@ -0,0 +1,98 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.EconomyModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnEconomyAddInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyAddInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyCreateDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyCreateDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyCreateUploadUrlsRequestEvent; + public event PlayFabResultEvent OnEconomyCreateUploadUrlsResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteEntityItemReviewsRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteEntityItemReviewsResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteInventoryCollectionRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteInventoryCollectionResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyDeleteItemRequestEvent; + public event PlayFabResultEvent OnEconomyDeleteItemResultEvent; + public event PlayFabRequestEvent OnEconomyExecuteInventoryOperationsRequestEvent; + public event PlayFabResultEvent OnEconomyExecuteInventoryOperationsResultEvent; + public event PlayFabRequestEvent OnEconomyGetCatalogConfigRequestEvent; + public event PlayFabResultEvent OnEconomyGetCatalogConfigResultEvent; + public event PlayFabRequestEvent OnEconomyGetDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyGetDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyGetDraftItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetDraftItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetEntityDraftItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetEntityDraftItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetEntityItemReviewRequestEvent; + public event PlayFabResultEvent OnEconomyGetEntityItemReviewResultEvent; + public event PlayFabRequestEvent OnEconomyGetInventoryCollectionIdsRequestEvent; + public event PlayFabResultEvent OnEconomyGetInventoryCollectionIdsResultEvent; + public event PlayFabRequestEvent OnEconomyGetInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemContainersRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemContainersResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemModerationStateRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemModerationStateResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemPublishStatusRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemPublishStatusResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemReviewsRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemReviewsResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemReviewSummaryRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemReviewSummaryResultEvent; + public event PlayFabRequestEvent OnEconomyGetItemsRequestEvent; + public event PlayFabResultEvent OnEconomyGetItemsResultEvent; + public event PlayFabRequestEvent OnEconomyGetMicrosoftStoreAccessTokensRequestEvent; + public event PlayFabResultEvent OnEconomyGetMicrosoftStoreAccessTokensResultEvent; + public event PlayFabRequestEvent OnEconomyGetTransactionHistoryRequestEvent; + public event PlayFabResultEvent OnEconomyGetTransactionHistoryResultEvent; + public event PlayFabRequestEvent OnEconomyPublishDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyPublishDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyPurchaseInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyPurchaseInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemGooglePlayInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemGooglePlayInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemNintendoEShopInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyRedeemSteamInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyRedeemSteamInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyReportItemRequestEvent; + public event PlayFabResultEvent OnEconomyReportItemResultEvent; + public event PlayFabRequestEvent OnEconomyReportItemReviewRequestEvent; + public event PlayFabResultEvent OnEconomyReportItemReviewResultEvent; + public event PlayFabRequestEvent OnEconomyReviewItemRequestEvent; + public event PlayFabResultEvent OnEconomyReviewItemResultEvent; + public event PlayFabRequestEvent OnEconomySearchItemsRequestEvent; + public event PlayFabResultEvent OnEconomySearchItemsResultEvent; + public event PlayFabRequestEvent OnEconomySetItemModerationStateRequestEvent; + public event PlayFabResultEvent OnEconomySetItemModerationStateResultEvent; + public event PlayFabRequestEvent OnEconomySubmitItemReviewVoteRequestEvent; + public event PlayFabResultEvent OnEconomySubmitItemReviewVoteResultEvent; + public event PlayFabRequestEvent OnEconomySubtractInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomySubtractInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyTakedownItemReviewsRequestEvent; + public event PlayFabResultEvent OnEconomyTakedownItemReviewsResultEvent; + public event PlayFabRequestEvent OnEconomyTransferInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyTransferInventoryItemsResultEvent; + public event PlayFabRequestEvent OnEconomyUpdateCatalogConfigRequestEvent; + public event PlayFabResultEvent OnEconomyUpdateCatalogConfigResultEvent; + public event PlayFabRequestEvent OnEconomyUpdateDraftItemRequestEvent; + public event PlayFabResultEvent OnEconomyUpdateDraftItemResultEvent; + public event PlayFabRequestEvent OnEconomyUpdateInventoryItemsRequestEvent; + public event PlayFabResultEvent OnEconomyUpdateInventoryItemsResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta new file mode 100644 index 00000000..db4b7ba1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Economy/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a2679e440c4893c4f9b6e5d5314c0465 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity.meta new file mode 100644 index 00000000..004a68e2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 760e5091fc644574b9160901cc83b72b +folderAsset: yes +timeCreated: 1521234904 +licenseType: Pro +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs new file mode 100644 index 00000000..3ed9f1a8 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs @@ -0,0 +1,255 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace PlayFab.Public +{ + /// + /// Interface which can be used to implement class responsible for gathering and sending information about session. + /// + public interface IScreenTimeTracker + { + // Unity MonoBehaviour callbacks + void OnEnable(); + void OnDisable(); + void OnDestroy(); + void OnApplicationQuit(); + void OnApplicationFocus(bool isFocused); + + // Class specific methods + void ClientSessionStart(string entityId, string entityType, string playFabUserId); + void Send(); + } + + /// + /// Class responsible for gathering and sending information about session, for example: focus duration, device info, etc. + /// + public class ScreenTimeTracker : IScreenTimeTracker + { + private Guid focusId; + private Guid gameSessionID = Guid.NewGuid(); + private bool initialFocus = true; + private bool isSending = false; + private DateTime focusOffDateTime = DateTime.UtcNow; + private DateTime focusOnDateTime = DateTime.UtcNow; + + private Queue eventsRequests = new Queue(); + + private EventsModels.EntityKey entityKey = new EventsModels.EntityKey(); + private const string eventNamespace = "com.playfab.events.sessions"; + private const int maxBatchSizeInEvents = 10; + + private PlayFabEventsInstanceAPI eventApi; + + public ScreenTimeTracker() + { + eventApi = new PlayFabEventsInstanceAPI(PlayFabSettings.staticPlayer); + } + + private void EnsureSingleGameSessionId() + { + if (gameSessionID == Guid.Empty) + { + gameSessionID = Guid.NewGuid(); + } + } + + /// + /// Start session, the function responsible for creating SessionID and gathering information about user and device + /// + /// Result of the user's login, represent user ID + public void ClientSessionStart(string entityId, string entityType, string playFabUserId) + { + EnsureSingleGameSessionId(); + + entityKey.Id = entityId; + entityKey.Type = entityType; + + EventsModels.EventContents eventInfo = new EventsModels.EventContents(); + + eventInfo.Name = "client_session_start"; + eventInfo.EventNamespace = eventNamespace; + eventInfo.Entity = entityKey; + eventInfo.OriginalTimestamp = DateTime.UtcNow; + + var payload = new Dictionary + { + { "UserID", playFabUserId}, + { "DeviceType", SystemInfo.deviceType}, + { "DeviceModel", SystemInfo.deviceModel}, + { "OS", SystemInfo.operatingSystem }, + { "ClientSessionID", gameSessionID }, + }; + + eventInfo.Payload = payload; + eventsRequests.Enqueue(eventInfo); + + // Fake a focus-on event at the time of the first login: + OnApplicationFocus(true); + } + + /// + /// Gather information about user's focus. Calculates interaction durations. + /// Name mimics MonoBehaviour method, for ease of integration. + /// + /// State of focus + public void OnApplicationFocus(bool isFocused) + { + EnsureSingleGameSessionId(); + EventsModels.EventContents eventInfo = new EventsModels.EventContents(); + DateTime currentUtcDateTime = DateTime.UtcNow; + + eventInfo.Name = "client_focus_change"; + eventInfo.EventNamespace = eventNamespace; + eventInfo.Entity = entityKey; + + double focusStateDuration = 0.0; + + if (initialFocus) + { + focusId = Guid.NewGuid(); + } + + if (isFocused) + { + // start counting focus-on time + focusOnDateTime = currentUtcDateTime; + + // new id per focus + focusId = Guid.NewGuid(); + + if (!initialFocus) + { + focusStateDuration = (currentUtcDateTime - focusOffDateTime).TotalSeconds; + + // this check safeguards from manual time changes while app is running + if (focusStateDuration < 0) + { + focusStateDuration = 0; + } + } + } + else + { + focusStateDuration = (currentUtcDateTime - focusOnDateTime).TotalSeconds; + + // this check safeguards from manual time changes while app is running + if (focusStateDuration < 0) + { + focusStateDuration = 0; + } + + // start counting focus-off time + focusOffDateTime = currentUtcDateTime; + } + + var payload = new Dictionary { + { "FocusID", focusId }, + { "FocusState", isFocused }, + { "FocusStateDuration", focusStateDuration }, + { "EventTimestamp", currentUtcDateTime }, + { "ClientSessionID", gameSessionID }, + }; + + eventInfo.OriginalTimestamp = currentUtcDateTime; + eventInfo.Payload = payload; + eventsRequests.Enqueue(eventInfo); + + initialFocus = false; + + if (!isFocused) + { + // Force the eventsRequests queue to empty. + // If we are losing focus we should make an attempt to push out a focus lost event ASAP + Send(); + } + + } + + /// + /// Sends events to server. + /// + public void Send() + { + if (PlayFabSettings.staticPlayer.IsClientLoggedIn() && (isSending == false)) + { + isSending = true; + + EventsModels.WriteEventsRequest request = new EventsModels.WriteEventsRequest(); + request.Events = new List(); + + while ((eventsRequests.Count > 0) && (request.Events.Count < maxBatchSizeInEvents)) + { + EventsModels.EventContents eventInfo = eventsRequests.Dequeue(); + request.Events.Add(eventInfo); + } + + if (request.Events.Count > 0) + { + eventApi.WriteEvents(request, EventSentSuccessfulCallback, EventSentErrorCallback); + } + + isSending = false; + } + } + + /// + /// Callback to handle successful server interaction. + /// + /// Server response + private void EventSentSuccessfulCallback(EventsModels.WriteEventsResponse response) + { + // add code to work with successful callback + } + + /// + /// Callback to handle unsuccessful server interaction. + /// + /// Server response + private void EventSentErrorCallback(PlayFabError response) + { + Debug.LogWarning("Failed to send session data. Error: " + response.GenerateErrorReport()); + } + + #region Unused MonoBehaviour compatibility methods + /// + /// Unused + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnEnable() + { + // add code sending events on enable + } + + /// + /// Unused + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnDisable() + { + // add code sending events on disable + } + + /// + /// Unused + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnDestroy() + { + // add code sending events on destroy + } + #endregion + + /// + /// Trying to send event during game exit. Note: works only on certain platforms. + /// Name mimics MonoBehaviour method, for ease of integration. + /// + public void OnApplicationQuit() + { + // trying to send events during game exit + Send(); + } + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta new file mode 100644 index 00000000..d44c5305 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Entity/ScreenTimeTracker.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: bb87bdc3f40216e419c8f1b76c4517d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events.meta new file mode 100644 index 00000000..043ec870 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 73a2eea4489bd9447a29c5114a2c0d7c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs new file mode 100644 index 00000000..fcc00a3e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs @@ -0,0 +1,14 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.EventsModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnEventsWriteEventsRequestEvent; + public event PlayFabResultEvent OnEventsWriteEventsResultEvent; + public event PlayFabRequestEvent OnEventsWriteTelemetryEventsRequestEvent; + public event PlayFabResultEvent OnEventsWriteTelemetryEventsResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta new file mode 100644 index 00000000..b3fa18a3 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 816bf581b4b09c04bbf42adfea99a423 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs new file mode 100644 index 00000000..b5c70e44 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs @@ -0,0 +1,67 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.EventsModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Write custom PlayStream and Telemetry events for any PlayFab entity. Telemetry events can be used for analytic, + /// reporting, or debugging. PlayStream events can do all of that and also trigger custom actions in near real-time. + /// + public static class PlayFabEventsAPI + { + static PlayFabEventsAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Write batches of entity based events to PlayStream. The namespace of the Event must be 'custom' or start with 'custom.'. + /// + public static void WriteEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/WriteEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Write batches of entity based events to as Telemetry events (bypass PlayStream). The namespace must be 'custom' or start + /// with 'custom.' + /// + public static void WriteTelemetryEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Event/WriteTelemetryEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta new file mode 100644 index 00000000..f41b3427 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6209aee5722aa2c46ba625e1944d6fa8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs new file mode 100644 index 00000000..d07b2ce2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs @@ -0,0 +1,81 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.EventsModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Write custom PlayStream and Telemetry events for any PlayFab entity. Telemetry events can be used for analytic, + /// reporting, or debugging. PlayStream events can do all of that and also trigger custom actions in near real-time. + /// + public class PlayFabEventsInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabEventsInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabEventsInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Write batches of entity based events to PlayStream. The namespace of the Event must be 'custom' or start with 'custom.'. + /// + public void WriteEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/WriteEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Write batches of entity based events to as Telemetry events (bypass PlayStream). The namespace must be 'custom' or start + /// with 'custom.' + /// + public void WriteTelemetryEvents(WriteEventsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Event/WriteTelemetryEvents", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta new file mode 100644 index 00000000..38d0c3b7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: efc8181560ecd0748a12a6df7137998e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs new file mode 100644 index 00000000..72430691 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs @@ -0,0 +1,89 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.EventsModels +{ + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EventContents : PlayFabBaseModel + { + /// + /// The optional custom tags associated with the event (e.g. build number, external trace identifiers, etc.). Before an + /// event is written, this collection and the base request custom tags will be merged, but not overriden. This enables the + /// caller to specify static tags and per event tags. + /// + public Dictionary CustomTags; + /// + /// Entity associated with the event. If null, the event will apply to the calling entity. + /// + public EntityKey Entity; + /// + /// The namespace in which the event is defined. Allowed namespaces can vary by API. + /// + public string EventNamespace; + /// + /// The name of this event. + /// + public string Name; + /// + /// The original unique identifier associated with this event before it was posted to PlayFab. The value might differ from + /// the EventId value, which is assigned when the event is received by the server. + /// + public string OriginalId; + /// + /// The time (in UTC) associated with this event when it occurred. If specified, this value is stored in the + /// OriginalTimestamp property of the PlayStream event. + /// + public DateTime? OriginalTimestamp; + /// + /// Arbitrary data associated with the event. Only one of Payload or PayloadJSON is allowed. + /// + public object Payload; + /// + /// Arbitrary data associated with the event, represented as a JSON serialized string. Only one of Payload or PayloadJSON is + /// allowed. + /// + public string PayloadJSON; + } + + [Serializable] + public class WriteEventsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The collection of events to write. Up to 200 events can be written per request. + /// + public List Events; + } + + [Serializable] + public class WriteEventsResponse : PlayFabResultCommon + { + /// + /// The unique identifiers assigned by the server to the events, in the same order as the events in the request. Only + /// returned if FlushToPlayStream option is true. + /// + public List AssignedEventIds; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta new file mode 100644 index 00000000..4e6f8cc4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Events/PlayFabEventsModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9ee524faa41ee444ca207259e58e70a1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation.meta new file mode 100644 index 00000000..1cd58be0 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f95f1281203327240a7f9f479dd781d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs new file mode 100644 index 00000000..816314ab --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs @@ -0,0 +1,36 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.ExperimentationModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnExperimentationCreateExclusionGroupRequestEvent; + public event PlayFabResultEvent OnExperimentationCreateExclusionGroupResultEvent; + public event PlayFabRequestEvent OnExperimentationCreateExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationCreateExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationDeleteExclusionGroupRequestEvent; + public event PlayFabResultEvent OnExperimentationDeleteExclusionGroupResultEvent; + public event PlayFabRequestEvent OnExperimentationDeleteExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationDeleteExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationGetExclusionGroupsRequestEvent; + public event PlayFabResultEvent OnExperimentationGetExclusionGroupsResultEvent; + public event PlayFabRequestEvent OnExperimentationGetExclusionGroupTrafficRequestEvent; + public event PlayFabResultEvent OnExperimentationGetExclusionGroupTrafficResultEvent; + public event PlayFabRequestEvent OnExperimentationGetExperimentsRequestEvent; + public event PlayFabResultEvent OnExperimentationGetExperimentsResultEvent; + public event PlayFabRequestEvent OnExperimentationGetLatestScorecardRequestEvent; + public event PlayFabResultEvent OnExperimentationGetLatestScorecardResultEvent; + public event PlayFabRequestEvent OnExperimentationGetTreatmentAssignmentRequestEvent; + public event PlayFabResultEvent OnExperimentationGetTreatmentAssignmentResultEvent; + public event PlayFabRequestEvent OnExperimentationStartExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationStartExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationStopExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationStopExperimentResultEvent; + public event PlayFabRequestEvent OnExperimentationUpdateExclusionGroupRequestEvent; + public event PlayFabResultEvent OnExperimentationUpdateExclusionGroupResultEvent; + public event PlayFabRequestEvent OnExperimentationUpdateExperimentRequestEvent; + public event PlayFabResultEvent OnExperimentationUpdateExperimentResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta new file mode 100644 index 00000000..c97ee632 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ad18b9280bb1a7f4c926eba4c1086b6e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs new file mode 100644 index 00000000..22e41945 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs @@ -0,0 +1,208 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ExperimentationModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// APIs for managing experiments. + /// + public static class PlayFabExperimentationAPI + { + static PlayFabExperimentationAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Creates a new experiment exclusion group for a title. + /// + public static void CreateExclusionGroup(CreateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/CreateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new experiment for a title. + /// + public static void CreateExperiment(CreateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/CreateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing exclusion group for a title. + /// + public static void DeleteExclusionGroup(DeleteExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing experiment for a title. + /// + public static void DeleteExperiment(DeleteExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public static void GetExclusionGroups(GetExclusionGroupsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroups", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public static void GetExclusionGroupTraffic(GetExclusionGroupTrafficRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroupTraffic", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the details of all experiments for a title. + /// + public static void GetExperiments(GetExperimentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetExperiments", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the latest scorecard of the experiment for the title. + /// + public static void GetLatestScorecard(GetLatestScorecardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetLatestScorecard", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the treatment assignments for a player for every running experiment in the title. + /// + public static void GetTreatmentAssignment(GetTreatmentAssignmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/GetTreatmentAssignment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Starts an existing experiment for a title. + /// + public static void StartExperiment(StartExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/StartExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Stops an existing experiment for a title. + /// + public static void StopExperiment(StopExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/StopExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates an existing exclusion group for a title. + /// + public static void UpdateExclusionGroup(UpdateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates an existing experiment for a title. + /// + public static void UpdateExperiment(UpdateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta new file mode 100644 index 00000000..c19eab74 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9dbcafaa60e9f2a41930b9907fb0c133 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs new file mode 100644 index 00000000..eab7baed --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs @@ -0,0 +1,200 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.ExperimentationModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// APIs for managing experiments. + /// + public class PlayFabExperimentationInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabExperimentationInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabExperimentationInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Creates a new experiment exclusion group for a title. + /// + public void CreateExclusionGroup(CreateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/CreateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new experiment for a title. + /// + public void CreateExperiment(CreateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/CreateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing exclusion group for a title. + /// + public void DeleteExclusionGroup(DeleteExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing experiment for a title. + /// + public void DeleteExperiment(DeleteExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/DeleteExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public void GetExclusionGroups(GetExclusionGroupsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroups", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the details of all exclusion groups for a title. + /// + public void GetExclusionGroupTraffic(GetExclusionGroupTrafficRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetExclusionGroupTraffic", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the details of all experiments for a title. + /// + public void GetExperiments(GetExperimentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetExperiments", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the latest scorecard of the experiment for the title. + /// + public void GetLatestScorecard(GetLatestScorecardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetLatestScorecard", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the treatment assignments for a player for every running experiment in the title. + /// + public void GetTreatmentAssignment(GetTreatmentAssignmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/GetTreatmentAssignment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Starts an existing experiment for a title. + /// + public void StartExperiment(StartExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/StartExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Stops an existing experiment for a title. + /// + public void StopExperiment(StopExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/StopExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates an existing exclusion group for a title. + /// + public void UpdateExclusionGroup(UpdateExclusionGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExclusionGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates an existing experiment for a title. + /// + public void UpdateExperiment(UpdateExperimentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Experimentation/UpdateExperiment", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta new file mode 100644 index 00000000..26f07683 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ecc5b8d11fae41b4daaaf638349fdc78 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs new file mode 100644 index 00000000..84087e99 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs @@ -0,0 +1,670 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ExperimentationModels +{ + public enum AnalysisTaskState + { + Waiting, + ReadyForSubmission, + SubmittingToPipeline, + Running, + Completed, + Failed, + Canceled + } + + /// + /// Given a title entity token and exclusion group details, will create a new exclusion group for the title. + /// + [Serializable] + public class CreateExclusionGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the exclusion group. + /// + public string Description; + /// + /// Friendly name of the exclusion group. + /// + public string Name; + } + + [Serializable] + public class CreateExclusionGroupResult : PlayFabResultCommon + { + /// + /// Identifier of the exclusion group. + /// + public string ExclusionGroupId; + } + + /// + /// Given a title entity token and experiment details, will create a new experiment for the title. + /// + [Serializable] + public class CreateExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the experiment. + /// + public string Description; + /// + /// When experiment should end. + /// + public DateTime? EndDate; + /// + /// Id of the exclusion group. + /// + public string ExclusionGroupId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint? ExclusionGroupTrafficAllocation; + /// + /// Type of experiment. + /// + public ExperimentType? ExperimentType; + /// + /// Friendly name of the experiment. + /// + public string Name; + /// + /// Id of the segment to which this experiment applies. Defaults to the 'All Players' segment. + /// + public string SegmentId; + /// + /// When experiment should start. + /// + public DateTime StartDate; + /// + /// List of title player account IDs that automatically receive treatments in the experiment, but are not included when + /// calculating experiment metrics. + /// + public List TitlePlayerAccountTestIds; + /// + /// List of variants for the experiment. + /// + public List Variants; + } + + [Serializable] + public class CreateExperimentResult : PlayFabResultCommon + { + /// + /// The ID of the new experiment. + /// + public string ExperimentId; + } + + /// + /// Given an entity token and an exclusion group ID this API deletes the exclusion group. + /// + [Serializable] + public class DeleteExclusionGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the exclusion group to delete. + /// + public string ExclusionGroupId; + } + + /// + /// Given an entity token and an experiment ID this API deletes the experiment. A running experiment must be stopped before + /// it can be deleted. + /// + [Serializable] + public class DeleteExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment to delete. + /// + public string ExperimentId; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class ExclusionGroupTrafficAllocation : PlayFabBaseModel + { + /// + /// Id of the experiment. + /// + public string ExperimentId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint TrafficAllocation; + } + + [Serializable] + public class Experiment : PlayFabBaseModel + { + /// + /// Description of the experiment. + /// + public string Description; + /// + /// When experiment should end/was ended. + /// + public DateTime? EndDate; + /// + /// Id of the exclusion group for this experiment. + /// + public string ExclusionGroupId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint? ExclusionGroupTrafficAllocation; + /// + /// Type of experiment. + /// + public ExperimentType? ExperimentType; + /// + /// Id of the experiment. + /// + public string Id; + /// + /// Friendly name of the experiment. + /// + public string Name; + /// + /// Id of the segment to which this experiment applies. Defaults to the 'All Players' segment. + /// + public string SegmentId; + /// + /// When experiment should start/was started. + /// + public DateTime StartDate; + /// + /// State experiment is currently in. + /// + public ExperimentState? State; + /// + /// List of title player account IDs that automatically receive treatments in the experiment, but are not included when + /// calculating experiment metrics. + /// + public List TitlePlayerAccountTestIds; + /// + /// List of variants for the experiment. + /// + public List Variants; + } + + [Serializable] + public class ExperimentExclusionGroup : PlayFabBaseModel + { + /// + /// Description of the exclusion group. + /// + public string Description; + /// + /// Id of the exclusion group. + /// + public string ExclusionGroupId; + /// + /// Friendly name of the exclusion group. + /// + public string Name; + } + + public enum ExperimentState + { + New, + Started, + Stopped, + Deleted + } + + public enum ExperimentType + { + Active, + Snapshot + } + + /// + /// Given a title entity token will return the list of all exclusion groups for a title. + /// + [Serializable] + public class GetExclusionGroupsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetExclusionGroupsResult : PlayFabResultCommon + { + /// + /// List of exclusion groups for the title. + /// + public List ExclusionGroups; + } + + /// + /// Given a title entity token and an exclusion group ID, will return the list of traffic allocations for the exclusion + /// group. + /// + [Serializable] + public class GetExclusionGroupTrafficRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the exclusion group. + /// + public string ExclusionGroupId; + } + + [Serializable] + public class GetExclusionGroupTrafficResult : PlayFabResultCommon + { + /// + /// List of traffic allocations for the exclusion group. + /// + public List TrafficAllocations; + } + + /// + /// Given a title entity token will return the list of all experiments for a title, including scheduled, started, stopped or + /// completed experiments. + /// + [Serializable] + public class GetExperimentsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetExperimentsResult : PlayFabResultCommon + { + /// + /// List of experiments for the title. + /// + public List Experiments; + } + + /// + /// Given a title entity token and experiment details, will return the latest available scorecard. + /// + [Serializable] + public class GetLatestScorecardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment. + /// + public string ExperimentId; + } + + [Serializable] + public class GetLatestScorecardResult : PlayFabResultCommon + { + /// + /// Scorecard for the experiment of the title. + /// + public Scorecard Scorecard; + } + + /// + /// Given a title player or a title entity token, returns the treatment variants and variables assigned to the entity across + /// all running experiments + /// + [Serializable] + public class GetTreatmentAssignmentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetTreatmentAssignmentResult : PlayFabResultCommon + { + /// + /// Treatment assignment for the entity. + /// + public TreatmentAssignment TreatmentAssignment; + } + + [Serializable] + public class MetricData : PlayFabBaseModel + { + /// + /// The upper bound of the confidence interval for the relative delta (Delta.RelativeValue). + /// + public double ConfidenceIntervalEnd; + /// + /// The lower bound of the confidence interval for the relative delta (Delta.RelativeValue). + /// + public double ConfidenceIntervalStart; + /// + /// The absolute delta between TreatmentStats.Average and ControlStats.Average. + /// + public float DeltaAbsoluteChange; + /// + /// The relative delta ratio between TreatmentStats.Average and ControlStats.Average. + /// + public float DeltaRelativeChange; + /// + /// The machine name of the metric. + /// + public string InternalName; + /// + /// Indicates if a movement was detected on that metric. + /// + public string Movement; + /// + /// The readable name of the metric. + /// + public string Name; + /// + /// The expectation that a movement is real + /// + public float PMove; + /// + /// The p-value resulting from the statistical test run for this metric + /// + public float PValue; + /// + /// The threshold for observing sample ratio mismatch. + /// + public float PValueThreshold; + /// + /// Indicates if the movement is statistically significant. + /// + public string StatSigLevel; + /// + /// Observed standard deviation value of the metric. + /// + public float StdDev; + /// + /// Observed average value of the metric. + /// + public float Value; + } + + [Serializable] + public class Scorecard : PlayFabBaseModel + { + /// + /// Represents the date the scorecard was generated. + /// + public string DateGenerated; + /// + /// Represents the duration of scorecard analysis. + /// + public string Duration; + /// + /// Represents the number of events processed for the generation of this scorecard + /// + public double EventsProcessed; + /// + /// Id of the experiment. + /// + public string ExperimentId; + /// + /// Friendly name of the experiment. + /// + public string ExperimentName; + /// + /// Represents the latest compute job status. + /// + public AnalysisTaskState? LatestJobStatus; + /// + /// Represents the presence of a sample ratio mismatch in the scorecard data. + /// + public bool SampleRatioMismatch; + /// + /// Scorecard containing list of analysis. + /// + public List ScorecardDataRows; + } + + [Serializable] + public class ScorecardDataRow : PlayFabBaseModel + { + /// + /// Represents whether the variant is control or not. + /// + public bool IsControl; + /// + /// Data of the analysis with the internal name of the metric as the key and an object of metric data as value. + /// + public Dictionary MetricDataRows; + /// + /// Represents the player count in the variant. + /// + public uint PlayerCount; + /// + /// Name of the variant of analysis. + /// + public string VariantName; + } + + /// + /// Given a title entity token and an experiment ID, this API starts the experiment. + /// + [Serializable] + public class StartExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment to start. + /// + public string ExperimentId; + } + + /// + /// Given a title entity token and an experiment ID, this API stops the experiment if it is running. + /// + [Serializable] + public class StopExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the experiment to stop. + /// + public string ExperimentId; + } + + [Serializable] + public class TreatmentAssignment : PlayFabBaseModel + { + /// + /// List of the experiment variables. + /// + public List Variables; + /// + /// List of the experiment variants. + /// + public List Variants; + } + + /// + /// Given an entity token and exclusion group details this API updates the exclusion group. + /// + [Serializable] + public class UpdateExclusionGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the exclusion group. + /// + public string Description; + /// + /// The ID of the exclusion group to update. + /// + public string ExclusionGroupId; + /// + /// Friendly name of the exclusion group. + /// + public string Name; + } + + /// + /// Given a title entity token and experiment details, this API updates the experiment. If an experiment is already running, + /// only the description and duration properties can be updated. + /// + [Serializable] + public class UpdateExperimentRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Description of the experiment. + /// + public string Description; + /// + /// When experiment should end. + /// + public DateTime? EndDate; + /// + /// Id of the exclusion group. + /// + public string ExclusionGroupId; + /// + /// Percentage of exclusion group traffic that will see this experiment. + /// + public uint? ExclusionGroupTrafficAllocation; + /// + /// Type of experiment. + /// + public ExperimentType? ExperimentType; + /// + /// Id of the experiment. + /// + public string Id; + /// + /// Friendly name of the experiment. + /// + public string Name; + /// + /// Id of the segment to which this experiment applies. Defaults to the 'All Players' segment. + /// + public string SegmentId; + /// + /// When experiment should start. + /// + public DateTime StartDate; + /// + /// List of title player account IDs that automatically receive treatments in the experiment, but are not included when + /// calculating experiment metrics. + /// + public List TitlePlayerAccountTestIds; + /// + /// List of variants for the experiment. + /// + public List Variants; + } + + [Serializable] + public class Variable : PlayFabBaseModel + { + /// + /// Name of the variable. + /// + public string Name; + /// + /// Value of the variable. + /// + public string Value; + } + + [Serializable] + public class Variant : PlayFabBaseModel + { + /// + /// Description of the variant. + /// + public string Description; + /// + /// Id of the variant. + /// + public string Id; + /// + /// Specifies if variant is control for experiment. + /// + public bool IsControl; + /// + /// Name of the variant. + /// + public string Name; + /// + /// Id of the TitleDataOverride to use with this variant. + /// + public string TitleDataOverrideLabel; + /// + /// Percentage of target audience traffic that will see this variant. + /// + public uint TrafficPercentage; + /// + /// Variables returned by this variant. + /// + public List Variables; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta new file mode 100644 index 00000000..45da40ec --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Experimentation/PlayFabExperimentationModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0804132d8066c1440a5cfdd0e56bf63c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups.meta new file mode 100644 index 00000000..fc6db3ec --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 362835eaf7c8a5e47baa567500fe68b1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs new file mode 100644 index 00000000..90a7937c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs @@ -0,0 +1,60 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.GroupsModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnGroupsAcceptGroupApplicationRequestEvent; + public event PlayFabResultEvent OnGroupsAcceptGroupApplicationResultEvent; + public event PlayFabRequestEvent OnGroupsAcceptGroupInvitationRequestEvent; + public event PlayFabResultEvent OnGroupsAcceptGroupInvitationResultEvent; + public event PlayFabRequestEvent OnGroupsAddMembersRequestEvent; + public event PlayFabResultEvent OnGroupsAddMembersResultEvent; + public event PlayFabRequestEvent OnGroupsApplyToGroupRequestEvent; + public event PlayFabResultEvent OnGroupsApplyToGroupResultEvent; + public event PlayFabRequestEvent OnGroupsBlockEntityRequestEvent; + public event PlayFabResultEvent OnGroupsBlockEntityResultEvent; + public event PlayFabRequestEvent OnGroupsChangeMemberRoleRequestEvent; + public event PlayFabResultEvent OnGroupsChangeMemberRoleResultEvent; + public event PlayFabRequestEvent OnGroupsCreateGroupRequestEvent; + public event PlayFabResultEvent OnGroupsCreateGroupResultEvent; + public event PlayFabRequestEvent OnGroupsCreateRoleRequestEvent; + public event PlayFabResultEvent OnGroupsCreateRoleResultEvent; + public event PlayFabRequestEvent OnGroupsDeleteGroupRequestEvent; + public event PlayFabResultEvent OnGroupsDeleteGroupResultEvent; + public event PlayFabRequestEvent OnGroupsDeleteRoleRequestEvent; + public event PlayFabResultEvent OnGroupsDeleteRoleResultEvent; + public event PlayFabRequestEvent OnGroupsGetGroupRequestEvent; + public event PlayFabResultEvent OnGroupsGetGroupResultEvent; + public event PlayFabRequestEvent OnGroupsInviteToGroupRequestEvent; + public event PlayFabResultEvent OnGroupsInviteToGroupResultEvent; + public event PlayFabRequestEvent OnGroupsIsMemberRequestEvent; + public event PlayFabResultEvent OnGroupsIsMemberResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupApplicationsRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupApplicationsResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupBlocksRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupBlocksResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupInvitationsRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupInvitationsResultEvent; + public event PlayFabRequestEvent OnGroupsListGroupMembersRequestEvent; + public event PlayFabResultEvent OnGroupsListGroupMembersResultEvent; + public event PlayFabRequestEvent OnGroupsListMembershipRequestEvent; + public event PlayFabResultEvent OnGroupsListMembershipResultEvent; + public event PlayFabRequestEvent OnGroupsListMembershipOpportunitiesRequestEvent; + public event PlayFabResultEvent OnGroupsListMembershipOpportunitiesResultEvent; + public event PlayFabRequestEvent OnGroupsRemoveGroupApplicationRequestEvent; + public event PlayFabResultEvent OnGroupsRemoveGroupApplicationResultEvent; + public event PlayFabRequestEvent OnGroupsRemoveGroupInvitationRequestEvent; + public event PlayFabResultEvent OnGroupsRemoveGroupInvitationResultEvent; + public event PlayFabRequestEvent OnGroupsRemoveMembersRequestEvent; + public event PlayFabResultEvent OnGroupsRemoveMembersResultEvent; + public event PlayFabRequestEvent OnGroupsUnblockEntityRequestEvent; + public event PlayFabResultEvent OnGroupsUnblockEntityResultEvent; + public event PlayFabRequestEvent OnGroupsUpdateGroupRequestEvent; + public event PlayFabResultEvent OnGroupsUpdateGroupResultEvent; + public event PlayFabRequestEvent OnGroupsUpdateRoleRequestEvent; + public event PlayFabResultEvent OnGroupsUpdateRoleResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta new file mode 100644 index 00000000..5d2b754c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 89aad6173ff54ed4092f14bd118f0652 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs new file mode 100644 index 00000000..82465f0d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs @@ -0,0 +1,366 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.GroupsModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// The Groups API is designed for any permanent or semi-permanent collections of Entities (players, or non-players). If you + /// want to make Guilds/Clans/Corporations/etc., then you should use groups. Groups can also be used to make chatrooms, + /// parties, or any other persistent collection of entities. + /// + public static class PlayFabGroupsAPI + { + static PlayFabGroupsAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Accepts an outstanding invitation to to join a group + /// + public static void AcceptGroupApplication(AcceptGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/AcceptGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Accepts an invitation to join a group + /// + public static void AcceptGroupInvitation(AcceptGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/AcceptGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds members to a group or role. + /// + public static void AddMembers(AddMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/AddMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Applies to join a group + /// + public static void ApplyToGroup(ApplyToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ApplyToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Blocks a list of entities from joining a group. + /// + public static void BlockEntity(BlockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/BlockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Changes the role membership of a list of entities from one role to another. + /// + public static void ChangeMemberRole(ChangeMemberRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ChangeMemberRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new group. + /// + public static void CreateGroup(CreateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/CreateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a new group role. + /// + public static void CreateRole(CreateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/CreateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a group and all roles, invitations, join requests, and blocks associated with it. + /// + public static void DeleteGroup(DeleteGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/DeleteGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes an existing role in a group. + /// + public static void DeleteRole(DeleteRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/DeleteRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets information about a group and its roles + /// + public static void GetGroup(GetGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/GetGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Invites a player to join a group + /// + public static void InviteToGroup(InviteToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/InviteToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Checks to see if an entity is a member of a group or role within the group + /// + public static void IsMember(IsMemberRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/IsMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all outstanding requests to join a group + /// + public static void ListGroupApplications(ListGroupApplicationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupApplications", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all entities blocked from joining a group + /// + public static void ListGroupBlocks(ListGroupBlocksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupBlocks", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all outstanding invitations for a group + /// + public static void ListGroupInvitations(ListGroupInvitationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupInvitations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all members for a group + /// + public static void ListGroupMembers(ListGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListGroupMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all groups and roles for an entity + /// + public static void ListMembership(ListMembershipRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListMembership", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all outstanding invitations and group applications for an entity + /// + public static void ListMembershipOpportunities(ListMembershipOpportunitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/ListMembershipOpportunities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes an application to join a group + /// + public static void RemoveGroupApplication(RemoveGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/RemoveGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes an invitation join a group + /// + public static void RemoveGroupInvitation(RemoveGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/RemoveGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes members from a group. + /// + public static void RemoveMembers(RemoveMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/RemoveMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unblocks a list of entities from joining a group + /// + public static void UnblockEntity(UnblockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/UnblockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates non-membership data about a group. + /// + public static void UpdateGroup(UpdateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/UpdateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates metadata about a role. + /// + public static void UpdateRole(UpdateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Group/UpdateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta new file mode 100644 index 00000000..c4945c8f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42170e999ab34f549ac03af203959176 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs new file mode 100644 index 00000000..2a6fe0bd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs @@ -0,0 +1,334 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.GroupsModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// The Groups API is designed for any permanent or semi-permanent collections of Entities (players, or non-players). If you + /// want to make Guilds/Clans/Corporations/etc., then you should use groups. Groups can also be used to make chatrooms, + /// parties, or any other persistent collection of entities. + /// + public class PlayFabGroupsInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabGroupsInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabGroupsInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Accepts an outstanding invitation to to join a group + /// + public void AcceptGroupApplication(AcceptGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/AcceptGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Accepts an invitation to join a group + /// + public void AcceptGroupInvitation(AcceptGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/AcceptGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds members to a group or role. + /// + public void AddMembers(AddMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/AddMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Applies to join a group + /// + public void ApplyToGroup(ApplyToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ApplyToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Blocks a list of entities from joining a group. + /// + public void BlockEntity(BlockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/BlockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Changes the role membership of a list of entities from one role to another. + /// + public void ChangeMemberRole(ChangeMemberRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ChangeMemberRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new group. + /// + public void CreateGroup(CreateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/CreateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a new group role. + /// + public void CreateRole(CreateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/CreateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a group and all roles, invitations, join requests, and blocks associated with it. + /// + public void DeleteGroup(DeleteGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/DeleteGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes an existing role in a group. + /// + public void DeleteRole(DeleteRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/DeleteRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets information about a group and its roles + /// + public void GetGroup(GetGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/GetGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Invites a player to join a group + /// + public void InviteToGroup(InviteToGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/InviteToGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Checks to see if an entity is a member of a group or role within the group + /// + public void IsMember(IsMemberRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/IsMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all outstanding requests to join a group + /// + public void ListGroupApplications(ListGroupApplicationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupApplications", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all entities blocked from joining a group + /// + public void ListGroupBlocks(ListGroupBlocksRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupBlocks", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all outstanding invitations for a group + /// + public void ListGroupInvitations(ListGroupInvitationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupInvitations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all members for a group + /// + public void ListGroupMembers(ListGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListGroupMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all groups and roles for an entity + /// + public void ListMembership(ListMembershipRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListMembership", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all outstanding invitations and group applications for an entity + /// + public void ListMembershipOpportunities(ListMembershipOpportunitiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/ListMembershipOpportunities", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes an application to join a group + /// + public void RemoveGroupApplication(RemoveGroupApplicationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/RemoveGroupApplication", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes an invitation join a group + /// + public void RemoveGroupInvitation(RemoveGroupInvitationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/RemoveGroupInvitation", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes members from a group. + /// + public void RemoveMembers(RemoveMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/RemoveMembers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unblocks a list of entities from joining a group + /// + public void UnblockEntity(UnblockEntityRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/UnblockEntity", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates non-membership data about a group. + /// + public void UpdateGroup(UpdateGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/UpdateGroup", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates metadata about a role. + /// + public void UpdateRole(UpdateGroupRoleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Group/UpdateRole", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta new file mode 100644 index 00000000..2de4310f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e14b336d534f60f4e911c8db52e74a86 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs new file mode 100644 index 00000000..e2ce9b30 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs @@ -0,0 +1,985 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.GroupsModels +{ + /// + /// Accepts an outstanding invitation to to join a group if the invited entity is not blocked by the group. Nothing is + /// returned in the case of success. + /// + [Serializable] + public class AcceptGroupApplicationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Type of the entity to accept as. Must be the same entity as the claimant or an entity that is a child of the claimant + /// entity. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Accepts an outstanding invitation to join the group if the invited entity is not blocked by the group. Only the invited + /// entity or a parent in its chain (e.g. title) may accept the invitation on the invited entity's behalf. Nothing is + /// returned in the case of success. + /// + [Serializable] + public class AcceptGroupInvitationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Adds members to a group or role. Existing members of the group will added to roles within the group, but if the user is + /// not already a member of the group, only title claimants may add them to the group, and others must use the group + /// application or invite system to add new members to a group. Returns nothing if successful. + /// + [Serializable] + public class AddMembersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// List of entities to add to the group. Only entities of type title_player_account and character may be added to groups. + /// + public List Members; + /// + /// Optional: The ID of the existing role to add the entities to. If this is not specified, the default member role for the + /// group will be used. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + } + + /// + /// Creates an application to join a group. Calling this while a group application already exists will return the same + /// application instead of an error and will not refresh the time before the application expires. By default, if the entity + /// has an invitation to join the group outstanding, this will accept the invitation to join the group instead and return an + /// error indicating such, rather than creating a duplicate application to join that will need to be cleaned up later. + /// Returns information about the application or an error indicating an invitation was accepted instead. + /// + [Serializable] + public class ApplyToGroupRequest : PlayFabRequestCommon + { + /// + /// Optional, default true. Automatically accept an outstanding invitation if one exists instead of creating an application + /// + public bool? AutoAcceptOutstandingInvite; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Describes an application to join a group + /// + [Serializable] + public class ApplyToGroupResponse : PlayFabResultCommon + { + /// + /// Type of entity that requested membership + /// + public EntityWithLineage Entity; + /// + /// When the application to join will expire and be deleted + /// + public DateTime Expires; + /// + /// ID of the group that the entity requesting membership to + /// + public EntityKey Group; + } + + /// + /// Blocks a list of entities from joining a group. Blocked entities may not create new applications to join, be invited to + /// join, accept an invitation, or have an application accepted. Failure due to being blocked does not clean up existing + /// applications or invitations to the group. No data is returned in the case of success. + /// + [Serializable] + public class BlockEntityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Changes the role membership of a list of entities from one role to another in in a single operation. The destination + /// role must already exist. This is equivalent to adding the entities to the destination role and removing from the origin + /// role. Returns nothing if successful. + /// + [Serializable] + public class ChangeMemberRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The ID of the role that the entities will become a member of. This must be an existing role. Role IDs must be between 1 + /// and 64 characters long. + /// + public string DestinationRoleId; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// List of entities to move between roles in the group. All entities in this list must be members of the group and origin + /// role. + /// + public List Members; + /// + /// The ID of the role that the entities currently are a member of. Role IDs must be between 1 and 64 characters long. + /// + public string OriginRoleId; + } + + /// + /// Creates a new group, as well as administration and member roles, based off of a title's group template. Returns + /// information about the group that was created. + /// + [Serializable] + public class CreateGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The name of the group. This is unique at the title level by default. + /// + public string GroupName; + } + + [Serializable] + public class CreateGroupResponse : PlayFabResultCommon + { + /// + /// The ID of the administrator role for the group. + /// + public string AdminRoleId; + /// + /// The server date and time the group was created. + /// + public DateTime Created; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The name of the group. + /// + public string GroupName; + /// + /// The ID of the default member role for the group. + /// + public string MemberRoleId; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// The list of roles and names that belong to the group. + /// + public Dictionary Roles; + } + + /// + /// Creates a new role within an existing group, with no members. Both the role ID and role name must be unique within the + /// group, but the name can be the same as the ID. The role ID is set at creation and cannot be changed. Returns information + /// about the role that was created. + /// + [Serializable] + public class CreateGroupRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The ID of the role. This must be unique within the group and cannot be changed. Role IDs must be between 1 and 64 + /// characters long and are restricted to a-Z, A-Z, 0-9, '(', ')', '_', '-' and '.'. + /// + public string RoleId; + /// + /// The name of the role. This must be unique within the group and can be changed later. Role names must be between 1 and + /// 100 characters long + /// + public string RoleName; + } + + [Serializable] + public class CreateGroupRoleResponse : PlayFabResultCommon + { + /// + /// The current version of the group profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// ID for the role + /// + public string RoleId; + /// + /// The name of the role + /// + public string RoleName; + } + + /// + /// Deletes a group and all roles, invitations, join requests, and blocks associated with it. Permission to delete is only + /// required the group itself to execute this action. The group and data cannot be cannot be recovered once removed, but any + /// abuse reports about the group will remain. No data is returned in the case of success. + /// + [Serializable] + public class DeleteGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ID of the group or role to remove + /// + public EntityKey Group; + } + + /// + /// Returns information about the role + /// + [Serializable] + public class DeleteRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The ID of the role to delete. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityMemberRole : PlayFabBaseModel + { + /// + /// The list of members in the role + /// + public List Members; + /// + /// The ID of the role. + /// + public string RoleId; + /// + /// The name of the role + /// + public string RoleName; + } + + /// + /// Entity wrapper class that contains the entity key and the entities that make up the lineage of the entity. + /// + [Serializable] + public class EntityWithLineage : PlayFabBaseModel + { + /// + /// The entity key for the specified entity + /// + public EntityKey Key; + /// + /// Dictionary of entity keys for related entities. Dictionary key is entity type. + /// + public Dictionary Lineage; + } + + /// + /// Returns the ID, name, role list and other non-membership related information about a group. + /// + [Serializable] + public class GetGroupRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The full name of the group + /// + public string GroupName; + } + + [Serializable] + public class GetGroupResponse : PlayFabResultCommon + { + /// + /// The ID of the administrator role for the group. + /// + public string AdminRoleId; + /// + /// The server date and time the group was created. + /// + public DateTime Created; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// The name of the group. + /// + public string GroupName; + /// + /// The ID of the default member role for the group. + /// + public string MemberRoleId; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// The list of roles and names that belong to the group. + /// + public Dictionary Roles; + } + + /// + /// Describes an application to join a group + /// + [Serializable] + public class GroupApplication : PlayFabBaseModel + { + /// + /// Type of entity that requested membership + /// + public EntityWithLineage Entity; + /// + /// When the application to join will expire and be deleted + /// + public DateTime Expires; + /// + /// ID of the group that the entity requesting membership to + /// + public EntityKey Group; + } + + /// + /// Describes an entity that is blocked from joining a group. + /// + [Serializable] + public class GroupBlock : PlayFabBaseModel + { + /// + /// The entity that is blocked + /// + public EntityWithLineage Entity; + /// + /// ID of the group that the entity is blocked from + /// + public EntityKey Group; + } + + /// + /// Describes an invitation to a group. + /// + [Serializable] + public class GroupInvitation : PlayFabBaseModel + { + /// + /// When the invitation will expire and be deleted + /// + public DateTime Expires; + /// + /// The group that the entity invited to + /// + public EntityKey Group; + /// + /// The entity that created the invitation + /// + public EntityWithLineage InvitedByEntity; + /// + /// The entity that is invited + /// + public EntityWithLineage InvitedEntity; + /// + /// ID of the role in the group to assign the user to. + /// + public string RoleId; + } + + /// + /// Describes a group role + /// + [Serializable] + public class GroupRole : PlayFabBaseModel + { + /// + /// ID for the role + /// + public string RoleId; + /// + /// The name of the role + /// + public string RoleName; + } + + /// + /// Describes a group and the roles that it contains + /// + [Serializable] + public class GroupWithRoles : PlayFabBaseModel + { + /// + /// ID for the group + /// + public EntityKey Group; + /// + /// The name of the group + /// + public string GroupName; + /// + /// The current version of the profile, can be used for concurrency control during updates. + /// + public int ProfileVersion; + /// + /// The list of roles within the group + /// + public List Roles; + } + + /// + /// Invites a player to join a group, if they are not blocked by the group. An optional role can be provided to + /// automatically assign the player to the role if they accept the invitation. By default, if the entity has an application + /// to the group outstanding, this will accept the application instead and return an error indicating such, rather than + /// creating a duplicate invitation to join that will need to be cleaned up later. Returns information about the new + /// invitation or an error indicating an existing application to join was accepted. + /// + [Serializable] + public class InviteToGroupRequest : PlayFabRequestCommon + { + /// + /// Optional, default true. Automatically accept an application if one exists instead of creating an invitation + /// + public bool? AutoAcceptOutstandingApplication; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// Optional. ID of an existing a role in the group to assign the user to. The group's default member role is used if this + /// is not specified. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + } + + /// + /// Describes an invitation to a group. + /// + [Serializable] + public class InviteToGroupResponse : PlayFabResultCommon + { + /// + /// When the invitation will expire and be deleted + /// + public DateTime Expires; + /// + /// The group that the entity invited to + /// + public EntityKey Group; + /// + /// The entity that created the invitation + /// + public EntityWithLineage InvitedByEntity; + /// + /// The entity that is invited + /// + public EntityWithLineage InvitedEntity; + /// + /// ID of the role in the group to assign the user to. + /// + public string RoleId; + } + + /// + /// Checks to see if an entity is a member of a group or role within the group. A result indicating if the entity is a + /// member of the group is returned, or a permission error if the caller does not have permission to read the group's member + /// list. + /// + [Serializable] + public class IsMemberRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// Optional: ID of the role to check membership of. Defaults to any role (that is, check to see if the entity is a member + /// of the group in any capacity) if not specified. + /// + public string RoleId; + } + + [Serializable] + public class IsMemberResponse : PlayFabResultCommon + { + /// + /// A value indicating whether or not the entity is a member. + /// + public bool IsMember; + } + + /// + /// Lists all outstanding requests to join a group. Returns a list of all requests to join, as well as when the request will + /// expire. To get the group applications for a specific entity, use ListMembershipOpportunities. + /// + [Serializable] + public class ListGroupApplicationsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupApplicationsResponse : PlayFabResultCommon + { + /// + /// The requested list of applications to the group. + /// + public List Applications; + } + + /// + /// Lists all entities blocked from joining a group. A list of blocked entities is returned + /// + [Serializable] + public class ListGroupBlocksRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupBlocksResponse : PlayFabResultCommon + { + /// + /// The requested list blocked entities. + /// + public List BlockedEntities; + } + + /// + /// Lists all outstanding invitations for a group. Returns a list of entities that have been invited, as well as when the + /// invitation will expire. To get the group invitations for a specific entity, use ListMembershipOpportunities. + /// + [Serializable] + public class ListGroupInvitationsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupInvitationsResponse : PlayFabResultCommon + { + /// + /// The requested list of group invitations. + /// + public List Invitations; + } + + /// + /// Gets a list of members and the roles they belong to within the group. If the caller does not have permission to view the + /// role, and the member is in no other role, the member is not displayed. Returns a list of entities that are members of + /// the group. + /// + [Serializable] + public class ListGroupMembersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ID of the group to list the members and roles for + /// + public EntityKey Group; + } + + [Serializable] + public class ListGroupMembersResponse : PlayFabResultCommon + { + /// + /// The requested list of roles and member entity IDs. + /// + public List Members; + } + + /// + /// Lists all outstanding group applications and invitations for an entity. Anyone may call this for any entity, but data + /// will only be returned for the entity or a parent of that entity. To list invitations or applications for a group to + /// check if a player is trying to join, use ListGroupInvitations and ListGroupApplications. + /// + [Serializable] + public class ListMembershipOpportunitiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class ListMembershipOpportunitiesResponse : PlayFabResultCommon + { + /// + /// The requested list of group applications. + /// + public List Applications; + /// + /// The requested list of group invitations. + /// + public List Invitations; + } + + /// + /// Lists the groups and roles that an entity is a part of, checking to see if group and role metadata and memberships + /// should be visible to the caller. If the entity is not in any roles that are visible to the caller, the group is not + /// returned in the results, even if the caller otherwise has permission to see that the entity is a member of that group. + /// + [Serializable] + public class ListMembershipRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class ListMembershipResponse : PlayFabResultCommon + { + /// + /// The list of groups + /// + public List Groups; + } + + public enum OperationTypes + { + Created, + Updated, + Deleted, + None + } + + /// + /// Removes an existing application to join the group. This is used for both rejection of an application as well as + /// withdrawing an application. The applying entity or a parent in its chain (e.g. title) may withdraw the application, and + /// any caller with appropriate access in the group may reject an application. No data is returned in the case of success. + /// + [Serializable] + public class RemoveGroupApplicationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Removes an existing invitation to join the group. This is used for both rejection of an invitation as well as rescinding + /// an invitation. The invited entity or a parent in its chain (e.g. title) may reject the invitation by calling this + /// method, and any caller with appropriate access in the group may rescind an invitation. No data is returned in the case + /// of success. + /// + [Serializable] + public class RemoveGroupInvitationRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Removes members from a group. A member can always remove themselves from a group, regardless of permissions. Returns + /// nothing if successful. + /// + [Serializable] + public class RemoveMembersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// List of entities to remove + /// + public List Members; + /// + /// The ID of the role to remove the entities from. + /// + public string RoleId; + } + + /// + /// Unblocks a list of entities from joining a group. No data is returned in the case of success. + /// + [Serializable] + public class UnblockEntityRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The identifier of the group + /// + public EntityKey Group; + } + + /// + /// Updates data about a group, such as the name or default member role. Returns information about whether the update was + /// successful. Only title claimants may modify the administration role for a group. + /// + [Serializable] + public class UpdateGroupRequest : PlayFabRequestCommon + { + /// + /// Optional: the ID of an existing role to set as the new administrator role for the group + /// + public string AdminRoleId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional field used for concurrency control. By specifying the previously returned value of ProfileVersion from the + /// GetGroup API, you can ensure that the group data update will only be performed if the group has not been updated by any + /// other clients since the version you last loaded. + /// + public int? ExpectedProfileVersion; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// Optional: the new name of the group + /// + public string GroupName; + /// + /// Optional: the ID of an existing role to set as the new member role for the group + /// + public string MemberRoleId; + } + + [Serializable] + public class UpdateGroupResponse : PlayFabResultCommon + { + /// + /// Optional reason to explain why the operation was the result that it was. + /// + public string OperationReason; + /// + /// New version of the group data. + /// + public int ProfileVersion; + /// + /// Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + public OperationTypes? SetResult; + } + + /// + /// Updates the role name. Returns information about whether the update was successful. + /// + [Serializable] + public class UpdateGroupRoleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional field used for concurrency control. By specifying the previously returned value of ProfileVersion from the + /// GetGroup API, you can ensure that the group data update will only be performed if the group has not been updated by any + /// other clients since the version you last loaded. + /// + public int? ExpectedProfileVersion; + /// + /// The identifier of the group + /// + public EntityKey Group; + /// + /// ID of the role to update. Role IDs must be between 1 and 64 characters long. + /// + public string RoleId; + /// + /// The new name of the role + /// + public string RoleName; + } + + [Serializable] + public class UpdateGroupRoleResponse : PlayFabResultCommon + { + /// + /// Optional reason to explain why the operation was the result that it was. + /// + public string OperationReason; + /// + /// New version of the role data. + /// + public int ProfileVersion; + /// + /// Indicates which operation was completed, either Created, Updated, Deleted or None. + /// + public OperationTypes? SetResult; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta new file mode 100644 index 00000000..c093d751 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Groups/PlayFabGroupsModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d73f86b427d81044bb2417ea3b5b03ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights.meta new file mode 100644 index 00000000..10264c52 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9e9ed76149c97e14c85789225c8c3971 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs new file mode 100644 index 00000000..b07d1a5c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs @@ -0,0 +1,22 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.InsightsModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnInsightsGetDetailsRequestEvent; + public event PlayFabResultEvent OnInsightsGetDetailsResultEvent; + public event PlayFabRequestEvent OnInsightsGetLimitsRequestEvent; + public event PlayFabResultEvent OnInsightsGetLimitsResultEvent; + public event PlayFabRequestEvent OnInsightsGetOperationStatusRequestEvent; + public event PlayFabResultEvent OnInsightsGetOperationStatusResultEvent; + public event PlayFabRequestEvent OnInsightsGetPendingOperationsRequestEvent; + public event PlayFabResultEvent OnInsightsGetPendingOperationsResultEvent; + public event PlayFabRequestEvent OnInsightsSetPerformanceRequestEvent; + public event PlayFabResultEvent OnInsightsSetPerformanceResultEvent; + public event PlayFabRequestEvent OnInsightsSetStorageRetentionRequestEvent; + public event PlayFabResultEvent OnInsightsSetStorageRetentionResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta new file mode 100644 index 00000000..a7bdce18 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f37defb20913be94a8d7b0e4ed5b97cf +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs new file mode 100644 index 00000000..b67e3883 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs @@ -0,0 +1,119 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.InsightsModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Manage the Insights performance level and data storage retention settings. + /// + public static class PlayFabInsightsAPI + { + static PlayFabInsightsAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Gets the current values for the Insights performance and data storage retention, list of pending operations, and the + /// performance and data storage retention limits. + /// + public static void GetDetails(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the range of allowed values for performance and data storage retention values as well as the submeter details + /// for each performance level. + /// + public static void GetLimits(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetLimits", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the status of a SetPerformance or SetStorageRetention operation. + /// + public static void GetOperationStatus(InsightsGetOperationStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetOperationStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a list of pending SetPerformance and/or SetStorageRetention operations for the title. + /// + public static void GetPendingOperations(InsightsGetPendingOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/GetPendingOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the Insights performance level value for the title. + /// + public static void SetPerformance(InsightsSetPerformanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/SetPerformance", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the Insights data storage retention days value for the title. + /// + public static void SetStorageRetention(InsightsSetStorageRetentionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Insights/SetStorageRetention", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta new file mode 100644 index 00000000..51bd4edb --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 711d5cb10af3bcf44b9a605a7e7c03e3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs new file mode 100644 index 00000000..5a6c4200 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs @@ -0,0 +1,125 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.InsightsModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Manage the Insights performance level and data storage retention settings. + /// + public class PlayFabInsightsInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabInsightsInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabInsightsInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Gets the current values for the Insights performance and data storage retention, list of pending operations, and the + /// performance and data storage retention limits. + /// + public void GetDetails(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the range of allowed values for performance and data storage retention values as well as the submeter details + /// for each performance level. + /// + public void GetLimits(InsightsEmptyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetLimits", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the status of a SetPerformance or SetStorageRetention operation. + /// + public void GetOperationStatus(InsightsGetOperationStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetOperationStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a list of pending SetPerformance and/or SetStorageRetention operations for the title. + /// + public void GetPendingOperations(InsightsGetPendingOperationsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/GetPendingOperations", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the Insights performance level value for the title. + /// + public void SetPerformance(InsightsSetPerformanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/SetPerformance", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the Insights data storage retention days value for the title. + /// + public void SetStorageRetention(InsightsSetStorageRetentionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Insights/SetStorageRetention", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta new file mode 100644 index 00000000..3007153c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c2e7ee83796bb834cbd6263a7a6d65ca +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs new file mode 100644 index 00000000..fbfd2d62 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs @@ -0,0 +1,235 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.InsightsModels +{ + [Serializable] + public class InsightsEmptyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class InsightsGetDetailsResponse : PlayFabResultCommon + { + /// + /// Amount of data (in MB) currently used by Insights. + /// + public uint DataUsageMb; + /// + /// Details of any error that occurred while retrieving Insights details. + /// + public string ErrorMessage; + /// + /// Allowed range of values for performance level and data storage retention. + /// + public InsightsGetLimitsResponse Limits; + /// + /// List of pending Insights operations for the title. + /// + public List PendingOperations; + /// + /// Current Insights performance level setting. + /// + public int PerformanceLevel; + /// + /// Current Insights data storage retention value in days. + /// + public int RetentionDays; + } + + [Serializable] + public class InsightsGetLimitsResponse : PlayFabResultCommon + { + /// + /// Default Insights performance level. + /// + public int DefaultPerformanceLevel; + /// + /// Default Insights data storage retention days. + /// + public int DefaultStorageRetentionDays; + /// + /// Maximum allowed data storage retention days. + /// + public int StorageMaxRetentionDays; + /// + /// Minimum allowed data storage retention days. + /// + public int StorageMinRetentionDays; + /// + /// List of Insights submeter limits for the allowed performance levels. + /// + public List SubMeters; + } + + /// + /// Returns the current status for the requested operation id. + /// + [Serializable] + public class InsightsGetOperationStatusRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the Insights operation. + /// + public string OperationId; + } + + [Serializable] + public class InsightsGetOperationStatusResponse : PlayFabResultCommon + { + /// + /// Optional message related to the operation details. + /// + public string Message; + /// + /// Time the operation was completed. + /// + public DateTime OperationCompletedTime; + /// + /// Id of the Insights operation. + /// + public string OperationId; + /// + /// Time the operation status was last updated. + /// + public DateTime OperationLastUpdated; + /// + /// Time the operation started. + /// + public DateTime OperationStartedTime; + /// + /// The type of operation, SetPerformance or SetStorageRetention. + /// + public string OperationType; + /// + /// The value requested for the operation. + /// + public int OperationValue; + /// + /// Current status of the operation. + /// + public string Status; + } + + /// + /// Returns a list of operations that are in the pending state for the requested operation type. + /// + [Serializable] + public class InsightsGetPendingOperationsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The type of pending operations requested, or blank for all operation types. + /// + public string OperationType; + } + + [Serializable] + public class InsightsGetPendingOperationsResponse : PlayFabResultCommon + { + /// + /// List of pending Insights operations. + /// + public List PendingOperations; + } + + [Serializable] + public class InsightsOperationResponse : PlayFabResultCommon + { + /// + /// Optional message related to the operation details. + /// + public string Message; + /// + /// Id of the Insights operation. + /// + public string OperationId; + /// + /// The type of operation, SetPerformance or SetStorageRetention. + /// + public string OperationType; + } + + [Serializable] + public class InsightsPerformanceLevel : PlayFabBaseModel + { + /// + /// Number of allowed active event exports. + /// + public int ActiveEventExports; + /// + /// Maximum cache size. + /// + public int CacheSizeMB; + /// + /// Maximum number of concurrent queries. + /// + public int Concurrency; + /// + /// Number of Insights credits consumed per minute. + /// + public double CreditsPerMinute; + /// + /// Maximum events per second. + /// + public int EventsPerSecond; + /// + /// Performance level. + /// + public int Level; + /// + /// Maximum amount of memory allowed per query. + /// + public int MaxMemoryPerQueryMB; + /// + /// Amount of compute power allocated for queries and operations. + /// + public int VirtualCpuCores; + } + + /// + /// Sets the performance level to the requested value. Use the GetLimits method to get the allowed values. + /// + [Serializable] + public class InsightsSetPerformanceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Insights performance level to apply to the title. + /// + public int PerformanceLevel; + } + + /// + /// Sets the data storage retention to the requested value. Use the GetLimits method to get the range of allowed values. + /// + [Serializable] + public class InsightsSetStorageRetentionRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Insights data storage retention value (in days) to apply to the title. + /// + public int RetentionDays; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta new file mode 100644 index 00000000..ab052d03 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Insights/PlayFabInsightsModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0018df8cb03ec3a498320c2be74427e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization.meta new file mode 100644 index 00000000..7afe09a1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 36cb4effc7537d94294cbcd603c399af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs new file mode 100644 index 00000000..02a262eb --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs @@ -0,0 +1,12 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.LocalizationModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnLocalizationGetLanguageListRequestEvent; + public event PlayFabResultEvent OnLocalizationGetLanguageListResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta new file mode 100644 index 00000000..0edb54ce --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1c3bd18b65a5d8d4eb83e5ef98114e4d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs new file mode 100644 index 00000000..d16787fe --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs @@ -0,0 +1,52 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.LocalizationModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// The Localization APIs give you the tools needed to manage language setup in your title. + /// + public static class PlayFabLocalizationAPI + { + static PlayFabLocalizationAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Retrieves the list of allowed languages, only accessible by title entities + /// + public static void GetLanguageList(GetLanguageListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Locale/GetLanguageList", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta new file mode 100644 index 00000000..997fea20 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca10b96ef3ce52644a989907c77d047f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs new file mode 100644 index 00000000..8797cfc7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs @@ -0,0 +1,68 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.LocalizationModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// The Localization APIs give you the tools needed to manage language setup in your title. + /// + public class PlayFabLocalizationInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabLocalizationInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabLocalizationInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Retrieves the list of allowed languages, only accessible by title entities + /// + public void GetLanguageList(GetLanguageListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Locale/GetLanguageList", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta new file mode 100644 index 00000000..ab52fccc --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0e3a59c48c3c6fb45a9d83845b225dde +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs new file mode 100644 index 00000000..49d2d475 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs @@ -0,0 +1,26 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.LocalizationModels +{ + [Serializable] + public class GetLanguageListRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetLanguageListResponse : PlayFabResultCommon + { + /// + /// The list of allowed languages, in BCP47 two-letter format + /// + public List LanguageList; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta new file mode 100644 index 00000000..0e2da1e1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Localization/PlayFabLocalizationModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 772d6350724839b498944cab1b377fb5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker.meta new file mode 100644 index 00000000..143b4fea --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 8a412908d5a194e469d8ca0be97748d7 +folderAsset: yes +timeCreated: 1468524875 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs new file mode 100644 index 00000000..9248067c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs @@ -0,0 +1,18 @@ +#if ENABLE_PLAYFABSERVER_API +using PlayFab.MatchmakerModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnMatchmakerAuthUserRequestEvent; + public event PlayFabResultEvent OnMatchmakerAuthUserResultEvent; + public event PlayFabRequestEvent OnMatchmakerPlayerJoinedRequestEvent; + public event PlayFabResultEvent OnMatchmakerPlayerJoinedResultEvent; + public event PlayFabRequestEvent OnMatchmakerPlayerLeftRequestEvent; + public event PlayFabResultEvent OnMatchmakerPlayerLeftResultEvent; + public event PlayFabRequestEvent OnMatchmakerUserInfoRequestEvent; + public event PlayFabResultEvent OnMatchmakerUserInfoResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta new file mode 100644 index 00000000..e3a3343c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1055058934189914bac79666a289e9fd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs new file mode 100644 index 00000000..6265d304 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs @@ -0,0 +1,88 @@ +#if ENABLE_PLAYFABSERVER_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.MatchmakerModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Enables the use of an external match-making service in conjunction with PlayFab hosted Game Server instances + /// + public static class PlayFabMatchmakerAPI + { + static PlayFabMatchmakerAPI() {} + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Validates a user with the PlayFab service + /// + [Obsolete("No longer available", true)] + public static void AuthUser(AuthUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/AuthUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has joined the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public static void PlayerJoined(PlayerJoinedRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerJoined", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has left the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public static void PlayerLeft(PlayerLeftRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerLeft", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the relevant details for a specified user, which the external match-making service can then use to compute + /// effective matches + /// + [Obsolete("No longer available", true)] + public static void UserInfo(UserInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Matchmaker/UserInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta new file mode 100644 index 00000000..e6f48d33 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c712eeedbc85dfa4c80d30f8a2ed6cd9 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs new file mode 100644 index 00000000..b16f710d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs @@ -0,0 +1,98 @@ +#if ENABLE_PLAYFABSERVER_API + +using System; +using System.Collections.Generic; +using PlayFab.MatchmakerModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Enables the use of an external match-making service in conjunction with PlayFab hosted Game Server instances + /// + public class PlayFabMatchmakerInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabMatchmakerInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabMatchmakerInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Validates a user with the PlayFab service + /// + [Obsolete("No longer available", true)] + public void AuthUser(AuthUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/AuthUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has joined the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public void PlayerJoined(PlayerJoinedRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerJoined", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Informs the PlayFab game server hosting service that the indicated user has left the Game Server Instance specified + /// + [Obsolete("No longer available", true)] + public void PlayerLeft(PlayerLeftRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/PlayerLeft", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the relevant details for a specified user, which the external match-making service can then use to compute + /// effective matches + /// + [Obsolete("No longer available", true)] + public void UserInfo(UserInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Matchmaker/UserInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta new file mode 100644 index 00000000..cb8059c9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 77057761a62cdb648960d924f1b322af +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs new file mode 100644 index 00000000..ed6a7e22 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs @@ -0,0 +1,229 @@ +#if ENABLE_PLAYFABSERVER_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.MatchmakerModels +{ + /// + /// This API allows the external match-making service to confirm that the user has a valid Session Ticket for the title, in + /// order to securely enable match-making. The client passes the user's Session Ticket to the external match-making service, + /// which then passes the Session Ticket in as the AuthorizationTicket in this call. + /// + [Serializable] + public class AuthUserRequest : PlayFabRequestCommon + { + /// + /// Session Ticket provided by the client. + /// + public string AuthorizationTicket; + } + + [Serializable] + public class AuthUserResponse : PlayFabResultCommon + { + /// + /// Boolean indicating if the user has been authorized to use the external match-making service. + /// + public bool Authorized; + /// + /// PlayFab unique identifier of the account that has been authorized. + /// + public string PlayFabId; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class PlayerJoinedRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the Game Server Instance the user is joining. This must be a Game Server Instance started with the + /// Matchmaker/StartGame API. + /// + public string LobbyId; + /// + /// PlayFab unique identifier for the player joining. + /// + public string PlayFabId; + } + + [Serializable] + public class PlayerJoinedResponse : PlayFabResultCommon + { + } + + [Serializable] + public class PlayerLeftRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the Game Server Instance the user is leaving. This must be a Game Server Instance started with the + /// Matchmaker/StartGame API. + /// + public string LobbyId; + /// + /// PlayFab unique identifier for the player leaving. + /// + public string PlayFabId; + } + + [Serializable] + public class PlayerLeftResponse : PlayFabResultCommon + { + } + + [Serializable] + public class UserInfoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Minimum catalog version for which data is requested (filters the results to only contain inventory items which have a + /// catalog version of this or higher). + /// + public int MinCatalogVersion; + /// + /// PlayFab unique identifier of the user whose information is being requested. + /// + public string PlayFabId; + } + + [Serializable] + public class UserInfoResponse : PlayFabResultCommon + { + /// + /// Array of inventory items in the user's current inventory. + /// + public List Inventory; + /// + /// Boolean indicating whether the user is a developer. + /// + public bool IsDeveloper; + /// + /// PlayFab unique identifier of the user whose information was requested. + /// + public string PlayFabId; + /// + /// Steam unique identifier, if the user has an associated Steam account. + /// + public string SteamId; + /// + /// Title specific display name, if set. + /// + public string TitleDisplayName; + /// + /// PlayFab unique user name. + /// + public string Username; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta new file mode 100644 index 00000000..ca305967 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Matchmaker/PlayFabMatchmakerModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: c7c60a1006c1e64499804ca82b2412ed +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer.meta new file mode 100644 index 00000000..d9a8414e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e40ecd498354adc4d835280bde786361 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs new file mode 100644 index 00000000..6ee4c2a1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs @@ -0,0 +1,170 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.MultiplayerModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCancelMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCancelServerBackfillTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCancelServerBackfillTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildWithCustomContainerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildWithCustomContainerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildWithManagedContainerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildWithManagedContainerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateBuildWithProcessBasedServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateRemoteUserRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateRemoteUserResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateServerBackfillTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateServerBackfillTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateServerMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateServerMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent; + public event PlayFabResultEvent OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteAssetRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteAssetResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteBuildRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteBuildResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteBuildRegionRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteBuildRegionResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteCertificateRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteCertificateResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteContainerImageRepositoryRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteContainerImageRepositoryResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerDeleteRemoteUserRequestEvent; + public event PlayFabResultEvent OnMultiplayerDeleteRemoteUserResultEvent; + public event PlayFabRequestEvent OnMultiplayerEnableMultiplayerServersForTitleRequestEvent; + public event PlayFabResultEvent OnMultiplayerEnableMultiplayerServersForTitleResultEvent; + public event PlayFabRequestEvent OnMultiplayerFindFriendLobbiesRequestEvent; + public event PlayFabResultEvent OnMultiplayerFindFriendLobbiesResultEvent; + public event PlayFabRequestEvent OnMultiplayerFindLobbiesRequestEvent; + public event PlayFabResultEvent OnMultiplayerFindLobbiesResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetAssetDownloadUrlRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetAssetDownloadUrlResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetAssetUploadUrlRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetAssetUploadUrlResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetBuildRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetBuildResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetContainerRegistryCredentialsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetContainerRegistryCredentialsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMatchRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMatchResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMatchmakingQueueRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMatchmakingQueueResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMultiplayerServerDetailsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMultiplayerServerDetailsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMultiplayerServerLogsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMultiplayerServerLogsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetQueueStatisticsRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetQueueStatisticsResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetRemoteLoginEndpointRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetRemoteLoginEndpointResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetServerBackfillTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetServerBackfillTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent; + public event PlayFabRequestEvent OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent; + public event PlayFabResultEvent OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent; + public event PlayFabRequestEvent OnMultiplayerInviteToLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerInviteToLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerJoinArrangedLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerJoinArrangedLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerJoinLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerJoinLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerJoinMatchmakingTicketRequestEvent; + public event PlayFabResultEvent OnMultiplayerJoinMatchmakingTicketResultEvent; + public event PlayFabRequestEvent OnMultiplayerLeaveLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerLeaveLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerListArchivedMultiplayerServersRequestEvent; + public event PlayFabResultEvent OnMultiplayerListArchivedMultiplayerServersResultEvent; + public event PlayFabRequestEvent OnMultiplayerListAssetSummariesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListAssetSummariesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListBuildAliasesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListBuildAliasesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListBuildSummariesV2RequestEvent; + public event PlayFabResultEvent OnMultiplayerListBuildSummariesV2ResultEvent; + public event PlayFabRequestEvent OnMultiplayerListCertificateSummariesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListCertificateSummariesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListContainerImagesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListContainerImagesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListContainerImageTagsRequestEvent; + public event PlayFabResultEvent OnMultiplayerListContainerImageTagsResultEvent; + public event PlayFabRequestEvent OnMultiplayerListMatchmakingQueuesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListMatchmakingQueuesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerListMatchmakingTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerListMultiplayerServersRequestEvent; + public event PlayFabResultEvent OnMultiplayerListMultiplayerServersResultEvent; + public event PlayFabRequestEvent OnMultiplayerListPartyQosServersRequestEvent; + public event PlayFabResultEvent OnMultiplayerListPartyQosServersResultEvent; + public event PlayFabRequestEvent OnMultiplayerListQosServersForTitleRequestEvent; + public event PlayFabResultEvent OnMultiplayerListQosServersForTitleResultEvent; + public event PlayFabRequestEvent OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent; + public event PlayFabResultEvent OnMultiplayerListServerBackfillTicketsForPlayerResultEvent; + public event PlayFabRequestEvent OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent; + public event PlayFabRequestEvent OnMultiplayerListVirtualMachineSummariesRequestEvent; + public event PlayFabResultEvent OnMultiplayerListVirtualMachineSummariesResultEvent; + public event PlayFabRequestEvent OnMultiplayerRemoveMatchmakingQueueRequestEvent; + public event PlayFabResultEvent OnMultiplayerRemoveMatchmakingQueueResultEvent; + public event PlayFabRequestEvent OnMultiplayerRemoveMemberRequestEvent; + public event PlayFabResultEvent OnMultiplayerRemoveMemberResultEvent; + public event PlayFabRequestEvent OnMultiplayerRequestMultiplayerServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerRequestMultiplayerServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent; + public event PlayFabResultEvent OnMultiplayerRolloverContainerRegistryCredentialsResultEvent; + public event PlayFabRequestEvent OnMultiplayerSetMatchmakingQueueRequestEvent; + public event PlayFabResultEvent OnMultiplayerSetMatchmakingQueueResultEvent; + public event PlayFabRequestEvent OnMultiplayerShutdownMultiplayerServerRequestEvent; + public event PlayFabResultEvent OnMultiplayerShutdownMultiplayerServerResultEvent; + public event PlayFabRequestEvent OnMultiplayerSubscribeToLobbyResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerSubscribeToLobbyResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerSubscribeToMatchmakingResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerSubscribeToMatchmakingResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerUnsubscribeFromLobbyResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent; + public event PlayFabResultEvent OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent; + public event PlayFabRequestEvent OnMultiplayerUntagContainerImageRequestEvent; + public event PlayFabResultEvent OnMultiplayerUntagContainerImageResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildAliasRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildAliasResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildNameRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildNameResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildRegionRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildRegionResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateBuildRegionsRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateBuildRegionsResultEvent; + public event PlayFabRequestEvent OnMultiplayerUpdateLobbyRequestEvent; + public event PlayFabResultEvent OnMultiplayerUpdateLobbyResultEvent; + public event PlayFabRequestEvent OnMultiplayerUploadCertificateRequestEvent; + public event PlayFabResultEvent OnMultiplayerUploadCertificateResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta new file mode 100644 index 00000000..90c0c090 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fe16c398171536247a7e4685790d4dac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs new file mode 100644 index 00000000..d4b44320 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs @@ -0,0 +1,1088 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.MultiplayerModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// API methods for managing multiplayer servers. API methods for managing parties. The lobby service helps players group + /// together to play multiplayer games. It is often used as a rendezvous point for players to share connection information. + /// + public static partial class PlayFabMultiplayerAPI + { + static PlayFabMultiplayerAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Cancel all active tickets the player is a member of in a given queue. + /// + public static void CancelAllMatchmakingTicketsForPlayer(CancelAllMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelAllMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancel all active backfill tickets the player is a member of in a given queue. + /// + public static void CancelAllServerBackfillTicketsForPlayer(CancelAllServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelAllServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancel a matchmaking ticket. + /// + public static void CancelMatchmakingTicket(CancelMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Cancel a server backfill ticket. + /// + public static void CancelServerBackfillTicket(CancelServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CancelServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build alias. + /// + public static void CreateBuildAlias(CreateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build with a custom container. + /// + public static void CreateBuildWithCustomContainer(CreateBuildWithCustomContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithCustomContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build with a managed container. + /// + public static void CreateBuildWithManagedContainer(CreateBuildWithManagedContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithManagedContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build with the server running as a process. + /// + public static void CreateBuildWithProcessBasedServer(CreateBuildWithProcessBasedServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithProcessBasedServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a lobby. + /// + public static void CreateLobby(CreateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/CreateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a matchmaking ticket as a client. + /// + public static void CreateMatchmakingTicket(CreateMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CreateMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a remote user to log on to a VM for a multiplayer server build. + /// + public static void CreateRemoteUser(CreateRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a backfill matchmaking ticket as a server. A backfill ticket represents an ongoing game. The matchmaking service + /// automatically starts matching the backfill ticket against other matchmaking tickets. Backfill tickets cannot match with + /// other backfill tickets. + /// + public static void CreateServerBackfillTicket(CreateServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CreateServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Create a matchmaking ticket as a server. The matchmaking service automatically starts matching the ticket against other + /// matchmaking tickets. + /// + public static void CreateServerMatchmakingTicket(CreateServerMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/CreateServerMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a request to change a title's multiplayer server quotas. + /// + public static void CreateTitleMultiplayerServersQuotaChange(CreateTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server game asset for a title. + /// + public static void DeleteAsset(DeleteAssetRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteAsset", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server build. + /// + public static void DeleteBuild(DeleteBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server build alias. + /// + public static void DeleteBuildAlias(DeleteBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a multiplayer server build's region. + /// + public static void DeleteBuildRegion(DeleteBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a multiplayer server game certificate. + /// + public static void DeleteCertificate(DeleteCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a container image repository. + /// + public static void DeleteContainerImageRepository(DeleteContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteContainerImageRepository", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Delete a lobby. + /// + public static void DeleteLobby(DeleteLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/DeleteLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a remote user to log on to a VM for a multiplayer server build. + /// + public static void DeleteRemoteUser(DeleteRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Enables the multiplayer server feature for a title. + /// + public static void EnableMultiplayerServersForTitle(EnableMultiplayerServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/EnableMultiplayerServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Find lobbies which match certain criteria, and which friends are in. + /// + public static void FindFriendLobbies(FindFriendLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/FindFriendLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Find all the lobbies that match certain criteria. + /// + public static void FindLobbies(FindLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/FindLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a URL that can be used to download the specified asset. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public static void GetAssetDownloadUrl(GetAssetDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetDownloadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the URL to upload assets to. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public static void GetAssetUploadUrl(GetAssetUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetUploadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a multiplayer server build. + /// + public static void GetBuild(GetBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a multiplayer server build alias. + /// + public static void GetBuildAlias(GetBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the credentials to the container registry. + /// + public static void GetContainerRegistryCredentials(GetContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a lobby. + /// + public static void GetLobby(GetLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/GetLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a match. + /// + public static void GetMatch(GetMatchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetMatch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. Get a matchmaking queue configuration. + /// + public static void GetMatchmakingQueue(GetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a matchmaking ticket by ticket Id. + /// + public static void GetMatchmakingTicket(GetMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets multiplayer server session details for a build. + /// + public static void GetMultiplayerServerDetails(GetMultiplayerServerDetailsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public static void GetMultiplayerServerLogs(GetMultiplayerServerLogsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerLogs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public static void GetMultiplayerSessionLogsBySessionId(GetMultiplayerSessionLogsBySessionIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerSessionLogsBySessionId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get the statistics for a queue. + /// + public static void GetQueueStatistics(GetQueueStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetQueueStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a remote login endpoint to a VM that is hosting a multiplayer server build. + /// + public static void GetRemoteLoginEndpoint(GetRemoteLoginEndpointRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetRemoteLoginEndpoint", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get a matchmaking backfill ticket by ticket Id. + /// + public static void GetServerBackfillTicket(GetServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/GetServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the status of whether a title is enabled for the multiplayer server feature. + /// + public static void GetTitleEnabledForMultiplayerServersStatus(GetTitleEnabledForMultiplayerServersStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleEnabledForMultiplayerServersStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets a title's server quota change request. + /// + public static void GetTitleMultiplayerServersQuotaChange(GetTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets the quotas for a title in relation to multiplayer servers. + /// + public static void GetTitleMultiplayerServersQuotas(GetTitleMultiplayerServersQuotasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotas", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Send a notification to invite a player to a lobby. + /// + public static void InviteToLobby(InviteToLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/InviteToLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Join an Arranged lobby. + /// + public static void JoinArrangedLobby(JoinArrangedLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/JoinArrangedLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Join a lobby. + /// + public static void JoinLobby(JoinLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/JoinLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Join a matchmaking ticket. + /// + public static void JoinMatchmakingTicket(JoinMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/JoinMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Leave a lobby. + /// + public static void LeaveLobby(LeaveLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/LeaveLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists archived multiplayer server sessions for a build. + /// + public static void ListArchivedMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListArchivedMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists multiplayer server game assets for a title. + /// + public static void ListAssetSummaries(ListAssetSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListAssetSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists details of all build aliases for a title. Accepts tokens for title and if game client access is enabled, allows + /// game client to request list of builds with player entity token. + /// + public static void ListBuildAliases(ListBuildAliasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildAliases", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists summarized details of all multiplayer server builds for a title. Accepts tokens for title and if game client + /// access is enabled, allows game client to request list of builds with player entity token. + /// + public static void ListBuildSummariesV2(ListBuildSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildSummariesV2", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists multiplayer server game certificates for a title. + /// + public static void ListCertificateSummaries(ListCertificateSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListCertificateSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists custom container images for a title. + /// + public static void ListContainerImages(ListContainerImagesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImages", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists the tags for a custom container image. + /// + public static void ListContainerImageTags(ListContainerImageTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImageTags", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. List all matchmaking queue configs. + /// + public static void ListMatchmakingQueues(ListMatchmakingQueuesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingQueues", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all matchmaking ticket Ids the user is a member of. + /// + public static void ListMatchmakingTicketsForPlayer(ListMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists multiplayer server sessions for a build. + /// + public static void ListMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists quality of service servers for party. + /// + public static void ListPartyQosServers(ListPartyQosServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListPartyQosServers", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists quality of service servers for the title. By default, servers are only returned for regions where a Multiplayer + /// Servers build has been deployed. + /// + public static void ListQosServersForTitle(ListQosServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListQosServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all server backfill ticket Ids the user is a member of. + /// + public static void ListServerBackfillTicketsForPlayer(ListServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/ListServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all server quota change requests for a title. + /// + public static void ListTitleMultiplayerServersQuotaChanges(ListTitleMultiplayerServersQuotaChangesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListTitleMultiplayerServersQuotaChanges", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists virtual machines for a title. + /// + public static void ListVirtualMachineSummaries(ListVirtualMachineSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListVirtualMachineSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. Remove a matchmaking queue config. + /// + public static void RemoveMatchmakingQueue(RemoveMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/RemoveMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Remove a member from a lobby. + /// + public static void RemoveMember(RemoveMemberFromLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/RemoveMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Request a multiplayer server session. Accepts tokens for title and if game client access is enabled, allows game client + /// to request a server with player entity token. + /// + public static void RequestMultiplayerServer(RequestMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/RequestMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Rolls over the credentials to the container registry. + /// + public static void RolloverContainerRegistryCredentials(RolloverContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/RolloverContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// SDK support is limited to C# and Java for this API. Create or update a matchmaking queue configuration. + /// + public static void SetMatchmakingQueue(SetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/SetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Shuts down a multiplayer server session. + /// + public static void ShutdownMultiplayerServer(ShutdownMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/ShutdownMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Subscribe to lobby resource notifications. + /// + public static void SubscribeToLobbyResource(SubscribeToLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/SubscribeToLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Subscribe to match resource notifications. + /// + public static void SubscribeToMatchmakingResource(SubscribeToMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/SubscribeToMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unsubscribe from lobby notifications. + /// + public static void UnsubscribeFromLobbyResource(UnsubscribeFromLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/UnsubscribeFromLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unsubscribe from match resource notifications. + /// + public static void UnsubscribeFromMatchmakingResource(UnsubscribeFromMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Match/UnsubscribeFromMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Untags a container image. + /// + public static void UntagContainerImage(UntagContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UntagContainerImage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Creates a multiplayer server build alias. + /// + public static void UpdateBuildAlias(UpdateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a multiplayer server build's name. + /// + public static void UpdateBuildName(UpdateBuildNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildName", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a multiplayer server build's region. If the region is not yet created, it will be created + /// + public static void UpdateBuildRegion(UpdateBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates a multiplayer server build's regions. + /// + public static void UpdateBuildRegions(UpdateBuildRegionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update a lobby. + /// + public static void UpdateLobby(UpdateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Lobby/UpdateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Uploads a multiplayer server game certificate. + /// + public static void UploadCertificate(UploadCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/MultiplayerServer/UploadCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta new file mode 100644 index 00000000..d022d5dc --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a5dd863da40a92a46b55d58a56b8db93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs new file mode 100644 index 00000000..d543df94 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs @@ -0,0 +1,946 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.MultiplayerModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// API methods for managing multiplayer servers. API methods for managing parties. The lobby service helps players group + /// together to play multiplayer games. It is often used as a rendezvous point for players to share connection information. + /// + public partial class PlayFabMultiplayerInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabMultiplayerInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabMultiplayerInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Cancel all active tickets the player is a member of in a given queue. + /// + public void CancelAllMatchmakingTicketsForPlayer(CancelAllMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelAllMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancel all active backfill tickets the player is a member of in a given queue. + /// + public void CancelAllServerBackfillTicketsForPlayer(CancelAllServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelAllServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancel a matchmaking ticket. + /// + public void CancelMatchmakingTicket(CancelMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Cancel a server backfill ticket. + /// + public void CancelServerBackfillTicket(CancelServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CancelServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build alias. + /// + public void CreateBuildAlias(CreateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build with a custom container. + /// + public void CreateBuildWithCustomContainer(CreateBuildWithCustomContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithCustomContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build with a managed container. + /// + public void CreateBuildWithManagedContainer(CreateBuildWithManagedContainerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithManagedContainer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build with the server running as a process. + /// + public void CreateBuildWithProcessBasedServer(CreateBuildWithProcessBasedServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateBuildWithProcessBasedServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a lobby. + /// + public void CreateLobby(CreateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/CreateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a matchmaking ticket as a client. + /// + public void CreateMatchmakingTicket(CreateMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CreateMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a remote user to log on to a VM for a multiplayer server build. + /// + public void CreateRemoteUser(CreateRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a backfill matchmaking ticket as a server. A backfill ticket represents an ongoing game. The matchmaking service + /// automatically starts matching the backfill ticket against other matchmaking tickets. Backfill tickets cannot match with + /// other backfill tickets. + /// + public void CreateServerBackfillTicket(CreateServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CreateServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Create a matchmaking ticket as a server. The matchmaking service automatically starts matching the ticket against other + /// matchmaking tickets. + /// + public void CreateServerMatchmakingTicket(CreateServerMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/CreateServerMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a request to change a title's multiplayer server quotas. + /// + public void CreateTitleMultiplayerServersQuotaChange(CreateTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/CreateTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server game asset for a title. + /// + public void DeleteAsset(DeleteAssetRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteAsset", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server build. + /// + public void DeleteBuild(DeleteBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server build alias. + /// + public void DeleteBuildAlias(DeleteBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a multiplayer server build's region. + /// + public void DeleteBuildRegion(DeleteBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a multiplayer server game certificate. + /// + public void DeleteCertificate(DeleteCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a container image repository. + /// + public void DeleteContainerImageRepository(DeleteContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteContainerImageRepository", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Delete a lobby. + /// + public void DeleteLobby(DeleteLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/DeleteLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a remote user to log on to a VM for a multiplayer server build. + /// + public void DeleteRemoteUser(DeleteRemoteUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/DeleteRemoteUser", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Enables the multiplayer server feature for a title. + /// + public void EnableMultiplayerServersForTitle(EnableMultiplayerServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/EnableMultiplayerServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Find lobbies which match certain criteria, and which friends are in. + /// + public void FindFriendLobbies(FindFriendLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/FindFriendLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Find all the lobbies that match certain criteria. + /// + public void FindLobbies(FindLobbiesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/FindLobbies", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a URL that can be used to download the specified asset. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public void GetAssetDownloadUrl(GetAssetDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetDownloadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the URL to upload assets to. A sample pre-authenticated url - + /// https://sampleStorageAccount.blob.core.windows.net/gameassets/gameserver.zip?sv=2015-04-05&ss=b&srt=sco&sp=rw&st=startDate&se=endDate&spr=https&sig=sampleSig&api-version=2017-07-29 + /// + public void GetAssetUploadUrl(GetAssetUploadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetAssetUploadUrl", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a multiplayer server build. + /// + public void GetBuild(GetBuildRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuild", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a multiplayer server build alias. + /// + public void GetBuildAlias(GetBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the credentials to the container registry. + /// + public void GetContainerRegistryCredentials(GetContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a lobby. + /// + public void GetLobby(GetLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/GetLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a match. + /// + public void GetMatch(GetMatchRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetMatch", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. Get a matchmaking queue configuration. + /// + public void GetMatchmakingQueue(GetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a matchmaking ticket by ticket Id. + /// + public void GetMatchmakingTicket(GetMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets multiplayer server session details for a build. + /// + public void GetMultiplayerServerDetails(GetMultiplayerServerDetailsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerDetails", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public void GetMultiplayerServerLogs(GetMultiplayerServerLogsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerServerLogs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets multiplayer server logs after a server has terminated. + /// + public void GetMultiplayerSessionLogsBySessionId(GetMultiplayerSessionLogsBySessionIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetMultiplayerSessionLogsBySessionId", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get the statistics for a queue. + /// + public void GetQueueStatistics(GetQueueStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetQueueStatistics", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a remote login endpoint to a VM that is hosting a multiplayer server build. + /// + public void GetRemoteLoginEndpoint(GetRemoteLoginEndpointRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetRemoteLoginEndpoint", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get a matchmaking backfill ticket by ticket Id. + /// + public void GetServerBackfillTicket(GetServerBackfillTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/GetServerBackfillTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the status of whether a title is enabled for the multiplayer server feature. + /// + public void GetTitleEnabledForMultiplayerServersStatus(GetTitleEnabledForMultiplayerServersStatusRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleEnabledForMultiplayerServersStatus", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets a title's server quota change request. + /// + public void GetTitleMultiplayerServersQuotaChange(GetTitleMultiplayerServersQuotaChangeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotaChange", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets the quotas for a title in relation to multiplayer servers. + /// + public void GetTitleMultiplayerServersQuotas(GetTitleMultiplayerServersQuotasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/GetTitleMultiplayerServersQuotas", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Send a notification to invite a player to a lobby. + /// + public void InviteToLobby(InviteToLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/InviteToLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Join an Arranged lobby. + /// + public void JoinArrangedLobby(JoinArrangedLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/JoinArrangedLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Join a lobby. + /// + public void JoinLobby(JoinLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/JoinLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Join a matchmaking ticket. + /// + public void JoinMatchmakingTicket(JoinMatchmakingTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/JoinMatchmakingTicket", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Leave a lobby. + /// + public void LeaveLobby(LeaveLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/LeaveLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists archived multiplayer server sessions for a build. + /// + public void ListArchivedMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListArchivedMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists multiplayer server game assets for a title. + /// + public void ListAssetSummaries(ListAssetSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListAssetSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists details of all build aliases for a title. Accepts tokens for title and if game client access is enabled, allows + /// game client to request list of builds with player entity token. + /// + public void ListBuildAliases(ListBuildAliasesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildAliases", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists summarized details of all multiplayer server builds for a title. Accepts tokens for title and if game client + /// access is enabled, allows game client to request list of builds with player entity token. + /// + public void ListBuildSummariesV2(ListBuildSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListBuildSummariesV2", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists multiplayer server game certificates for a title. + /// + public void ListCertificateSummaries(ListCertificateSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListCertificateSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists custom container images for a title. + /// + public void ListContainerImages(ListContainerImagesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImages", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists the tags for a custom container image. + /// + public void ListContainerImageTags(ListContainerImageTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListContainerImageTags", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. List all matchmaking queue configs. + /// + public void ListMatchmakingQueues(ListMatchmakingQueuesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingQueues", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all matchmaking ticket Ids the user is a member of. + /// + public void ListMatchmakingTicketsForPlayer(ListMatchmakingTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/ListMatchmakingTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists multiplayer server sessions for a build. + /// + public void ListMultiplayerServers(ListMultiplayerServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListMultiplayerServers", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists quality of service servers for party. + /// + public void ListPartyQosServers(ListPartyQosServersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListPartyQosServers", request, AuthType.None, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists quality of service servers for the title. By default, servers are only returned for regions where a Multiplayer + /// Servers build has been deployed. + /// + public void ListQosServersForTitle(ListQosServersForTitleRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListQosServersForTitle", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all server backfill ticket Ids the user is a member of. + /// + public void ListServerBackfillTicketsForPlayer(ListServerBackfillTicketsForPlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/ListServerBackfillTicketsForPlayer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all server quota change requests for a title. + /// + public void ListTitleMultiplayerServersQuotaChanges(ListTitleMultiplayerServersQuotaChangesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListTitleMultiplayerServersQuotaChanges", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists virtual machines for a title. + /// + public void ListVirtualMachineSummaries(ListVirtualMachineSummariesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ListVirtualMachineSummaries", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. Remove a matchmaking queue config. + /// + public void RemoveMatchmakingQueue(RemoveMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/RemoveMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Remove a member from a lobby. + /// + public void RemoveMember(RemoveMemberFromLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/RemoveMember", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Request a multiplayer server session. Accepts tokens for title and if game client access is enabled, allows game client + /// to request a server with player entity token. + /// + public void RequestMultiplayerServer(RequestMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/RequestMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Rolls over the credentials to the container registry. + /// + public void RolloverContainerRegistryCredentials(RolloverContainerRegistryCredentialsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/RolloverContainerRegistryCredentials", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// SDK support is limited to C# and Java for this API. Create or update a matchmaking queue configuration. + /// + public void SetMatchmakingQueue(SetMatchmakingQueueRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/SetMatchmakingQueue", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Shuts down a multiplayer server session. + /// + public void ShutdownMultiplayerServer(ShutdownMultiplayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/ShutdownMultiplayerServer", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Subscribe to lobby resource notifications. + /// + public void SubscribeToLobbyResource(SubscribeToLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/SubscribeToLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Subscribe to match resource notifications. + /// + public void SubscribeToMatchmakingResource(SubscribeToMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/SubscribeToMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unsubscribe from lobby notifications. + /// + public void UnsubscribeFromLobbyResource(UnsubscribeFromLobbyResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/UnsubscribeFromLobbyResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unsubscribe from match resource notifications. + /// + public void UnsubscribeFromMatchmakingResource(UnsubscribeFromMatchResourceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Match/UnsubscribeFromMatchmakingResource", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Untags a container image. + /// + public void UntagContainerImage(UntagContainerImageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UntagContainerImage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Creates a multiplayer server build alias. + /// + public void UpdateBuildAlias(UpdateBuildAliasRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildAlias", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a multiplayer server build's name. + /// + public void UpdateBuildName(UpdateBuildNameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildName", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a multiplayer server build's region. If the region is not yet created, it will be created + /// + public void UpdateBuildRegion(UpdateBuildRegionRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegion", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates a multiplayer server build's regions. + /// + public void UpdateBuildRegions(UpdateBuildRegionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UpdateBuildRegions", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update a lobby. + /// + public void UpdateLobby(UpdateLobbyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Lobby/UpdateLobby", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Uploads a multiplayer server game certificate. + /// + public void UploadCertificate(UploadCertificateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/MultiplayerServer/UploadCertificate", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta new file mode 100644 index 00000000..0d3c42fa --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a4dbb109fa8001b4b9fa53260ba50cf8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs new file mode 100644 index 00000000..8abe8345 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs @@ -0,0 +1,4905 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.MultiplayerModels +{ + public enum AccessPolicy + { + Public, + Friends, + Private + } + + [Serializable] + public class AssetReference : PlayFabBaseModel + { + /// + /// The asset's file name. This is a filename with the .zip, .tar, or .tar.gz extension. + /// + public string FileName; + /// + /// The asset's mount path. + /// + public string MountPath; + } + + [Serializable] + public class AssetReferenceParams : PlayFabBaseModel + { + /// + /// The asset's file name. + /// + public string FileName; + /// + /// The asset's mount path. + /// + public string MountPath; + } + + [Serializable] + public class AssetSummary : PlayFabBaseModel + { + /// + /// The asset's file name. This is a filename with the .zip, .tar, or .tar.gz extension. + /// + public string FileName; + /// + /// The metadata associated with the asset. + /// + public Dictionary Metadata; + } + + public enum AttributeMergeFunction + { + Min, + Max, + Average + } + + public enum AttributeNotSpecifiedBehavior + { + UseDefault, + MatchAny + } + + public enum AttributeSource + { + User, + PlayerEntity + } + + public enum AzureRegion + { + AustraliaEast, + AustraliaSoutheast, + BrazilSouth, + CentralUs, + EastAsia, + EastUs, + EastUs2, + JapanEast, + JapanWest, + NorthCentralUs, + NorthEurope, + SouthCentralUs, + SoutheastAsia, + WestEurope, + WestUs, + SouthAfricaNorth, + WestCentralUs, + KoreaCentral, + FranceCentral, + WestUs2, + CentralIndia, + UaeNorth, + UkSouth + } + + public enum AzureVmFamily + { + A, + Av2, + Dv2, + Dv3, + F, + Fsv2, + Dasv4, + Dav4, + Eav4, + Easv4, + Ev4, + Esv4, + Dsv3, + Dsv2, + NCasT4_v3, + Ddv4, + Ddsv4, + HBv3 + } + + public enum AzureVmSize + { + Standard_A1, + Standard_A2, + Standard_A3, + Standard_A4, + Standard_A1_v2, + Standard_A2_v2, + Standard_A4_v2, + Standard_A8_v2, + Standard_D1_v2, + Standard_D2_v2, + Standard_D3_v2, + Standard_D4_v2, + Standard_D5_v2, + Standard_D2_v3, + Standard_D4_v3, + Standard_D8_v3, + Standard_D16_v3, + Standard_F1, + Standard_F2, + Standard_F4, + Standard_F8, + Standard_F16, + Standard_F2s_v2, + Standard_F4s_v2, + Standard_F8s_v2, + Standard_F16s_v2, + Standard_D2as_v4, + Standard_D4as_v4, + Standard_D8as_v4, + Standard_D16as_v4, + Standard_D2a_v4, + Standard_D4a_v4, + Standard_D8a_v4, + Standard_D16a_v4, + Standard_E2a_v4, + Standard_E4a_v4, + Standard_E8a_v4, + Standard_E16a_v4, + Standard_E2as_v4, + Standard_E4as_v4, + Standard_E8as_v4, + Standard_E16as_v4, + Standard_D2s_v3, + Standard_D4s_v3, + Standard_D8s_v3, + Standard_D16s_v3, + Standard_DS1_v2, + Standard_DS2_v2, + Standard_DS3_v2, + Standard_DS4_v2, + Standard_DS5_v2, + Standard_NC4as_T4_v3, + Standard_D2d_v4, + Standard_D4d_v4, + Standard_D8d_v4, + Standard_D16d_v4, + Standard_D2ds_v4, + Standard_D4ds_v4, + Standard_D8ds_v4, + Standard_D16ds_v4, + Standard_HB120_16rs_v3, + Standard_HB120_32rs_v3, + Standard_HB120_64rs_v3, + Standard_HB120_96rs_v3, + Standard_HB120rs_v3 + } + + [Serializable] + public class BuildAliasDetailsResponse : PlayFabResultCommon + { + /// + /// The guid string alias Id of the alias to be created or updated. + /// + public string AliasId; + /// + /// The alias name. + /// + public string AliasName; + /// + /// Array of build selection criteria. + /// + public List BuildSelectionCriteria; + } + + [Serializable] + public class BuildAliasParams : PlayFabBaseModel + { + /// + /// The guid string alias ID to use for the request. + /// + public string AliasId; + } + + [Serializable] + public class BuildRegion : PlayFabBaseModel + { + /// + /// The current multiplayer server stats for the region. + /// + public CurrentServerStats CurrentServerStats; + /// + /// Optional settings to control dynamic adjustment of standby target + /// + public DynamicStandbySettings DynamicStandbySettings; + /// + /// Whether the game assets provided for the build have been replicated to this region. + /// + public bool IsAssetReplicationComplete; + /// + /// The maximum number of multiplayer servers for the region. + /// + public int MaxServers; + /// + /// Regional override for the number of multiplayer servers to host on a single VM of the build. + /// + public int? MultiplayerServerCountPerVm; + /// + /// The build region. + /// + public string Region; + /// + /// Optional settings to set the standby target to specified values during the supplied schedules + /// + public ScheduledStandbySettings ScheduledStandbySettings; + /// + /// The target number of standby multiplayer servers for the region. + /// + public int StandbyServers; + /// + /// The status of multiplayer servers in the build region. Valid values are - Unknown, Initialized, Deploying, Deployed, + /// Unhealthy, Deleting, Deleted. + /// + public string Status; + /// + /// Regional override for the VM size the build was created on. + /// + public AzureVmSize? VmSize; + } + + [Serializable] + public class BuildRegionParams : PlayFabBaseModel + { + /// + /// Optional settings to control dynamic adjustment of standby target. If not specified, dynamic standby is disabled + /// + public DynamicStandbySettings DynamicStandbySettings; + /// + /// The maximum number of multiplayer servers for the region. + /// + public int MaxServers; + /// + /// Regional override for the number of multiplayer servers to host on a single VM of the build. + /// + public int? MultiplayerServerCountPerVm; + /// + /// The build region. + /// + public string Region; + /// + /// Optional settings to set the standby target to specified values during the supplied schedules + /// + public ScheduledStandbySettings ScheduledStandbySettings; + /// + /// The number of standby multiplayer servers for the region. + /// + public int StandbyServers; + /// + /// Regional override for the VM size the build was created on. + /// + public AzureVmSize? VmSize; + } + + [Serializable] + public class BuildSelectionCriterion : PlayFabBaseModel + { + /// + /// Dictionary of build ids and their respective weights for distribution of allocation requests. + /// + public Dictionary BuildWeightDistribution; + } + + [Serializable] + public class BuildSummary : PlayFabBaseModel + { + /// + /// The guid string build ID of the build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration and status for each region in the build. + /// + public List RegionConfigurations; + } + + /// + /// Cancels all tickets of which the player is a member in a given queue that are not cancelled or matched. This API is + /// useful if you lose track of what tickets the player is a member of (if the title crashes for instance) and want to + /// "reset". The Entity field is optional if the caller is a player and defaults to that player. Players may not cancel + /// tickets for other people. The Entity field is required if the caller is a server (authenticated as the title). + /// + [Serializable] + public class CancelAllMatchmakingTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key of the player whose tickets should be canceled. + /// + public EntityKey Entity; + /// + /// The name of the queue from which a player's tickets should be canceled. + /// + public string QueueName; + } + + [Serializable] + public class CancelAllMatchmakingTicketsForPlayerResult : PlayFabResultCommon + { + } + + /// + /// Cancels all backfill tickets of which the player is a member in a given queue that are not cancelled or matched. This + /// API is useful if you lose track of what tickets the player is a member of (if the server crashes for instance) and want + /// to "reset". + /// + [Serializable] + public class CancelAllServerBackfillTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key of the player whose backfill tickets should be canceled. + /// + public EntityKey Entity; + /// + /// The name of the queue from which a player's backfill tickets should be canceled. + /// + public string QueueName; + } + + [Serializable] + public class CancelAllServerBackfillTicketsForPlayerResult : PlayFabResultCommon + { + } + + public enum CancellationReason + { + Requested, + Internal, + Timeout + } + + /// + /// Only servers and ticket members can cancel a ticket. The ticket can be in five different states when it is cancelled. 1: + /// the ticket is waiting for members to join it, and it has not started matching. If the ticket is cancelled at this stage, + /// it will never match. 2: the ticket is matching. If the ticket is cancelled, it will stop matching. 3: the ticket is + /// matched. A matched ticket cannot be cancelled. 4: the ticket is already cancelled and nothing happens. 5: the ticket is + /// waiting for a server. If the ticket is cancelled, server allocation will be stopped. A server may still be allocated due + /// to a race condition, but that will not be reflected in the ticket. There may be race conditions between the ticket + /// getting matched and the client making a cancellation request. The client must handle the possibility that the cancel + /// request fails if a match is found before the cancellation request is processed. We do not allow resubmitting a cancelled + /// ticket because players must consent to enter matchmaking again. Create a new ticket instead. + /// + [Serializable] + public class CancelMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the queue the ticket is in. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class CancelMatchmakingTicketResult : PlayFabResultCommon + { + } + + /// + /// Only servers can cancel a backfill ticket. The ticket can be in three different states when it is cancelled. 1: the + /// ticket is matching. If the ticket is cancelled, it will stop matching. 2: the ticket is matched. A matched ticket cannot + /// be cancelled. 3: the ticket is already cancelled and nothing happens. There may be race conditions between the ticket + /// getting matched and the server making a cancellation request. The server must handle the possibility that the cancel + /// request fails if a match is found before the cancellation request is processed. We do not allow resubmitting a cancelled + /// ticket. Create a new ticket instead. + /// + [Serializable] + public class CancelServerBackfillTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the queue the ticket is in. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class CancelServerBackfillTicketResult : PlayFabResultCommon + { + } + + [Serializable] + public class Certificate : PlayFabBaseModel + { + /// + /// Base64 encoded string contents of the certificate. + /// + public string Base64EncodedValue; + /// + /// A name for the certificate. This is used to reference certificates in build configurations. + /// + public string Name; + /// + /// If required for your PFX certificate, use this field to provide a password that will be used to install the certificate + /// on the container. + /// + public string Password; + } + + [Serializable] + public class CertificateSummary : PlayFabBaseModel + { + /// + /// The name of the certificate. + /// + public string Name; + /// + /// The thumbprint for the certificate. + /// + public string Thumbprint; + } + + [Serializable] + public class ConnectedPlayer : PlayFabBaseModel + { + /// + /// The player ID of the player connected to the multiplayer server. + /// + public string PlayerId; + } + + public enum ContainerFlavor + { + ManagedWindowsServerCore, + CustomLinux, + ManagedWindowsServerCorePreview, + Invalid + } + + [Serializable] + public class ContainerImageReference : PlayFabBaseModel + { + /// + /// The container image name. + /// + public string ImageName; + /// + /// The container tag. + /// + public string Tag; + } + + [Serializable] + public class CoreCapacity : PlayFabBaseModel + { + /// + /// The available core capacity for the (Region, VmFamily) + /// + public int Available; + /// + /// The AzureRegion + /// + public string Region; + /// + /// The total core capacity for the (Region, VmFamily) + /// + public int Total; + /// + /// The AzureVmFamily + /// + public AzureVmFamily? VmFamily; + } + + [Serializable] + public class CoreCapacityChange : PlayFabBaseModel + { + /// + /// New quota core limit for the given vm family/region. + /// + public int NewCoreLimit; + /// + /// Region to change. + /// + public string Region; + /// + /// Virtual machine family to change. + /// + public AzureVmFamily VmFamily; + } + + /// + /// Creates a multiplayer server build alias and returns the created alias. + /// + [Serializable] + public class CreateBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The alias name. + /// + public string AliasName; + /// + /// Array of build selection criteria. + /// + public List BuildSelectionCriteria; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Creates a multiplayer server build with a custom container and returns information about the build creation request. + /// + [Serializable] + public class CreateBuildWithCustomContainerRequest : PlayFabRequestCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container to create a build from. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The container reference, consisting of the image name and tag. + /// + public ContainerImageReference ContainerImageReference; + /// + /// The container command to run when the multiplayer server has been allocated, including any arguments. + /// + public string ContainerRunCommand; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The list of game assets related to the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The Linux instrumentation configuration for the build. + /// + public LinuxInstrumentationConfiguration LinuxInstrumentationConfiguration; + /// + /// Metadata to tag the build. The keys are case insensitive. The build metadata is made available to the server through + /// Game Server SDK (GSDK).Constraints: Maximum number of keys: 30, Maximum key length: 50, Maximum value length: 100 + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application on the build + /// + public MonitoringApplicationConfigurationParams MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM. + /// + public int MultiplayerServerCountPerVm; + /// + /// The ports to map the build on. + /// + public List Ports; + /// + /// The region configurations for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// DEPRECATED - this is always true. Assets are downloaded and uncompressed in memory, without the compressedversion being + /// written first to disc. + /// + [Obsolete("Use '' instead", false)] + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size to create the build on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript for the build + /// + public VmStartupScriptParams VmStartupScriptConfiguration; + } + + [Serializable] + public class CreateBuildWithCustomContainerResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID. Must be unique for every build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container of the build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The container command to run when the multiplayer server has been allocated, including any arguments. + /// + public string ContainerRunCommand; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The custom game container image reference information. + /// + public ContainerImageReference CustomGameContainerImage; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The Linux instrumentation configuration for this build. + /// + public LinuxInstrumentationConfiguration LinuxInstrumentationConfiguration; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application for the build + /// + public MonitoringApplicationConfiguration MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// When true, assets will be downloaded and uncompressed in memory, without the compressedversion being written first to + /// disc. + /// + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Creates a multiplayer server build with a managed container and returns information about the build creation request. + /// + [Serializable] + public class CreateBuildWithManagedContainerRequest : PlayFabRequestCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container to create a build from. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The list of game assets related to the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The directory containing the game executable. This would be the start path of the game assets that contain the main game + /// server executable. If not provided, a best effort will be made to extract it from the start game command. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for the build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Metadata to tag the build. The keys are case insensitive. The build metadata is made available to the server through + /// Game Server SDK (GSDK).Constraints: Maximum number of keys: 30, Maximum key length: 50, Maximum value length: 100 + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application on the build + /// + public MonitoringApplicationConfigurationParams MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM. + /// + public int MultiplayerServerCountPerVm; + /// + /// The ports to map the build on. + /// + public List Ports; + /// + /// The region configurations for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The command to run when the multiplayer server is started, including any arguments. + /// + public string StartMultiplayerServerCommand; + /// + /// DEPRECATED - this is always true. Assets are downloaded and uncompressed in memory, without the compressedversion being + /// written first to disc. + /// + [Obsolete("Use '' instead", false)] + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size to create the build on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript for the build + /// + public VmStartupScriptParams VmStartupScriptConfiguration; + /// + /// The crash dump configuration for the build. + /// + public WindowsCrashDumpConfiguration WindowsCrashDumpConfiguration; + } + + [Serializable] + public class CreateBuildWithManagedContainerResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID. Must be unique for every build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container of the build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The directory containing the game executable. This would be the start path of the game assets that contain the main game + /// server executable. If not provided, a best effort will be made to extract it from the start game command. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for this build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application for the build + /// + public MonitoringApplicationConfiguration MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM (EXPERIMENTAL API) + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// The command to run when the multiplayer server has been allocated, including any arguments. + /// + public string StartMultiplayerServerCommand; + /// + /// When true, assets will be downloaded and uncompressed in memory, without the compressedversion being written first to + /// disc. + /// + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Creates a multiplayer server build with the game server running as a process and returns information about the build + /// creation request. + /// + [Serializable] + public class CreateBuildWithProcessBasedServerRequest : PlayFabRequestCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The build name. + /// + public string BuildName; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The list of game assets related to the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The working directory for the game process. If this is not provided, the working directory will be set based on the + /// mount path of the game server executable. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for the build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Indicates whether this build will be created using the OS Preview versionPreview OS is recommended for dev builds to + /// detect any breaking changes before they are released to retail. Retail builds should set this value to false. + /// + public bool? IsOSPreview; + /// + /// Metadata to tag the build. The keys are case insensitive. The build metadata is made available to the server through + /// Game Server SDK (GSDK).Constraints: Maximum number of keys: 30, Maximum key length: 50, Maximum value length: 100 + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application on the build + /// + public MonitoringApplicationConfigurationParams MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports to map the build on. + /// + public List Ports; + /// + /// The region configurations for the build. + /// + public List RegionConfigurations; + /// + /// The command to run when the multiplayer server is started, including any arguments. The path to any executable should be + /// relative to the root asset folder when unzipped. + /// + public string StartMultiplayerServerCommand; + /// + /// DEPRECATED - this is always true. Assets are downloaded and uncompressed in memory, without the compressedversion being + /// written first to disc. + /// + [Obsolete("Use '' instead", false)] + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size to create the build on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript for the build + /// + public VmStartupScriptParams VmStartupScriptConfiguration; + } + + [Serializable] + public class CreateBuildWithProcessBasedServerResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID. Must be unique for every build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The flavor of container of the build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The working directory for the game process. If this is not provided, the working directory will be set based on the + /// mount path of the game server executable. + /// + public string GameWorkingDirectory; + /// + /// The instrumentation configuration for this build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Indicates whether this build will be created using the OS Preview versionPreview OS is recommended for dev builds to + /// detect any breaking changes before they are released to retail. Retail builds should set this value to false. + /// + public bool? IsOSPreview; + /// + /// The metadata of the build. + /// + public Dictionary Metadata; + /// + /// The configuration for the monitoring application for the build + /// + public MonitoringApplicationConfiguration MonitoringApplicationConfiguration; + /// + /// The number of multiplayer servers to host on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// The command to run when the multiplayer server is started, including any arguments. The path to any executable is + /// relative to the root asset folder when unzipped. + /// + public string StartMultiplayerServerCommand; + /// + /// When true, assets will be downloaded and uncompressed in memory, without the compressedversion being written first to + /// disc. + /// + public bool? UseStreamingForAssetDownloads; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Request to create a lobby. A Server or client can create a lobby. + /// + [Serializable] + public class CreateLobbyRequest : PlayFabRequestCommon + { + /// + /// The policy indicating who is allowed to join the lobby, and the visibility to queries. May be 'Public', 'Friends' or + /// 'Private'. Public means the lobby is both visible in queries and any player may join, including invited players. Friends + /// means that users who are bidirectional friends of members in the lobby may search to find friend lobbies, to retrieve + /// its connection string. Private means the lobby is not visible in queries, and a player must receive an invitation to + /// join. Defaults to 'Public' on creation. Can only be changed by the lobby owner. + /// + public AccessPolicy? AccessPolicy; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The private key-value pairs which are only visible to members of the lobby. At most 30 key-value pairs may be stored + /// here, keys are limited to 30 characters and values to 1000. The total size of all lobbyData values may not exceed 4096 + /// bytes. Keys are case sensitive. + /// + public Dictionary LobbyData; + /// + /// The maximum number of players allowed in the lobby. The value must be between 2 and 128. + /// + public uint MaxPlayers; + /// + /// The member initially added to the lobby. Client must specify exactly one member, which is the creator's entity and + /// member data. Member PubSubConnectionHandle must be null or empty. Game servers must not specify any members. + /// + public List Members; + /// + /// The lobby owner. Must be the calling entity. + /// + public EntityKey Owner; + /// + /// The policy for how a new owner is chosen. May be 'Automatic', 'Manual' or 'None'. Can only be specified by clients. If + /// client-owned and 'Automatic' - The Lobby service will automatically assign another connected owner when the current + /// owner leaves or disconnects. The useConnections property must be true. If client - owned and 'Manual' - Ownership is + /// protected as long as the current owner is connected. If the current owner leaves or disconnects any member may set + /// themselves as the current owner. The useConnections property must be true. If client-owned and 'None' - Any member can + /// set ownership. The useConnections property can be either true or false. + /// + public OwnerMigrationPolicy? OwnerMigrationPolicy; + /// + /// The public key-value pairs which allow queries to differentiate between lobbies. Queries will refer to these key-value + /// pairs in their filter and order by clauses to retrieve lobbies fitting the specified criteria. At most 30 key-value + /// pairs may be stored here. Keys are of the format string_key1, string_key2 ... string_key30 for string values, or + /// number_key1, number_key2, ... number_key30 for numeric values.Numeric values are floats. Values can be at most 256 + /// characters long. The total size of all searchData values may not exceed 1024 bytes. + /// + public Dictionary SearchData; + /// + /// A setting to control whether connections are used. Defaults to true. When true, notifications are sent to subscribed + /// players, disconnect detection removes connectionHandles, only owner migration policies using connections are allowed, + /// and lobbies must have at least one connected member to be searchable or be a server hosted lobby with a connected + /// server. If false, then notifications are not sent, connections are not allowed, and lobbies do not need connections to + /// be searchable. + /// + public bool UseConnections; + } + + [Serializable] + public class CreateLobbyResult : PlayFabResultCommon + { + /// + /// A field which indicates which lobby the user will be joining. + /// + public string ConnectionString; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + } + + /// + /// The client specifies the creator's attributes and optionally a list of other users to match with. + /// + [Serializable] + public class CreateMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The User who created this ticket. + /// + public MatchmakingPlayer Creator; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// A list of Entity Keys of other users to match with. + /// + public List MembersToMatchWith; + /// + /// The Id of a match queue. + /// + public string QueueName; + } + + [Serializable] + public class CreateMatchmakingTicketResult : PlayFabResultCommon + { + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// Creates a remote user to log on to a VM for a multiplayer server build in a specific region. Returns user credential + /// information necessary to log on. + /// + [Serializable] + public class CreateRemoteUserRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of to create the remote user for. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The expiration time for the remote user created. Defaults to expiring in one day if not specified. + /// + public DateTime? ExpirationTime; + /// + /// The region of virtual machine to create the remote user for. + /// + public string Region; + /// + /// The username to create the remote user with. + /// + public string Username; + /// + /// The virtual machine ID the multiplayer server is located on. + /// + public string VmId; + } + + [Serializable] + public class CreateRemoteUserResponse : PlayFabResultCommon + { + /// + /// The expiration time for the remote user created. + /// + public DateTime? ExpirationTime; + /// + /// The generated password for the remote user that was created. + /// + public string Password; + /// + /// The username for the remote user that was created. + /// + public string Username; + } + + /// + /// The server specifies all the members, their teams and their attributes, and the server details if applicable. + /// + [Serializable] + public class CreateServerBackfillTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The users who will be part of this ticket, along with their team assignments. + /// + public List Members; + /// + /// The Id of a match queue. + /// + public string QueueName; + /// + /// The details of the server the members are connected to. + /// + public ServerDetails ServerDetails; + } + + [Serializable] + public class CreateServerBackfillTicketResult : PlayFabResultCommon + { + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// The server specifies all the members and their attributes. + /// + [Serializable] + public class CreateServerMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The users who will be part of this ticket. + /// + public List Members; + /// + /// The Id of a match queue. + /// + public string QueueName; + } + + /// + /// Creates a request to change a title's multiplayer server quotas. + /// + [Serializable] + public class CreateTitleMultiplayerServersQuotaChangeRequest : PlayFabRequestCommon + { + /// + /// A brief description of the requested changes. + /// + public string ChangeDescription; + /// + /// Changes to make to the titles cores quota. + /// + public List Changes; + /// + /// Email to be contacted by our team about this request. Only required when a request is not approved. + /// + public string ContactEmail; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Additional information about this request that our team can use to better understand the requirements. + /// + public string Notes; + /// + /// When these changes would need to be in effect. Only required when a request is not approved. + /// + public DateTime? StartDate; + } + + [Serializable] + public class CreateTitleMultiplayerServersQuotaChangeResponse : PlayFabResultCommon + { + /// + /// Id of the change request that was created. + /// + public string RequestId; + /// + /// Determines if the request was approved or not. When false, our team is reviewing and may respond within 2 business days. + /// + public bool WasApproved; + } + + [Serializable] + public class CurrentServerStats : PlayFabBaseModel + { + /// + /// The number of active multiplayer servers. + /// + public int Active; + /// + /// The number of multiplayer servers still downloading game resources (such as assets). + /// + public int Propping; + /// + /// The number of standingby multiplayer servers. + /// + public int StandingBy; + /// + /// The total number of multiplayer servers. + /// + public int Total; + } + + [Serializable] + public class CustomDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the values to use for each expansion interval (this overrides Difference, Delta, and MaxDifference). + /// + public List DifferenceOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomRegionSelectionRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the maximum latency to use for each expansion interval. + /// + public List MaxLatencyOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomSetIntersectionRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the values to use for each expansion interval. + /// + public List MinIntersectionSizeOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomTeamDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the team difference value to use for each expansion interval. + /// + public List DifferenceOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class CustomTeamSizeBalanceRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the team size difference to use for each expansion interval. + /// + public List DifferenceOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + /// + /// Deletes a multiplayer server game asset for a title. + /// + [Serializable] + public class DeleteAssetRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The filename of the asset to delete. + /// + public string FileName; + } + + /// + /// Deletes a multiplayer server build alias. + /// + [Serializable] + public class DeleteBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The guid string alias ID of the alias to perform the action on. + /// + public string AliasId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Removes a multiplayer server build's region. + /// + [Serializable] + public class DeleteBuildRegionRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update regions for. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The build region to delete. + /// + public string Region; + } + + /// + /// Deletes a multiplayer server build. + /// + [Serializable] + public class DeleteBuildRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the build to delete. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Deletes a multiplayer server game certificate. + /// + [Serializable] + public class DeleteCertificateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the certificate. + /// + public string Name; + } + + /// + /// Removes the specified container image repository. After this operation, a 'docker pull' will fail for all the tags of + /// the specified image. Morever, ListContainerImages will not return the specified image. + /// + [Serializable] + public class DeleteContainerImageRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The container image repository we want to delete. + /// + public string ImageName; + } + + /// + /// Request to delete a lobby. Only servers can delete lobbies. + /// + [Serializable] + public class DeleteLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + } + + /// + /// Deletes a remote user to log on to a VM for a multiplayer server build in a specific region. Returns user credential + /// information necessary to log on. + /// + [Serializable] + public class DeleteRemoteUserRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the multiplayer server where the remote user is to delete. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The region of the multiplayer server where the remote user is to delete. + /// + public string Region; + /// + /// The username of the remote user to delete. + /// + public string Username; + /// + /// The virtual machine ID the multiplayer server is located on. + /// + public string VmId; + } + + [Serializable] + public class DifferenceRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Describes the behavior when an attribute is not specified in the ticket creation request or in the user's entity + /// profile. + /// + public AttributeNotSpecifiedBehavior AttributeNotSpecifiedBehavior; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. When this + /// is set, Difference is ignored. + /// + public CustomDifferenceRuleExpansion CustomExpansion; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is false). Optional. + /// + public double? DefaultAttributeValue; + /// + /// The allowed difference between any two tickets at the start of matchmaking. + /// + public double Difference; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. + /// + public LinearDifferenceRuleExpansion LinearExpansion; + /// + /// How values are treated when there are multiple players in a single ticket. + /// + public AttributeMergeFunction MergeFunction; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + [Serializable] + public class DynamicStandbySettings : PlayFabBaseModel + { + /// + /// List of auto standing by trigger values and corresponding standing by multiplier. Defaults to 1.5X at 50%, 3X at 25%, + /// and 4X at 5% + /// + public List DynamicFloorMultiplierThresholds; + /// + /// When true, dynamic standby will be enabled + /// + public bool IsEnabled; + /// + /// The time it takes to reduce target standing by to configured floor value after an increase. Defaults to 30 minutes + /// + public int? RampDownSeconds; + } + + [Serializable] + public class DynamicStandbyThreshold : PlayFabBaseModel + { + /// + /// When the trigger threshold is reached, multiply by this value + /// + public double Multiplier; + /// + /// The multiplier will be applied when the actual standby divided by target standby floor is less than this value + /// + public double TriggerThresholdPercentage; + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + /// + /// Enables the multiplayer server feature for a title and returns the enabled status. The enabled status can be + /// Initializing, Enabled, and Disabled. It can up to 20 minutes or more for the title to be enabled for the feature. On + /// average, it can take up to 20 minutes for the title to be enabled for the feature. + /// + [Serializable] + public class EnableMultiplayerServersForTitleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class EnableMultiplayerServersForTitleResponse : PlayFabResultCommon + { + /// + /// The enabled status for the multiplayer server features for the title. + /// + public TitleMultiplayerServerEnabledStatus? Status; + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + public enum ExternalFriendSources + { + None, + Steam, + Facebook, + Xbox, + Psn, + All + } + + /// + /// Request to find friends lobbies. Only a client can find friend lobbies. + /// + [Serializable] + public class FindFriendLobbiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends this query should link to. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// OData style string that contains one or more filters. Only the following operators are supported: "and" (logical and), + /// "eq" (equal), "ne" (not equals), "ge" (greater than or equal), "gt" (greater than), "le" (less than or equal), and "lt" + /// (less than). The left-hand side of each OData logical expression should be either a search property key (e.g. + /// string_key1, number_key3, etc) or one of the pre-defined search keys all of which must be prefixed by "lobby/": + /// lobby/memberCount (number of players in a lobby), lobby/maxMemberCount (maximum number of players allowed in a lobby), + /// lobby/membershipLock (must equal 'Unlocked' or 'Locked'), lobby/amOwner (required to equal "true"), lobby/amMember + /// (required to equal "true"). + /// + public string Filter; + /// + /// OData style string that contains sorting for this query in either ascending ("asc") or descending ("desc") order. + /// OrderBy clauses are of the form "number_key1 asc" or the pre-defined search key "lobby/memberCount asc" and + /// "lobby/maxMemberCount desc". To sort by closest, a moniker `distance{number_key1 = 5}` can be used to sort by distance + /// from the given number. This field only supports either one sort clause or one distance clause. + /// + public string OrderBy; + /// + /// Request pagination information. + /// + public PaginationRequest Pagination; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + [Serializable] + public class FindFriendLobbiesResult : PlayFabResultCommon + { + /// + /// Array of lobbies found that matched FindFriendLobbies request. + /// + public List Lobbies; + /// + /// Pagination response for FindFriendLobbies request. + /// + public PaginationResponse Pagination; + } + + /// + /// Request to find lobbies. + /// + [Serializable] + public class FindLobbiesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// OData style string that contains one or more filters. Only the following operators are supported: "and" (logical and), + /// "eq" (equal), "ne" (not equals), "ge" (greater than or equal), "gt" (greater than), "le" (less than or equal), and "lt" + /// (less than). The left-hand side of each OData logical expression should be either a search property key (e.g. + /// string_key1, number_key3, etc) or one of the pre-defined search keys all of which must be prefixed by "lobby/": + /// lobby/memberCount (number of players in a lobby), lobby/maxMemberCount (maximum number of players allowed in a lobby), + /// lobby/membershipLock (must equal 'Unlocked' or 'Locked'), lobby/amOwner (required to equal "true"), lobby/amMember + /// (required to equal "true"). + /// + public string Filter; + /// + /// OData style string that contains sorting for this query in either ascending ("asc") or descending ("desc") order. + /// OrderBy clauses are of the form "number_key1 asc" or the pre-defined search key "lobby/memberCount asc" and + /// "lobby/maxMemberCount desc". To sort by closest, a moniker `distance{number_key1 = 5}` can be used to sort by distance + /// from the given number. This field only supports either one sort clause or one distance clause. + /// + public string OrderBy; + /// + /// Request pagination information. + /// + public PaginationRequest Pagination; + } + + [Serializable] + public class FindLobbiesResult : PlayFabResultCommon + { + /// + /// Array of lobbies found that matched FindLobbies request. + /// + public List Lobbies; + /// + /// Pagination response for FindLobbies request. + /// + public PaginationResponse Pagination; + } + + [Serializable] + public class FriendLobbySummary : PlayFabBaseModel + { + /// + /// A string used to join the lobby.This field is populated by the Lobby service.Invites are performed by communicating this + /// connectionString to other players. + /// + public string ConnectionString; + /// + /// The current number of players in the lobby. + /// + public uint CurrentPlayers; + /// + /// Friends in Lobby. + /// + public List Friends; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. + /// + public uint MaxPlayers; + /// + /// A setting indicating whether members are allowed to join this lobby. When Locked new members are prevented from joining. + /// + public MembershipLock? MembershipLock; + /// + /// The client or server entity which owns this lobby. + /// + public EntityKey Owner; + /// + /// Search data. + /// + public Dictionary SearchData; + } + + [Serializable] + public class GameCertificateReference : PlayFabBaseModel + { + /// + /// An alias for the game certificate. The game server will reference this alias via GSDK config to retrieve the game + /// certificate. This alias is used as an identifier in game server code to allow a new certificate with different Name + /// field to be uploaded without the need to change any game server code to reference the new Name. + /// + public string GsdkAlias; + /// + /// The name of the game certificate. This name should match the name of a certificate that was previously uploaded to this + /// title. + /// + public string Name; + } + + [Serializable] + public class GameCertificateReferenceParams : PlayFabBaseModel + { + /// + /// An alias for the game certificate. The game server will reference this alias via GSDK config to retrieve the game + /// certificate. This alias is used as an identifier in game server code to allow a new certificate with different Name + /// field to be uploaded without the need to change any game server code to reference the new Name. + /// + public string GsdkAlias; + /// + /// The name of the game certificate. This name should match the name of a certificate that was previously uploaded to this + /// title. + /// + public string Name; + } + + /// + /// Gets a URL that can be used to download the specified asset. + /// + [Serializable] + public class GetAssetDownloadUrlRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The asset's file name to get the download URL for. + /// + public string FileName; + } + + [Serializable] + public class GetAssetDownloadUrlResponse : PlayFabResultCommon + { + /// + /// The asset's download URL. + /// + public string AssetDownloadUrl; + /// + /// The asset's file name to get the download URL for. + /// + public string FileName; + } + + /// + /// Gets the URL to upload assets to. + /// + [Serializable] + public class GetAssetUploadUrlRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The asset's file name to get the upload URL for. + /// + public string FileName; + } + + [Serializable] + public class GetAssetUploadUrlResponse : PlayFabResultCommon + { + /// + /// The asset's upload URL. + /// + public string AssetUploadUrl; + /// + /// The asset's file name to get the upload URL for. + /// + public string FileName; + } + + /// + /// Returns the details about a multiplayer server build alias. + /// + [Serializable] + public class GetBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The guid string alias ID of the alias to perform the action on. + /// + public string AliasId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Returns the details about a multiplayer server build. + /// + [Serializable] + public class GetBuildRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the build to get. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetBuildResponse : PlayFabResultCommon + { + /// + /// When true, assets will not be copied for each server inside the VM. All serverswill run from the same set of assets, or + /// will have the same assets mounted in the container. + /// + public bool? AreAssetsReadonly; + /// + /// The guid string build ID of the build. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The current build status. Valid values are - Deploying, Deployed, DeletingRegion, Unhealthy. + /// + public string BuildStatus; + /// + /// The flavor of container of he build. + /// + public ContainerFlavor? ContainerFlavor; + /// + /// The container command to run when the multiplayer server has been allocated, including any arguments. This only applies + /// to custom builds. If the build is a managed build, this field will be null. + /// + public string ContainerRunCommand; + /// + /// The time the build was created in UTC. + /// + public DateTime? CreationTime; + /// + /// The custom game container image for a custom build. + /// + public ContainerImageReference CustomGameContainerImage; + /// + /// The game assets for the build. + /// + public List GameAssetReferences; + /// + /// The game certificates for the build. + /// + public List GameCertificateReferences; + /// + /// The instrumentation configuration of the build. + /// + public InstrumentationConfiguration InstrumentationConfiguration; + /// + /// Metadata of the build. The keys are case insensitive. The build metadata is made available to the server through Game + /// Server SDK (GSDK). + /// + public Dictionary Metadata; + /// + /// The number of multiplayer servers to hosted on a single VM of the build. + /// + public int MultiplayerServerCountPerVm; + /// + /// The OS platform used for running the game process. + /// + public string OsPlatform; + /// + /// The ports the build is mapped on. + /// + public List Ports; + /// + /// The region configuration for the build. + /// + public List RegionConfigurations; + /// + /// The resource constraints to apply to each server on the VM. + /// + public ServerResourceConstraintParams ServerResourceConstraints; + /// + /// The type of game server being hosted. + /// + public string ServerType; + /// + /// The command to run when the multiplayer server has been allocated, including any arguments. This only applies to managed + /// builds. If the build is a custom build, this field will be null. + /// + public string StartMultiplayerServerCommand; + /// + /// The VM size the build was created on. + /// + public AzureVmSize? VmSize; + /// + /// The configuration for the VmStartupScript feature for the build + /// + public VmStartupScriptConfiguration VmStartupScriptConfiguration; + } + + /// + /// Gets credentials to the container registry where game developers can upload custom container images to before creating a + /// new build. + /// + [Serializable] + public class GetContainerRegistryCredentialsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetContainerRegistryCredentialsResponse : PlayFabResultCommon + { + /// + /// The url of the container registry. + /// + public string DnsName; + /// + /// The password for accessing the container registry. + /// + public string Password; + /// + /// The username for accessing the container registry. + /// + public string Username; + } + + /// + /// Request to get a lobby. + /// + [Serializable] + public class GetLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + } + + [Serializable] + public class GetLobbyResult : PlayFabResultCommon + { + /// + /// The information pertaining to the requested lobby. + /// + public Lobby Lobby; + } + + /// + /// Gets the current configuration for a queue. + /// + [Serializable] + public class GetMatchmakingQueueRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Id of the matchmaking queue to retrieve. + /// + public string QueueName; + } + + [Serializable] + public class GetMatchmakingQueueResult : PlayFabResultCommon + { + /// + /// The matchmaking queue config. + /// + public MatchmakingQueueConfig MatchmakingQueue; + } + + /// + /// The ticket includes the invited players, their attributes if they have joined, the ticket status, the match Id when + /// applicable, etc. Only servers, the ticket creator and the invited players can get the ticket. + /// + [Serializable] + public class GetMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the matchmaking attributes will be returned as an escaped JSON string or as an un-escaped JSON + /// object. + /// + public bool EscapeObject; + /// + /// The name of the queue to find a match for. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class GetMatchmakingTicketResult : PlayFabResultCommon + { + /// + /// The reason why the current ticket was canceled. This field is only set if the ticket is in canceled state. Please retry + /// if CancellationReason is RetryRequired. + /// + public string CancellationReasonString; + /// + /// Change number used for differentiating older matchmaking status updates from newer ones. + /// + public uint? ChangeNumber; + /// + /// The server date and time at which ticket was created. + /// + public DateTime Created; + /// + /// The Creator's entity key. + /// + public EntityKey Creator; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// A list of Users that have joined this ticket. + /// + public List Members; + /// + /// A list of PlayFab Ids of Users to match with. + /// + public List MembersToMatchWith; + /// + /// The Id of a match queue. + /// + public string QueueName; + /// + /// The current ticket status. Possible values are: WaitingForPlayers, WaitingForMatch, WaitingForServer, Canceled and + /// Matched. + /// + public string Status; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// When matchmaking has successfully matched together a collection of tickets, it produces a 'match' with an Id. The match + /// contains all of the players that were matched together, and their team assigments. Only servers and ticket members can + /// get the match. + /// + [Serializable] + public class GetMatchRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the matchmaking attributes will be returned as an escaped JSON string or as an un-escaped JSON + /// object. + /// + public bool EscapeObject; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// The name of the queue to join. + /// + public string QueueName; + /// + /// Determines whether the matchmaking attributes for each user should be returned in the response for match request. + /// + public bool ReturnMemberAttributes; + } + + [Serializable] + public class GetMatchResult : PlayFabResultCommon + { + /// + /// A string that is used by players that are matched together to join an arranged lobby. + /// + public string ArrangementString; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// A list of Users that are matched together, along with their team assignments. + /// + public List Members; + /// + /// A list of regions that the match could be played in sorted by preference. This value is only set if the queue has a + /// region selection rule. + /// + public List RegionPreferences; + /// + /// The details of the server that the match has been allocated to. + /// + public ServerDetails ServerDetails; + } + + /// + /// Gets multiplayer server session details for a build in a specific region. + /// + [Serializable] + public class GetMultiplayerServerDetailsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The title generated guid string session ID of the multiplayer server to get details for. This is to keep track of + /// multiplayer server sessions. + /// + public string SessionId; + } + + [Serializable] + public class GetMultiplayerServerDetailsResponse : PlayFabResultCommon + { + /// + /// The identity of the build in which the server was allocated. + /// + public string BuildId; + /// + /// The connected players in the multiplayer server. + /// + public List ConnectedPlayers; + /// + /// The fully qualified domain name of the virtual machine that is hosting this multiplayer server. + /// + public string FQDN; + /// + /// The IPv4 address of the virtual machine that is hosting this multiplayer server. + /// + public string IPV4Address; + /// + /// The time (UTC) at which a change in the multiplayer server state was observed. + /// + public DateTime? LastStateTransitionTime; + /// + /// The ports the multiplayer server uses. + /// + public List Ports; + /// + /// The region the multiplayer server is located in. + /// + public string Region; + /// + /// The string server ID of the multiplayer server generated by PlayFab. + /// + public string ServerId; + /// + /// The guid string session ID of the multiplayer server. + /// + public string SessionId; + /// + /// The state of the multiplayer server. + /// + public string State; + /// + /// The virtual machine ID that the multiplayer server is located on. + /// + public string VmId; + } + + /// + /// Gets multiplayer server logs for a specific server id in a region. The logs are available only after a server has + /// terminated. + /// + [Serializable] + public class GetMultiplayerServerLogsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The server ID of multiplayer server to get logs for. + /// + public string ServerId; + } + + [Serializable] + public class GetMultiplayerServerLogsResponse : PlayFabResultCommon + { + /// + /// URL for logs download. + /// + public string LogDownloadUrl; + } + + /// + /// Gets multiplayer server logs for a specific server id in a region. The logs are available only after a server has + /// terminated. + /// + [Serializable] + public class GetMultiplayerSessionLogsBySessionIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The server ID of multiplayer server to get logs for. + /// + public string SessionId; + } + + /// + /// Returns the matchmaking statistics for a queue. These include the number of players matching and the statistics related + /// to the time to match statistics in seconds (average and percentiles). Statistics are refreshed once every 5 minutes. + /// Servers can access all statistics no matter what the ClientStatisticsVisibility is configured to. Clients can access + /// statistics according to the ClientStatisticsVisibility. Client requests are forbidden if all visibility fields are + /// false. + /// + [Serializable] + public class GetQueueStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the queue. + /// + public string QueueName; + } + + [Serializable] + public class GetQueueStatisticsResult : PlayFabResultCommon + { + /// + /// The current number of players in the matchmaking queue, who are waiting to be matched. + /// + public uint? NumberOfPlayersMatching; + /// + /// Statistics representing the time (in seconds) it takes for tickets to find a match. + /// + public Statistics TimeToMatchStatisticsInSeconds; + } + + /// + /// Gets a remote login endpoint to a VM that is hosting a multiplayer server build in a specific region. + /// + [Serializable] + public class GetRemoteLoginEndpointRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the multiplayer server to get remote login information for. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The region of the multiplayer server to get remote login information for. + /// + public string Region; + /// + /// The virtual machine ID the multiplayer server is located on. + /// + public string VmId; + } + + [Serializable] + public class GetRemoteLoginEndpointResponse : PlayFabResultCommon + { + /// + /// The remote login IPV4 address of multiplayer server. + /// + public string IPV4Address; + /// + /// The remote login port of multiplayer server. + /// + public int Port; + } + + /// + /// The ticket includes the players, their attributes, their teams, the ticket status, the match Id and the server details + /// when applicable, etc. Only servers can get the ticket. + /// + [Serializable] + public class GetServerBackfillTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the matchmaking attributes will be returned as an escaped JSON string or as an un-escaped JSON + /// object. + /// + public bool EscapeObject; + /// + /// The name of the queue to find a match for. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class GetServerBackfillTicketResult : PlayFabResultCommon + { + /// + /// The reason why the current ticket was canceled. This field is only set if the ticket is in canceled state. + /// + public string CancellationReasonString; + /// + /// The server date and time at which ticket was created. + /// + public DateTime Created; + /// + /// How long to attempt matching this ticket in seconds. + /// + public int GiveUpAfterSeconds; + /// + /// The Id of a match. + /// + public string MatchId; + /// + /// A list of Users that are part of this ticket, along with their team assignments. + /// + public List Members; + /// + /// The Id of a match queue. + /// + public string QueueName; + /// + /// The details of the server the members are connected to. + /// + public ServerDetails ServerDetails; + /// + /// The current ticket status. Possible values are: WaitingForMatch, Canceled and Matched. + /// + public string Status; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + /// + /// Gets the status of whether a title is enabled for the multiplayer server feature. The enabled status can be + /// Initializing, Enabled, and Disabled. + /// + [Serializable] + public class GetTitleEnabledForMultiplayerServersStatusRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetTitleEnabledForMultiplayerServersStatusResponse : PlayFabResultCommon + { + /// + /// The enabled status for the multiplayer server features for the title. + /// + public TitleMultiplayerServerEnabledStatus? Status; + } + + /// + /// Gets a title's server quota change request. + /// + [Serializable] + public class GetTitleMultiplayerServersQuotaChangeRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the change request to get. + /// + public string RequestId; + } + + [Serializable] + public class GetTitleMultiplayerServersQuotaChangeResponse : PlayFabResultCommon + { + /// + /// The change request for this title. + /// + public QuotaChange Change; + } + + /// + /// Gets the quotas for a title in relation to multiplayer servers. + /// + [Serializable] + public class GetTitleMultiplayerServersQuotasRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class GetTitleMultiplayerServersQuotasResponse : PlayFabResultCommon + { + /// + /// The various quotas for multiplayer servers for the title. + /// + public TitleMultiplayerServersQuotas Quotas; + } + + [Serializable] + public class InstrumentationConfiguration : PlayFabBaseModel + { + /// + /// Designates whether windows instrumentation configuration will be enabled for this Build + /// + public bool? IsEnabled; + /// + /// This property is deprecated, use IsEnabled. The list of processes to be monitored on a VM for this build. Providing + /// processes will turn on performance metrics collection for this build. Process names should not include extensions. If + /// the game server process is: GameServer.exe; then, ProcessesToMonitor = [ GameServer ] + /// + public List ProcessesToMonitor; + } + + /// + /// Request to invite a player to a lobby the caller is already a member of. Only a client can invite another player to a + /// lobby. + /// + [Serializable] + public class InviteToLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity invited to the lobby. + /// + public EntityKey InviteeEntity; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The member entity sending the invite. Must be a member of the lobby. + /// + public EntityKey MemberEntity; + } + + /// + /// Request to join an arranged lobby. Only a client can join an arranged lobby. + /// + [Serializable] + public class JoinArrangedLobbyRequest : PlayFabRequestCommon + { + /// + /// The policy indicating who is allowed to join the lobby, and the visibility to queries. May be 'Public', 'Friends' or + /// 'Private'. Public means the lobby is both visible in queries and any player may join, including invited players. Friends + /// means that users who are bidirectional friends of members in the lobby may search to find friend lobbies, to retrieve + /// its connection string. Private means the lobby is not visible in queries, and a player must receive an invitation to + /// join. Defaults to 'Public' on creation. Can only be changed by the lobby owner. + /// + public AccessPolicy? AccessPolicy; + /// + /// A field which indicates which lobby the user will be joining. This field is opaque to everyone except the Lobby service + /// and the creator of the arrangementString (Matchmaking). This string defines a unique identifier for the arranged lobby + /// as well as the title and member the string is valid for. Arrangement strings have an expiration. + /// + public string ArrangementString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The maximum number of players allowed in the lobby. The value must be between 2 and 128. + /// + public uint MaxPlayers; + /// + /// The private key-value pairs used by the member to communicate information to other members and the owner. Visible to all + /// members of the lobby. At most 30 key-value pairs may be stored here, keys are limited to 30 characters and values to + /// 1000. The total size of all memberData values may not exceed 4096 bytes. Keys are case sensitive. + /// + public Dictionary MemberData; + /// + /// The member entity who is joining the lobby. The first member to join will be the lobby owner. + /// + public EntityKey MemberEntity; + /// + /// The policy for how a new owner is chosen. May be 'Automatic', 'Manual' or 'None'. Can only be specified by clients. If + /// client-owned and 'Automatic' - The Lobby service will automatically assign another connected owner when the current + /// owner leaves or disconnects. The useConnections property must be true. If client - owned and 'Manual' - Ownership is + /// protected as long as the current owner is connected. If the current owner leaves or disconnects any member may set + /// themselves as the current owner. The useConnections property must be true. If client-owned and 'None' - Any member can + /// set ownership. The useConnections property can be either true or false. + /// + public OwnerMigrationPolicy? OwnerMigrationPolicy; + /// + /// A setting to control whether connections are used. Defaults to true. When true, notifications are sent to subscribed + /// players, disconnect detection removes connectionHandles, only owner migration policies using connections are allowed, + /// and lobbies must have at least one connected member to be searchable or be a server hosted lobby with a connected + /// server. If false, then notifications are not sent, connections are not allowed, and lobbies do not need connections to + /// be searchable. + /// + public bool UseConnections; + } + + /// + /// Request to join a lobby. Only a client can join a lobby. + /// + [Serializable] + public class JoinLobbyRequest : PlayFabRequestCommon + { + /// + /// A field which indicates which lobby the user will be joining. This field is opaque to everyone except the Lobby service. + /// + public string ConnectionString; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The private key-value pairs used by the member to communicate information to other members and the owner. Visible to all + /// members of the lobby. At most 30 key-value pairs may be stored here, keys are limited to 30 characters and values to + /// 1000. The total size of all memberData values may not exceed 4096 bytes.Keys are case sensitive. + /// + public Dictionary MemberData; + /// + /// The member entity who is joining the lobby. + /// + public EntityKey MemberEntity; + } + + [Serializable] + public class JoinLobbyResult : PlayFabResultCommon + { + /// + /// Successfully joined lobby's id. + /// + public string LobbyId; + } + + /// + /// Add the player to a matchmaking ticket and specify all of its matchmaking attributes. Players can join a ticket if and + /// only if their EntityKeys are already listed in the ticket's Members list. The matchmaking service automatically starts + /// matching the ticket against other matchmaking tickets once all players have joined the ticket. It is not possible to + /// join a ticket once it has started matching. + /// + [Serializable] + public class JoinMatchmakingTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The User who wants to join the ticket. Their Id must be listed in PlayFabIdsToMatchWith. + /// + public MatchmakingPlayer Member; + /// + /// The name of the queue to join. + /// + public string QueueName; + /// + /// The Id of the ticket to find a match for. + /// + public string TicketId; + } + + [Serializable] + public class JoinMatchmakingTicketResult : PlayFabResultCommon + { + } + + /// + /// Request to leave a lobby. Only a client can leave a lobby. + /// + [Serializable] + public class LeaveLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The member entity leaving the lobby. + /// + public EntityKey MemberEntity; + } + + [Serializable] + public class LinearDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to Difference at every expansion interval. + /// + public double Delta; + /// + /// Once the total difference reaches this value, expansion stops. Optional. + /// + public double? Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearRegionSelectionRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to MaxLatency at every expansion interval. + /// + public uint Delta; + /// + /// Once the max Latency reaches this value, expansion stops. + /// + public uint Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearSetIntersectionRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to MinIntersectionSize at every expansion interval. + /// + public uint Delta; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearTeamDifferenceRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to Difference at every expansion interval. + /// + public double Delta; + /// + /// Once the total difference reaches this value, expansion stops. Optional. + /// + public double? Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinearTeamSizeBalanceRuleExpansion : PlayFabBaseModel + { + /// + /// This value gets added to Difference at every expansion interval. + /// + public uint Delta; + /// + /// Once the total difference reaches this value, expansion stops. Optional. + /// + public uint? Limit; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class LinuxInstrumentationConfiguration : PlayFabBaseModel + { + /// + /// Designates whether Linux instrumentation configuration will be enabled for this Build + /// + public bool IsEnabled; + } + + /// + /// Returns a list of multiplayer server game asset summaries for a title. + /// + [Serializable] + public class ListAssetSummariesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListAssetSummariesResponse : PlayFabResultCommon + { + /// + /// The list of asset summaries. + /// + public List AssetSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of summarized details of all multiplayer server builds for a title. + /// + [Serializable] + public class ListBuildAliasesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListBuildAliasesResponse : PlayFabResultCommon + { + /// + /// The list of build aliases for the title + /// + public List BuildAliases; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of summarized details of all multiplayer server builds for a title. + /// + [Serializable] + public class ListBuildSummariesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListBuildSummariesResponse : PlayFabResultCommon + { + /// + /// The list of build summaries for a title. + /// + public List BuildSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of multiplayer server game certificates for a title. + /// + [Serializable] + public class ListCertificateSummariesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListCertificateSummariesResponse : PlayFabResultCommon + { + /// + /// The list of game certificates. + /// + public List CertificateSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of the container images that have been uploaded to the container registry for a title. + /// + [Serializable] + public class ListContainerImagesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListContainerImagesResponse : PlayFabResultCommon + { + /// + /// The list of container images. + /// + public List Images; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of the tags for a particular container image that exists in the container registry for a title. + /// + [Serializable] + public class ListContainerImageTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The container images we want to list tags for. + /// + public string ImageName; + } + + [Serializable] + public class ListContainerImageTagsResponse : PlayFabResultCommon + { + /// + /// The list of tags for a particular container image. + /// + public List Tags; + } + + /// + /// Gets a list of all the matchmaking queue configurations for the title. + /// + [Serializable] + public class ListMatchmakingQueuesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListMatchmakingQueuesResult : PlayFabResultCommon + { + /// + /// The list of matchmaking queue configs for this title. + /// + public List MatchMakingQueues; + } + + /// + /// If the caller is a title, the EntityKey in the request is required. If the caller is a player, then it is optional. If + /// it is provided it must match the caller's entity. + /// + [Serializable] + public class ListMatchmakingTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key for which to find the ticket Ids. + /// + public EntityKey Entity; + /// + /// The name of the queue to find a match for. + /// + public string QueueName; + } + + [Serializable] + public class ListMatchmakingTicketsForPlayerResult : PlayFabResultCommon + { + /// + /// The list of ticket Ids the user is a member of. + /// + public List TicketIds; + } + + /// + /// Returns a list of multiplayer servers for a build in a specific region. + /// + [Serializable] + public class ListMultiplayerServersRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the multiplayer servers to list. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The region the multiplayer servers to list. + /// + public string Region; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListMultiplayerServersResponse : PlayFabResultCommon + { + /// + /// The list of multiplayer server summary details. + /// + public List MultiplayerServerSummaries; + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of quality of service servers for party. + /// + [Serializable] + public class ListPartyQosServersRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListPartyQosServersResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The list of QoS servers. + /// + public List QosServers; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// Returns a list of quality of service servers for a title. + /// + [Serializable] + public class ListQosServersForTitleRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates that the response should contain Qos servers for all regions, including those where there are no builds + /// deployed for the title. + /// + public bool? IncludeAllRegions; + } + + [Serializable] + public class ListQosServersForTitleResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The list of QoS servers. + /// + public List QosServers; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + } + + /// + /// List all server backfill ticket Ids the user is a member of. + /// + [Serializable] + public class ListServerBackfillTicketsForPlayerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity key for which to find the ticket Ids. + /// + public EntityKey Entity; + /// + /// The name of the queue the tickets are in. + /// + public string QueueName; + } + + [Serializable] + public class ListServerBackfillTicketsForPlayerResult : PlayFabResultCommon + { + /// + /// The list of backfill ticket Ids the user is a member of. + /// + public List TicketIds; + } + + /// + /// List all server quota change requests for a title. + /// + [Serializable] + public class ListTitleMultiplayerServersQuotaChangesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class ListTitleMultiplayerServersQuotaChangesResponse : PlayFabResultCommon + { + /// + /// All change requests for this title. + /// + public List Changes; + } + + /// + /// Returns a list of virtual machines for a title. + /// + [Serializable] + public class ListVirtualMachineSummariesRequest : PlayFabRequestCommon + { + /// + /// The guid string build ID of the virtual machines to list. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The page size for the request. + /// + public int? PageSize; + /// + /// The region of the virtual machines to list. + /// + public string Region; + /// + /// The skip token for the paged request. + /// + public string SkipToken; + } + + [Serializable] + public class ListVirtualMachineSummariesResponse : PlayFabResultCommon + { + /// + /// The page size on the response. + /// + public int PageSize; + /// + /// The skip token for the paged response. + /// + public string SkipToken; + /// + /// The list of virtual machine summaries. + /// + public List VirtualMachines; + } + + [Serializable] + public class Lobby : PlayFabBaseModel + { + /// + /// A setting indicating who is allowed to join this lobby, as well as see it in queries. + /// + public AccessPolicy AccessPolicy; + /// + /// A number that increments once for each request that modifies the lobby. + /// + public uint ChangeNumber; + /// + /// A string used to join the lobby. This field is populated by the Lobby service. Invites are performed by communicating + /// this connectionString to other players. + /// + public string ConnectionString; + /// + /// Lobby data. + /// + public Dictionary LobbyData; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. + /// + public uint MaxPlayers; + /// + /// Array of all lobby members. + /// + public List Members; + /// + /// A setting indicating whether members are allowed to join this lobby. When Locked new members are prevented from joining. + /// + public MembershipLock MembershipLock; + /// + /// The client or server entity which owns this lobby. + /// + public EntityKey Owner; + /// + /// A setting indicating the owner migration policy. If server owned, this field is not present. + /// + public OwnerMigrationPolicy? OwnerMigrationPolicy; + /// + /// An opaque string stored on a SubscribeToLobbyResource call, which indicates the connection an owner or member has with + /// PubSub. + /// + public string PubSubConnectionHandle; + /// + /// Search data. + /// + public Dictionary SearchData; + /// + /// A flag which determines if connections are used. Defaults to true. Only set on create. + /// + public bool UseConnections; + } + + [Serializable] + public class LobbyEmptyResult : PlayFabResultCommon + { + } + + [Serializable] + public class LobbySummary : PlayFabBaseModel + { + /// + /// A string used to join the lobby.This field is populated by the Lobby service.Invites are performed by communicating this + /// connectionString to other players. + /// + public string ConnectionString; + /// + /// The current number of players in the lobby. + /// + public uint CurrentPlayers; + /// + /// Id to uniquely identify a lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. + /// + public uint MaxPlayers; + /// + /// A setting indicating whether members are allowed to join this lobby. When Locked new members are prevented from joining. + /// + public MembershipLock? MembershipLock; + /// + /// The client or server entity which owns this lobby. + /// + public EntityKey Owner; + /// + /// Search data. + /// + public Dictionary SearchData; + } + + /// + /// A user in a matchmaking ticket. + /// + [Serializable] + public class MatchmakingPlayer : PlayFabBaseModel + { + /// + /// The user's attributes custom to the title. + /// + public MatchmakingPlayerAttributes Attributes; + /// + /// The entity key of the matchmaking user. + /// + public EntityKey Entity; + } + + /// + /// The matchmaking attributes for a user. + /// + [Serializable] + public class MatchmakingPlayerAttributes : PlayFabBaseModel + { + /// + /// A data object representing a user's attributes. + /// + public object DataObject; + /// + /// An escaped data object representing a user's attributes. + /// + public string EscapedDataObject; + } + + /// + /// A player in a created matchmaking match with a team assignment. + /// + [Serializable] + public class MatchmakingPlayerWithTeamAssignment : PlayFabBaseModel + { + /// + /// The user's attributes custom to the title. These attributes will be null unless the request has ReturnMemberAttributes + /// flag set to true. + /// + public MatchmakingPlayerAttributes Attributes; + /// + /// The entity key of the matchmaking user. + /// + public EntityKey Entity; + /// + /// The Id of the team the User is assigned to. + /// + public string TeamId; + } + + [Serializable] + public class MatchmakingQueueConfig : PlayFabBaseModel + { + /// + /// This is the buildAlias that will be used to allocate the multiplayer server for the match. + /// + public BuildAliasParams BuildAliasParams; + /// + /// This is the buildId that will be used to allocate the multiplayer server for the match. + /// + public string BuildId; + /// + /// List of difference rules used to find an optimal match. + /// + public List DifferenceRules; + /// + /// List of match total rules used to find an optimal match. + /// + public List MatchTotalRules; + /// + /// Maximum number of players in a match. + /// + public uint MaxMatchSize; + /// + /// Maximum number of players in a ticket. Optional. + /// + public uint? MaxTicketSize; + /// + /// Minimum number of players in a match. + /// + public uint MinMatchSize; + /// + /// Unique identifier for a Queue. Chosen by the developer. + /// + public string Name; + /// + /// Region selection rule used to find an optimal match. + /// + public RegionSelectionRule RegionSelectionRule; + /// + /// Boolean flag to enable server allocation for the queue. + /// + public bool ServerAllocationEnabled; + /// + /// List of set intersection rules used to find an optimal match. + /// + public List SetIntersectionRules; + /// + /// Controls which statistics are visible to players. + /// + public StatisticsVisibilityToPlayers StatisticsVisibilityToPlayers; + /// + /// List of string equality rules used to find an optimal match. + /// + public List StringEqualityRules; + /// + /// List of team difference rules used to find an optimal match. + /// + public List TeamDifferenceRules; + /// + /// The team configuration for a match. This may be null if there are no teams. + /// + public List Teams; + /// + /// Team size balance rule used to find an optimal match. + /// + public TeamSizeBalanceRule TeamSizeBalanceRule; + /// + /// Team ticket size similarity rule used to find an optimal match. + /// + public TeamTicketSizeSimilarityRule TeamTicketSizeSimilarityRule; + } + + [Serializable] + public class MatchmakingQueueTeam : PlayFabBaseModel + { + /// + /// The maximum number of players required for the team. + /// + public uint MaxTeamSize; + /// + /// The minimum number of players required for the team. + /// + public uint MinTeamSize; + /// + /// A name to identify the team. This is case insensitive. + /// + public string Name; + } + + [Serializable] + public class MatchTotalRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Collection of fields relating to expanding this rule at set intervals. + /// + public MatchTotalRuleExpansion Expansion; + /// + /// The maximum total value for a group. Must be >= Min. + /// + public double Max; + /// + /// The minimum total value for a group. Must be >=2. + /// + public double Min; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + [Serializable] + public class MatchTotalRuleExpansion : PlayFabBaseModel + { + /// + /// Manually specify the values to use for each expansion interval. When this is set, Max is ignored. + /// + public List MaxOverrides; + /// + /// Manually specify the values to use for each expansion interval. When this is set, Min is ignored. + /// + public List MinOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + [Serializable] + public class Member : PlayFabBaseModel + { + /// + /// Key-value pairs specific to member. + /// + public Dictionary MemberData; + /// + /// The member entity key. + /// + public EntityKey MemberEntity; + /// + /// Opaque string, stored on a Subscribe call, which indicates the connection an owner or member has with PubSub. + /// + public string PubSubConnectionHandle; + } + + public enum MembershipLock + { + Unlocked, + Locked + } + + [Serializable] + public class MonitoringApplicationConfiguration : PlayFabBaseModel + { + /// + /// Asset which contains the monitoring application files and scripts. + /// + public AssetReference AssetReference; + /// + /// Execution script name, this will be the main executable for the monitoring application. + /// + public string ExecutionScriptName; + /// + /// Installation script name, this will be run before the ExecutionScript. + /// + public string InstallationScriptName; + /// + /// Timespan the monitoring application will be kept alive when running from the start of the VM + /// + public double? OnStartRuntimeInMinutes; + } + + [Serializable] + public class MonitoringApplicationConfigurationParams : PlayFabBaseModel + { + /// + /// Asset which contains the monitoring application files and scripts. + /// + public AssetReferenceParams AssetReference; + /// + /// Execution script name, this will be the main executable for the monitoring application. + /// + public string ExecutionScriptName; + /// + /// Installation script name, this will be run before the ExecutionScript. + /// + public string InstallationScriptName; + /// + /// Timespan the monitoring application will be kept alive when running from the start of the VM + /// + public double? OnStartRuntimeInMinutes; + } + + [Serializable] + public class MultiplayerServerSummary : PlayFabBaseModel + { + /// + /// The connected players in the multiplayer server. + /// + public List ConnectedPlayers; + /// + /// The time (UTC) at which a change in the multiplayer server state was observed. + /// + public DateTime? LastStateTransitionTime; + /// + /// The region the multiplayer server is located in. + /// + public string Region; + /// + /// The string server ID of the multiplayer server generated by PlayFab. + /// + public string ServerId; + /// + /// The title generated guid string session ID of the multiplayer server. + /// + public string SessionId; + /// + /// The state of the multiplayer server. + /// + public string State; + /// + /// The virtual machine ID that the multiplayer server is located on. + /// + public string VmId; + } + + public enum OsPlatform + { + Windows, + Linux + } + + [Serializable] + public class OverrideDouble : PlayFabBaseModel + { + /// + /// The custom expansion value. + /// + public double Value; + } + + [Serializable] + public class OverrideUnsignedInt : PlayFabBaseModel + { + /// + /// The custom expansion value. + /// + public uint Value; + } + + public enum OwnerMigrationPolicy + { + None, + Automatic, + Manual, + Server + } + + [Serializable] + public class PaginationRequest : PlayFabBaseModel + { + /// + /// Continuation token returned as a result in a previous FindLobbies call. Cannot be specified by clients. + /// + public string ContinuationToken; + /// + /// The number of lobbies that should be retrieved. Cannot be specified by servers, clients may specify any value up to 50 + /// + public uint? PageSizeRequested; + } + + [Serializable] + public class PaginationResponse : PlayFabBaseModel + { + /// + /// Continuation token returned by server call. Not returned for clients + /// + public string ContinuationToken; + /// + /// The number of lobbies that matched the search request. + /// + public uint? TotalMatchedLobbyCount; + } + + [Serializable] + public class Port : PlayFabBaseModel + { + /// + /// The name for the port. + /// + public string Name; + /// + /// The number for the port. + /// + public int Num; + /// + /// The protocol for the port. + /// + public ProtocolType Protocol; + } + + public enum ProtocolType + { + TCP, + UDP + } + + [Serializable] + public class QosServer : PlayFabBaseModel + { + /// + /// The region the QoS server is located in. + /// + public string Region; + /// + /// The QoS server URL. + /// + public string ServerUrl; + } + + [Serializable] + public class QueueRuleAttribute : PlayFabBaseModel + { + /// + /// Specifies which attribute in a ticket to use. + /// + public string Path; + /// + /// Specifies which source the attribute comes from. + /// + public AttributeSource Source; + } + + [Serializable] + public class QuotaChange : PlayFabBaseModel + { + /// + /// A brief description of the requested changes. + /// + public string ChangeDescription; + /// + /// Requested changes to make to the titles cores quota. + /// + public List Changes; + /// + /// Whether or not this request is pending a review. + /// + public bool IsPendingReview; + /// + /// Additional information about this request that our team can use to better understand the requirements. + /// + public string Notes; + /// + /// Id of the change request. + /// + public string RequestId; + /// + /// Comments by our team when a request is reviewed. + /// + public string ReviewComments; + /// + /// Whether or not this request was approved. + /// + public bool WasApproved; + } + + [Serializable] + public class RegionSelectionRule : PlayFabBaseModel + { + /// + /// Controls how the Max Latency parameter expands over time. Only one expansion can be set per rule. When this is set, + /// MaxLatency is ignored. + /// + public CustomRegionSelectionRuleExpansion CustomExpansion; + /// + /// Controls how the Max Latency parameter expands over time. Only one expansion can be set per rule. + /// + public LinearRegionSelectionRuleExpansion LinearExpansion; + /// + /// Specifies the maximum latency that is allowed between the client and the selected server. The value is in milliseconds. + /// + public uint MaxLatency; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// Specifies which attribute in a ticket to use. + /// + public string Path; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + /// + /// Deletes the configuration for a queue. This will permanently delete the configuration and players will no longer be able + /// to match in the queue. All outstanding matchmaking tickets will be cancelled. + /// + [Serializable] + public class RemoveMatchmakingQueueRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The Id of the matchmaking queue to remove. + /// + public string QueueName; + } + + [Serializable] + public class RemoveMatchmakingQueueResult : PlayFabResultCommon + { + } + + /// + /// Request to remove a member from a lobby. Owners may remove other members from a lobby. Members cannot remove themselves + /// (use LeaveLobby instead). + /// + [Serializable] + public class RemoveMemberFromLobbyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The member entity to be removed from the lobby. + /// + public EntityKey MemberEntity; + /// + /// If true, removed member can never rejoin this lobby. + /// + public bool PreventRejoin; + } + + /// + /// Requests a multiplayer server session from a particular build in any of the given preferred regions. + /// + [Serializable] + public class RequestMultiplayerServerRequest : PlayFabRequestCommon + { + /// + /// The identifiers of the build alias to use for the request. + /// + public BuildAliasParams BuildAliasParams; + /// + /// The guid string build ID of the multiplayer server to request. + /// + public string BuildId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Initial list of players (potentially matchmade) allowed to connect to the game. This list is passed to the game server + /// when requested (via GSDK) and can be used to validate players connecting to it. + /// + public List InitialPlayers; + /// + /// The preferred regions to request a multiplayer server from. The Multiplayer Service will iterate through the regions in + /// the specified order and allocate a server from the first one that has servers available. + /// + public List PreferredRegions; + /// + /// Data encoded as a string that is passed to the game server when requested. This can be used to to communicate + /// information such as game mode or map through the request flow. + /// + public string SessionCookie; + /// + /// A guid string session ID created track the multiplayer server session over its life. + /// + public string SessionId; + } + + [Serializable] + public class RequestMultiplayerServerResponse : PlayFabResultCommon + { + /// + /// The identity of the build in which the server was allocated. + /// + public string BuildId; + /// + /// The connected players in the multiplayer server. + /// + public List ConnectedPlayers; + /// + /// The fully qualified domain name of the virtual machine that is hosting this multiplayer server. + /// + public string FQDN; + /// + /// The IPv4 address of the virtual machine that is hosting this multiplayer server. + /// + public string IPV4Address; + /// + /// The time (UTC) at which a change in the multiplayer server state was observed. + /// + public DateTime? LastStateTransitionTime; + /// + /// The ports the multiplayer server uses. + /// + public List Ports; + /// + /// The region the multiplayer server is located in. + /// + public string Region; + /// + /// The string server ID of the multiplayer server generated by PlayFab. + /// + public string ServerId; + /// + /// The guid string session ID of the multiplayer server. + /// + public string SessionId; + /// + /// The state of the multiplayer server. + /// + public string State; + /// + /// The virtual machine ID that the multiplayer server is located on. + /// + public string VmId; + } + + /// + /// Gets new credentials to the container registry where game developers can upload custom container images to before + /// creating a new build. + /// + [Serializable] + public class RolloverContainerRegistryCredentialsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class RolloverContainerRegistryCredentialsResponse : PlayFabResultCommon + { + /// + /// The url of the container registry. + /// + public string DnsName; + /// + /// The password for accessing the container registry. + /// + public string Password; + /// + /// The username for accessing the container registry. + /// + public string Username; + } + + [Serializable] + public class Schedule : PlayFabBaseModel + { + /// + /// A short description about this schedule. For example, "Game launch on July 15th". + /// + public string Description; + /// + /// The date and time in UTC at which the schedule ends. If IsRecurringWeekly is true, this schedule will keep renewing for + /// future weeks until disabled or removed. + /// + public DateTime EndTime; + /// + /// Disables the schedule. + /// + public bool IsDisabled; + /// + /// If true, the StartTime and EndTime will get renewed every week. + /// + public bool IsRecurringWeekly; + /// + /// The date and time in UTC at which the schedule starts. + /// + public DateTime StartTime; + /// + /// The standby target to maintain for the duration of the schedule. + /// + public int TargetStandby; + } + + [Serializable] + public class ScheduledStandbySettings : PlayFabBaseModel + { + /// + /// When true, scheduled standby will be enabled + /// + public bool IsEnabled; + /// + /// A list of non-overlapping schedules + /// + public List ScheduleList; + } + + [Serializable] + public class ServerDetails : PlayFabBaseModel + { + /// + /// The fully qualified domain name of the virtual machine that is hosting this multiplayer server. + /// + public string Fqdn; + /// + /// The IPv4 address of the virtual machine that is hosting this multiplayer server. + /// + public string IPV4Address; + /// + /// The ports the multiplayer server uses. + /// + public List Ports; + /// + /// The server's region. + /// + public string Region; + } + + [Serializable] + public class ServerResourceConstraintParams : PlayFabBaseModel + { + /// + /// The maximum number of cores that each server is allowed to use. + /// + public double CpuLimit; + /// + /// The maximum number of GiB of memory that each server is allowed to use. WARNING: After exceeding this limit, the server + /// will be killed + /// + public double MemoryLimitGB; + } + + public enum ServerType + { + Container, + Process + } + + [Serializable] + public class SetIntersectionRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Describes the behavior when an attribute is not specified in the ticket creation request or in the user's entity + /// profile. + /// + public AttributeNotSpecifiedBehavior AttributeNotSpecifiedBehavior; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. When this + /// is set, MinIntersectionSize is ignored. + /// + public CustomSetIntersectionRuleExpansion CustomExpansion; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is UseDefault). Values must be unique. + /// + public List DefaultAttributeValue; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. + /// + public LinearSetIntersectionRuleExpansion LinearExpansion; + /// + /// The minimum number of values that must match between sets. + /// + public uint MinIntersectionSize; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + /// + /// Use this API to create or update matchmaking queue configurations. The queue configuration defines the matchmaking + /// rules. The matchmaking service will match tickets together according to the configured rules. Queue resources are not + /// spun up by calling this API. Queues are created when the first ticket is submitted. + /// + [Serializable] + public class SetMatchmakingQueueRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The matchmaking queue config. + /// + public MatchmakingQueueConfig MatchmakingQueue; + } + + [Serializable] + public class SetMatchmakingQueueResult : PlayFabResultCommon + { + } + + /// + /// Executes the shutdown callback from the GSDK and terminates the multiplayer server session. The callback in the GSDK + /// will allow for graceful shutdown with a 15 minute timeoutIf graceful shutdown has not been completed before 15 minutes + /// have elapsed, the multiplayer server session will be forcefully terminated on it's own. + /// + [Serializable] + public class ShutdownMultiplayerServerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// A guid string session ID of the multiplayer server to shut down. + /// + public string SessionId; + } + + [Serializable] + public class Statistics : PlayFabBaseModel + { + /// + /// The average. + /// + public double Average; + /// + /// The 50th percentile. + /// + public double Percentile50; + /// + /// The 90th percentile. + /// + public double Percentile90; + /// + /// The 99th percentile. + /// + public double Percentile99; + } + + [Serializable] + public class StatisticsVisibilityToPlayers : PlayFabBaseModel + { + /// + /// Whether to allow players to view the current number of players in the matchmaking queue. + /// + public bool ShowNumberOfPlayersMatching; + /// + /// Whether to allow players to view statistics representing the time it takes for tickets to find a match. + /// + public bool ShowTimeToMatch; + } + + [Serializable] + public class StringEqualityRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match tickets. + /// + public QueueRuleAttribute Attribute; + /// + /// Describes the behavior when an attribute is not specified in the ticket creation request or in the user's entity + /// profile. + /// + public AttributeNotSpecifiedBehavior AttributeNotSpecifiedBehavior; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is false). + /// + public string DefaultAttributeValue; + /// + /// Collection of fields relating to expanding this rule at set intervals. For StringEqualityRules, this is limited to + /// turning the rule off or on during different intervals. + /// + public StringEqualityRuleExpansion Expansion; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + /// + /// The relative weight of this rule compared to others. + /// + public double Weight; + } + + [Serializable] + public class StringEqualityRuleExpansion : PlayFabBaseModel + { + /// + /// List of bools specifying whether the rule is applied during this expansion. + /// + public List EnabledOverrides; + /// + /// How many seconds before this rule is expanded. + /// + public uint SecondsBetweenExpansions; + } + + /// + /// Request to subscribe to lobby resource notifications. + /// + [Serializable] + public class SubscribeToLobbyResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity performing the subscription. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to subscribe to. + /// + public string ResourceId; + /// + /// Version number for the subscription of this resource. + /// + public uint SubscriptionVersion; + /// + /// Subscription type. + /// + public SubscriptionType Type; + } + + [Serializable] + public class SubscribeToLobbyResourceResult : PlayFabResultCommon + { + /// + /// Topic will be returned in all notifications that are the result of this subscription. + /// + public string Topic; + } + + /// + /// Subscribe to match resource notifications. Match subscriptions have two types; MatchInvite and MatchTicketStatusChange + /// + [Serializable] + public class SubscribeToMatchResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity performing the subscription. The entity must be authorized to use this connectionHandle. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. Notifications will be sent to the connection + /// associated with this handle. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to subscribe to. It follows the format {queueName}|{ticketId} for MatchTicketStatusChange. For + /// MatchInvite, ResourceId is @me. + /// + public string ResourceId; + /// + /// Version number for the subscription of this resource. Current supported version must be 1. + /// + public uint SubscriptionVersion; + /// + /// Subscription type. MatchInvite subscriptions are per-player. MatchTicketStatusChange subscriptions are per-ticket. + /// Subscribe calls are idempotent. Subscribing on the same resource for the same connection results in success. + /// + public string Type; + } + + [Serializable] + public class SubscribeToMatchResourceResult : PlayFabResultCommon + { + /// + /// Matchmaking resource + /// + public string Topic; + } + + public enum SubscriptionType + { + LobbyChange, + LobbyInvite + } + + [Serializable] + public class TeamDifferenceRule : PlayFabBaseModel + { + /// + /// Description of the attribute used by this rule to match teams. + /// + public QueueRuleAttribute Attribute; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. When this + /// is set, Difference is ignored. + /// + public CustomTeamDifferenceRuleExpansion CustomExpansion; + /// + /// The default value assigned to tickets that are missing the attribute specified by AttributePath (assuming that + /// AttributeNotSpecifiedBehavior is false). + /// + public double DefaultAttributeValue; + /// + /// The allowed difference between any two teams at the start of matchmaking. + /// + public double Difference; + /// + /// Collection of fields relating to expanding this rule at set intervals. Only one expansion can be set per rule. + /// + public LinearTeamDifferenceRuleExpansion LinearExpansion; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + } + + [Serializable] + public class TeamSizeBalanceRule : PlayFabBaseModel + { + /// + /// Controls how the Difference parameter expands over time. Only one expansion can be set per rule. When this is set, + /// Difference is ignored. + /// + public CustomTeamSizeBalanceRuleExpansion CustomExpansion; + /// + /// The allowed difference in team size between any two teams. + /// + public uint Difference; + /// + /// Controls how the Difference parameter expands over time. Only one expansion can be set per rule. + /// + public LinearTeamSizeBalanceRuleExpansion LinearExpansion; + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + } + + [Serializable] + public class TeamTicketSizeSimilarityRule : PlayFabBaseModel + { + /// + /// Friendly name chosen by developer. + /// + public string Name; + /// + /// How many seconds before this rule is no longer enforced (but tickets that comply with this rule will still be + /// prioritized over those that don't). Leave blank if this rule is always enforced. + /// + public uint? SecondsUntilOptional; + } + + public enum TitleMultiplayerServerEnabledStatus + { + Initializing, + Enabled, + Disabled + } + + [Serializable] + public class TitleMultiplayerServersQuotas : PlayFabBaseModel + { + /// + /// The core capacity for the various regions and VM Family + /// + public List CoreCapacities; + } + + /// + /// Request to unsubscribe from lobby notifications. + /// + [Serializable] + public class UnsubscribeFromLobbyResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity which performed the subscription. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to unsubscribe from. + /// + public string ResourceId; + /// + /// Version number passed for the subscription of this resource. + /// + public uint SubscriptionVersion; + /// + /// Subscription type. + /// + public SubscriptionType Type; + } + + /// + /// Unsubscribe from a Match resource's notifications. For MatchInvite, players are expected to unsubscribe once they can no + /// longer accept invites. For MatchTicketStatusChange, players are expected to unsusbcribe once the ticket has reached a + /// canceled or matched state. + /// + [Serializable] + public class UnsubscribeFromMatchResourceRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity performing the unsubscription. The entity must be authorized to use this connectionHandle. + /// + public EntityKey EntityKey; + /// + /// Opaque string, given to a client upon creating a connection with PubSub. + /// + public string PubSubConnectionHandle; + /// + /// The name of the resource to unsubscribe from. It follows the format {queueName}|{ticketId} for MatchTicketStatusChange. + /// For MatchInvite, ResourceId is @me. + /// + public string ResourceId; + /// + /// Version number for the unsubscription from this resource. + /// + public uint SubscriptionVersion; + /// + /// Type of the subscription to be canceled. + /// + public string Type; + } + + [Serializable] + public class UnsubscribeFromMatchResourceResult : PlayFabResultCommon + { + } + + /// + /// Removes the specified tag from the image. After this operation, a 'docker pull' will fail for the specified image and + /// tag combination. Morever, ListContainerImageTags will not return the specified tag. + /// + [Serializable] + public class UntagContainerImageRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The container image which tag we want to remove. + /// + public string ImageName; + /// + /// The tag we want to remove. + /// + public string Tag; + } + + /// + /// Creates a multiplayer server build alias and returns the created alias. + /// + [Serializable] + public class UpdateBuildAliasRequest : PlayFabRequestCommon + { + /// + /// The guid string alias Id of the alias to be updated. + /// + public string AliasId; + /// + /// The alias name. + /// + public string AliasName; + /// + /// Array of build selection criteria. + /// + public List BuildSelectionCriteria; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Updates a multiplayer server build's name. + /// + [Serializable] + public class UpdateBuildNameRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update the name of. + /// + public string BuildId; + /// + /// The build name. + /// + public string BuildName; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Updates a multiplayer server build's region. + /// + [Serializable] + public class UpdateBuildRegionRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update regions for. + /// + public string BuildId; + /// + /// The updated region configuration that should be applied to the specified build. + /// + public BuildRegionParams BuildRegion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Updates a multiplayer server build's regions. + /// + [Serializable] + public class UpdateBuildRegionsRequest : PlayFabRequestCommon + { + /// + /// The guid string ID of the build we want to update regions for. + /// + public string BuildId; + /// + /// The updated region configuration that should be applied to the specified build. + /// + public List BuildRegions; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + /// + /// Request to update a lobby. + /// + [Serializable] + public class UpdateLobbyRequest : PlayFabRequestCommon + { + /// + /// The policy indicating who is allowed to join the lobby, and the visibility to queries. May be 'Public', 'Friends' or + /// 'Private'. Public means the lobby is both visible in queries and any player may join, including invited players. Friends + /// means that users who are bidirectional friends of members in the lobby may search to find friend lobbies, to retrieve + /// its connection string. Private means the lobby is not visible in queries, and a player must receive an invitation to + /// join. Defaults to 'Public' on creation. Can only be changed by the lobby owner. + /// + public AccessPolicy? AccessPolicy; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The private key-value pairs which are only visible to members of the lobby. Optional. Sets or updates key-value pairs on + /// the lobby. Only the current lobby owner can set lobby data. Keys may be an arbitrary string of at most 30 characters. + /// The total size of all lobbyData values may not exceed 4096 bytes. Values are not individually limited. There can be up + /// to 30 key-value pairs stored here. Keys are case sensitive. + /// + public Dictionary LobbyData; + /// + /// The keys to delete from the lobby LobbyData. Optional. Behaves similar to searchDataToDelete, but applies to lobbyData. + /// + public List LobbyDataToDelete; + /// + /// The id of the lobby. + /// + public string LobbyId; + /// + /// The maximum number of players allowed in the lobby. Updates the maximum allowed number of players in the lobby. Only the + /// current lobby owner can set this. If set, the value must be greater than or equal to the number of members currently in + /// the lobby. + /// + public uint? MaxPlayers; + /// + /// The private key-value pairs used by the member to communicate information to other members and the owner. Optional. Sets + /// or updates new key-value pairs on the caller's member data. New keys will be added with their values and existing keys + /// will be updated with the new values. Visible to all members of the lobby. At most 30 key-value pairs may be stored here, + /// keys are limited to 30 characters and values to 1000. The total size of all memberData values may not exceed 4096 bytes. + /// Keys are case sensitive. Servers cannot specifiy this. + /// + public Dictionary MemberData; + /// + /// The keys to delete from the lobby MemberData. Optional. Deletes key-value pairs on the caller's member data. All the + /// specified keys will be removed from the caller's member data. Keys that do not exist are a no-op. If the key to delete + /// exists in the memberData (same request) it will result in a bad request. Servers cannot specifiy this. + /// + public List MemberDataToDelete; + /// + /// The member entity whose data is being modified. Servers cannot specify this. + /// + public EntityKey MemberEntity; + /// + /// A setting indicating whether the lobby is locked. May be 'Unlocked' or 'Locked'. When Locked new members are not allowed + /// to join. Defaults to 'Unlocked' on creation. Can only be changed by the lobby owner. + /// + public MembershipLock? MembershipLock; + /// + /// The lobby owner. Optional. Set to transfer ownership of the lobby. If client - owned and 'Automatic' - The Lobby service + /// will automatically assign another connected owner when the current owner leaves or disconnects. useConnections must be + /// true. If client - owned and 'Manual' - Ownership is protected as long as the current owner is connected. If the current + /// owner leaves or disconnects any member may set themselves as the current owner. The useConnections property must be + /// true. If client-owned and 'None' - Any member can set ownership. The useConnections property can be either true or + /// false. For all client-owned lobbies when the owner leaves and a new owner can not be automatically selected - The owner + /// field is set to null. For all client-owned lobbies when the owner disconnects and a new owner can not be automatically + /// selected - The owner field remains unchanged and the current owner retains all owner abilities for the lobby. If + /// server-owned (must be 'Server') - Any server can set ownership. The useConnections property must be true. + /// + public EntityKey Owner; + /// + /// The public key-value pairs which allow queries to differentiate between lobbies. Optional. Sets or updates key-value + /// pairs on the lobby for use with queries. Only the current lobby owner can set search data. New keys will be added with + /// their values and existing keys will be updated with the new values. There can be up to 30 key-value pairs stored here. + /// Keys are of the format string_key1, string_key2... string_key30 for string values, or number_key1, number_key2, ... + /// number_key30 for numeric values. Numeric values are floats. Values can be at most 256 characters long. The total size of + /// all searchData values may not exceed 1024 bytes.Keys are case sensitive. + /// + public Dictionary SearchData; + /// + /// The keys to delete from the lobby SearchData. Optional. Deletes key-value pairs on the lobby. Only the current lobby + /// owner can delete search data. All the specified keys will be removed from the search data. Keys that do not exist in the + /// lobby are a no-op.If the key to delete exists in the searchData (same request) it will result in a bad request. + /// + public List SearchDataToDelete; + } + + /// + /// Uploads a multiplayer server game certificate. + /// + [Serializable] + public class UploadCertificateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The game certificate to upload. + /// + public Certificate GameCertificate; + } + + [Serializable] + public class VirtualMachineSummary : PlayFabBaseModel + { + /// + /// The virtual machine health status. + /// + public string HealthStatus; + /// + /// The virtual machine state. + /// + public string State; + /// + /// The virtual machine ID. + /// + public string VmId; + } + + [Serializable] + public class VmStartupScriptConfiguration : PlayFabBaseModel + { + /// + /// Optional port requests (name/protocol) that will be used by the VmStartupScript. Max of 5 requests. + /// + public List PortRequests; + /// + /// Asset which contains the VmStartupScript script and any other required files. + /// + public AssetReference VmStartupScriptAssetReference; + } + + [Serializable] + public class VmStartupScriptParams : PlayFabBaseModel + { + /// + /// Optional port requests (name/protocol) that will be used by the VmStartupScript. Max of 5 requests. + /// + public List PortRequests; + /// + /// Asset which contains the VmStartupScript script and any other required files. + /// + public AssetReferenceParams VmStartupScriptAssetReference; + } + + [Serializable] + public class VmStartupScriptPortRequest : PlayFabBaseModel + { + /// + /// The name for the port. + /// + public string Name; + /// + /// The protocol for the port. + /// + public ProtocolType Protocol; + } + + [Serializable] + public class VmStartupScriptPortRequestParams : PlayFabBaseModel + { + /// + /// The name for the port. + /// + public string Name; + /// + /// The protocol for the port. + /// + public ProtocolType Protocol; + } + + [Serializable] + public class WindowsCrashDumpConfiguration : PlayFabBaseModel + { + /// + /// See https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps for valid values. + /// + public int? CustomDumpFlags; + /// + /// See https://docs.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps for valid values. + /// + public int? DumpType; + /// + /// Designates whether automatic crash dump capturing will be enabled for this Build. + /// + public bool IsEnabled; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta new file mode 100644 index 00000000..f6ca95fd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Multiplayer/PlayFabMultiplayerModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c9c53dd06e97f414cafc09e35d9f24aa +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef new file mode 100644 index 00000000..bb74f7cb --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef @@ -0,0 +1,12 @@ +{ + "name": "PlayFab", + "optionalUnityReferences": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef.meta new file mode 100644 index 00000000..e1a45097 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/PlayFab.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0da6d172d18a54e4389d0dce1e1ffdf2 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles.meta new file mode 100644 index 00000000..cd65838d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: eb038585995bfe148853edfdae25b48c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs new file mode 100644 index 00000000..a2989c13 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs @@ -0,0 +1,26 @@ +#if !DISABLE_PLAYFABENTITY_API +using PlayFab.ProfilesModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnProfilesGetGlobalPolicyRequestEvent; + public event PlayFabResultEvent OnProfilesGetGlobalPolicyResultEvent; + public event PlayFabRequestEvent OnProfilesGetProfileRequestEvent; + public event PlayFabResultEvent OnProfilesGetProfileResultEvent; + public event PlayFabRequestEvent OnProfilesGetProfilesRequestEvent; + public event PlayFabResultEvent OnProfilesGetProfilesResultEvent; + public event PlayFabRequestEvent OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent; + public event PlayFabResultEvent OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent; + public event PlayFabRequestEvent OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent; + public event PlayFabResultEvent OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent; + public event PlayFabRequestEvent OnProfilesSetGlobalPolicyRequestEvent; + public event PlayFabResultEvent OnProfilesSetGlobalPolicyResultEvent; + public event PlayFabRequestEvent OnProfilesSetProfileLanguageRequestEvent; + public event PlayFabResultEvent OnProfilesSetProfileLanguageResultEvent; + public event PlayFabRequestEvent OnProfilesSetProfilePolicyRequestEvent; + public event PlayFabResultEvent OnProfilesSetProfilePolicyResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta new file mode 100644 index 00000000..7b89c240 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 108a292bd382f6c4a88576ed2173cb93 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs new file mode 100644 index 00000000..21b891d4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs @@ -0,0 +1,145 @@ +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ProfilesModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// All PlayFab entities have profiles, which hold top-level properties about the entity. These APIs give you the tools + /// needed to manage entity profiles. The Master Player APIs allow you to perform operations on a master player account + /// + public static class PlayFabProfilesAPI + { + static PlayFabProfilesAPI() {} + + + /// + /// Verify entity login. + /// + public static bool IsEntityLoggedIn() + { + return PlayFabSettings.staticPlayer.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Gets the global title access policy + /// + public static void GetGlobalPolicy(GetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the entity's profile. + /// + public static void GetProfile(GetEntityProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetProfile", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the entity's profile. + /// + public static void GetProfiles(GetEntityProfilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetProfiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title player accounts associated with the given master player account. + /// + public static void GetTitlePlayersFromMasterPlayerAccountIds(GetTitlePlayersFromMasterPlayerAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromMasterPlayerAccountIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title player accounts associated with the given XUIDs. + /// + public static void GetTitlePlayersFromXboxLiveIDs(GetTitlePlayersFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromXboxLiveIDs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the global title access policy + /// + public static void SetGlobalPolicy(SetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/SetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the entity's language. The precedence hierarchy for communication to the player is Title Player Account + /// language, Master Player Account language, and then title default language if the first two aren't set or supported. + /// + public static void SetProfileLanguage(SetProfileLanguageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/SetProfileLanguage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the profiles access policy + /// + public static void SetProfilePolicy(SetEntityProfilePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + + + PlayFabHttp.MakeApiCall("/Profile/SetProfilePolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta new file mode 100644 index 00000000..eb3d8cb1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 04039b10ae9eebd46a8c4a5b401ea567 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs new file mode 100644 index 00000000..cc2f4417 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs @@ -0,0 +1,147 @@ +#if !DISABLE_PLAYFABENTITY_API + +using System; +using System.Collections.Generic; +using PlayFab.ProfilesModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// All PlayFab entities have profiles, which hold top-level properties about the entity. These APIs give you the tools + /// needed to manage entity profiles. The Master Player APIs allow you to perform operations on a master player account + /// + public class PlayFabProfilesInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabProfilesInstanceAPI(PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + authenticationContext = context; + } + + public PlayFabProfilesInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + if (context == null) + throw new PlayFabException(PlayFabExceptionCode.AuthContextRequired, "Context cannot be null, create a PlayFabAuthenticationContext for each player in advance, or call .GetAuthenticationContext()"); + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Verify entity login. + /// + public bool IsEntityLoggedIn() + { + return authenticationContext == null ? false : authenticationContext.IsEntityLoggedIn(); + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Gets the global title access policy + /// + public void GetGlobalPolicy(GetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the entity's profile. + /// + public void GetProfile(GetEntityProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetProfile", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the entity's profile. + /// + public void GetProfiles(GetEntityProfilesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetProfiles", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title player accounts associated with the given master player account. + /// + public void GetTitlePlayersFromMasterPlayerAccountIds(GetTitlePlayersFromMasterPlayerAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromMasterPlayerAccountIds", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title player accounts associated with the given XUIDs. + /// + public void GetTitlePlayersFromXboxLiveIDs(GetTitlePlayersFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/GetTitlePlayersFromXboxLiveIDs", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the global title access policy + /// + public void SetGlobalPolicy(SetGlobalPolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/SetGlobalPolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the entity's language. The precedence hierarchy for communication to the player is Title Player Account + /// language, Master Player Account language, and then title default language if the first two aren't set or supported. + /// + public void SetProfileLanguage(SetProfileLanguageRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/SetProfileLanguage", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the profiles access policy + /// + public void SetProfilePolicy(SetEntityProfilePolicyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (!context.IsEntityLoggedIn()) throw new PlayFabException(PlayFabExceptionCode.NotLoggedIn,"Must be logged in to call this method"); + PlayFabHttp.MakeApiCall("/Profile/SetProfilePolicy", request, AuthType.EntityToken, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta new file mode 100644 index 00000000..ffd238a7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ef2cfc8d3e49a7e479e1fe8c2cf18478 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs new file mode 100644 index 00000000..834c1c2d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs @@ -0,0 +1,495 @@ +#if !DISABLE_PLAYFABENTITY_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ProfilesModels +{ + public enum EffectType + { + Allow, + Deny + } + + /// + /// An entity object and its associated meta data. + /// + [Serializable] + public class EntityDataObject : PlayFabBaseModel + { + /// + /// Un-escaped JSON object, if DataAsObject is true. + /// + public object DataObject; + /// + /// Escaped string JSON body of the object, if DataAsObject is default or false. + /// + public string EscapedDataObject; + /// + /// Name of this object. + /// + public string ObjectName; + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityLineage : PlayFabBaseModel + { + /// + /// The Character Id of the associated entity. + /// + public string CharacterId; + /// + /// The Group Id of the associated entity. + /// + public string GroupId; + /// + /// The Master Player Account Id of the associated entity. + /// + public string MasterPlayerAccountId; + /// + /// The Namespace Id of the associated entity. + /// + public string NamespaceId; + /// + /// The Title Id of the associated entity. + /// + public string TitleId; + /// + /// The Title Player Account Id of the associated entity. + /// + public string TitlePlayerAccountId; + } + + [Serializable] + public class EntityPermissionStatement : PlayFabBaseModel + { + /// + /// The action this statement effects. May be 'Read', 'Write' or '*' for both read and write. + /// + public string Action; + /// + /// A comment about the statement. Intended solely for bookkeeping and debugging. + /// + public string Comment; + /// + /// Additional conditions to be applied for entity resources. + /// + public object Condition; + /// + /// The effect this statement will have. It may be either Allow or Deny + /// + public EffectType Effect; + /// + /// The principal this statement will effect. + /// + public object Principal; + /// + /// The resource this statements effects. Similar to 'pfrn:data--title![Title ID]/Profile/*' + /// + public string Resource; + } + + [Serializable] + public class EntityProfileBody : PlayFabBaseModel + { + /// + /// Avatar URL for the entity. + /// + public string AvatarUrl; + /// + /// The creation time of this profile in UTC. + /// + public DateTime Created; + /// + /// The display name of the entity. This field may serve different purposes for different entity types. i.e.: for a title + /// player account it could represent the display name of the player, whereas on a character it could be character's name. + /// + public string DisplayName; + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The chain of responsibility for this entity. Use Lineage. + /// + public string EntityChain; + /// + /// The experiment variants of this profile. + /// + public List ExperimentVariants; + /// + /// The files on this profile. + /// + public Dictionary Files; + /// + /// The language on this profile. + /// + public string Language; + /// + /// Leaderboard metadata for the entity. + /// + public string LeaderboardMetadata; + /// + /// The lineage of this profile. + /// + public EntityLineage Lineage; + /// + /// The objects on this profile. + /// + public Dictionary Objects; + /// + /// The permissions that govern access to this entity profile and its properties. Only includes permissions set on this + /// profile, not global statements from titles and namespaces. + /// + public List Permissions; + /// + /// The statistics on this profile. + /// + public Dictionary Statistics; + /// + /// The version number of the profile in persistent storage at the time of the read. Used for optional optimistic + /// concurrency during update. + /// + public int VersionNumber; + } + + /// + /// An entity file's meta data. To get a download URL call File/GetFiles API. + /// + [Serializable] + public class EntityProfileFileMetadata : PlayFabBaseModel + { + /// + /// Checksum value for the file, can be used to check if the file on the server has changed. + /// + public string Checksum; + /// + /// Name of the file + /// + public string FileName; + /// + /// Last UTC time the file was modified + /// + public DateTime LastModified; + /// + /// Storage service's reported byte count + /// + public int Size; + } + + [Serializable] + public class EntityStatisticChildValue : PlayFabBaseModel + { + /// + /// Child name value, if child statistic + /// + public string ChildName; + /// + /// Child statistic metadata + /// + public string Metadata; + /// + /// Child statistic value + /// + public int Value; + } + + [Serializable] + public class EntityStatisticValue : PlayFabBaseModel + { + /// + /// Child statistic values + /// + public Dictionary ChildStatistics; + /// + /// Statistic metadata + /// + public string Metadata; + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int? Value; + /// + /// Statistic version + /// + public int Version; + } + + /// + /// Given an entity type and entity identifier will retrieve the profile from the entity store. If the profile being + /// retrieved is the caller's, then the read operation is consistent, if not it is an inconsistent read. An inconsistent + /// read means that we do not guarantee all committed writes have occurred before reading the profile, allowing for a stale + /// read. If consistency is important the Version Number on the result can be used to compare which version of the profile + /// any reader has. + /// + [Serializable] + public class GetEntityProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the objects will be returned as an escaped JSON string or as a un-escaped JSON object. Default is + /// JSON string. + /// + public bool? DataAsObject; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetEntityProfileResponse : PlayFabResultCommon + { + /// + /// Entity profile + /// + public EntityProfileBody Profile; + } + + /// + /// Given a set of entity types and entity identifiers will retrieve all readable profiles properties for the caller. + /// Profiles that the caller is not allowed to read will silently not be included in the results. + /// + [Serializable] + public class GetEntityProfilesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Determines whether the objects will be returned as an escaped JSON string or as a un-escaped JSON object. Default is + /// JSON string. + /// + public bool? DataAsObject; + /// + /// Entity keys of the profiles to load. Must be between 1 and 25 + /// + public List Entities; + } + + [Serializable] + public class GetEntityProfilesResponse : PlayFabResultCommon + { + /// + /// Entity profiles + /// + public List Profiles; + } + + /// + /// Retrieves the title access policy that is used before the profile's policy is inspected during a request. If never + /// customized this will return the default starter policy built by PlayFab. + /// + [Serializable] + public class GetGlobalPolicyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + } + + [Serializable] + public class GetGlobalPolicyResponse : PlayFabResultCommon + { + /// + /// The permissions that govern access to all entities under this title or namespace. + /// + public List Permissions; + } + + /// + /// Given a master player account id (PlayFab ID), returns all title player accounts associated with it. + /// + [Serializable] + public class GetTitlePlayersFromMasterPlayerAccountIdsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Master player account ids. + /// + public List MasterPlayerAccountIds; + /// + /// Id of title to get players from. + /// + public string TitleId; + } + + [Serializable] + public class GetTitlePlayersFromMasterPlayerAccountIdsResponse : PlayFabResultCommon + { + /// + /// Optional id of title to get players from, required if calling using a master_player_account. + /// + public string TitleId; + /// + /// Dictionary of master player ids mapped to title player entity keys and id pairs + /// + public Dictionary TitlePlayerAccounts; + } + + [Serializable] + public class GetTitlePlayersFromProviderIDsResponse : PlayFabResultCommon + { + /// + /// Dictionary of provider identifiers mapped to title_player_account lineage. Missing lineage indicates the player either + /// doesn't exist or doesn't play the requested title. + /// + public Dictionary TitlePlayerAccounts; + } + + /// + /// Given a collection of Xbox IDs (XUIDs), returns all title player accounts. + /// + [Serializable] + public class GetTitlePlayersFromXboxLiveIDsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Xbox Sandbox the players had on their Xbox tokens. + /// + public string Sandbox; + /// + /// Optional ID of title to get players from, required if calling using a master_player_account. + /// + public string TitleId; + /// + /// List of Xbox Live XUIDs + /// + public List XboxLiveIds; + } + + public enum OperationTypes + { + Created, + Updated, + Deleted, + None + } + + /// + /// This will set the access policy statements on the given entity profile. This is not additive, any existing statements + /// will be replaced with the statements in this request. + /// + [Serializable] + public class SetEntityProfilePolicyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The entity to perform this action on. + /// + public EntityKey Entity; + /// + /// The statements to include in the access policy. + /// + public List Statements; + } + + [Serializable] + public class SetEntityProfilePolicyResponse : PlayFabResultCommon + { + /// + /// The permissions that govern access to this entity profile and its properties. Only includes permissions set on this + /// profile, not global statements from titles and namespaces. + /// + public List Permissions; + } + + /// + /// Updates the title access policy that is used before the profile's policy is inspected during a request. Policies are + /// compiled and cached for several minutes so an update here may not be reflected in behavior for a short time. + /// + [Serializable] + public class SetGlobalPolicyRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The permissions that govern access to all entities under this title or namespace. + /// + public List Permissions; + } + + [Serializable] + public class SetGlobalPolicyResponse : PlayFabResultCommon + { + } + + /// + /// Given an entity profile, will update its language to the one passed in if the profile's version is equal to the one + /// passed in. + /// + [Serializable] + public class SetProfileLanguageRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The optional entity to perform this action on. Defaults to the currently logged in entity. + /// + public EntityKey Entity; + /// + /// The expected version of a profile to perform this update on + /// + public int? ExpectedVersion; + /// + /// The language to set on the given entity. Deletes the profile's language if passed in a null string. + /// + public string Language; + } + + [Serializable] + public class SetProfileLanguageResponse : PlayFabResultCommon + { + /// + /// The type of operation that occured on the profile's language + /// + public OperationTypes? OperationResult; + /// + /// The updated version of the profile after the language update + /// + public int? VersionNumber; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta new file mode 100644 index 00000000..9250c5c9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Profiles/PlayFabProfilesModels.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d7cf1e15acb646e4eaf8ef5d951b1477 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server.meta new file mode 100644 index 00000000..6b50bbf5 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: be1738c19ed8d48468d5163ea56f2b1e +folderAsset: yes +timeCreated: 1468524875 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs new file mode 100644 index 00000000..39ee3476 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs @@ -0,0 +1,292 @@ +#if ENABLE_PLAYFABSERVER_API +using PlayFab.ServerModels; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public event PlayFabRequestEvent OnServerAddCharacterVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerAddCharacterVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerAddFriendRequestEvent; + public event PlayFabResultEvent OnServerAddFriendResultEvent; + public event PlayFabRequestEvent OnServerAddGenericIDRequestEvent; + public event PlayFabResultEvent OnServerAddGenericIDResultEvent; + public event PlayFabRequestEvent OnServerAddPlayerTagRequestEvent; + public event PlayFabResultEvent OnServerAddPlayerTagResultEvent; + public event PlayFabRequestEvent OnServerAddSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnServerAddSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnServerAddUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerAddUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerAuthenticateSessionTicketRequestEvent; + public event PlayFabResultEvent OnServerAuthenticateSessionTicketResultEvent; + public event PlayFabRequestEvent OnServerAwardSteamAchievementRequestEvent; + public event PlayFabResultEvent OnServerAwardSteamAchievementResultEvent; + public event PlayFabRequestEvent OnServerBanUsersRequestEvent; + public event PlayFabResultEvent OnServerBanUsersResultEvent; + public event PlayFabRequestEvent OnServerConsumeItemRequestEvent; + public event PlayFabResultEvent OnServerConsumeItemResultEvent; + public event PlayFabRequestEvent OnServerCreateSharedGroupRequestEvent; + public event PlayFabResultEvent OnServerCreateSharedGroupResultEvent; + public event PlayFabRequestEvent OnServerDeleteCharacterFromUserRequestEvent; + public event PlayFabResultEvent OnServerDeleteCharacterFromUserResultEvent; + public event PlayFabRequestEvent OnServerDeletePlayerRequestEvent; + public event PlayFabResultEvent OnServerDeletePlayerResultEvent; + public event PlayFabRequestEvent OnServerDeletePushNotificationTemplateRequestEvent; + public event PlayFabResultEvent OnServerDeletePushNotificationTemplateResultEvent; + public event PlayFabRequestEvent OnServerDeleteSharedGroupRequestEvent; + public event PlayFabResultEvent OnServerDeleteSharedGroupResultEvent; + public event PlayFabRequestEvent OnServerDeregisterGameRequestEvent; + public event PlayFabResultEvent OnServerDeregisterGameResultEvent; + public event PlayFabRequestEvent OnServerEvaluateRandomResultTableRequestEvent; + public event PlayFabResultEvent OnServerEvaluateRandomResultTableResultEvent; + public event PlayFabRequestEvent OnServerExecuteCloudScriptRequestEvent; + public event PlayFabResultEvent OnServerExecuteCloudScriptResultEvent; + public event PlayFabRequestEvent OnServerGetAllSegmentsRequestEvent; + public event PlayFabResultEvent OnServerGetAllSegmentsResultEvent; + public event PlayFabRequestEvent OnServerGetAllUsersCharactersRequestEvent; + public event PlayFabResultEvent OnServerGetAllUsersCharactersResultEvent; + public event PlayFabRequestEvent OnServerGetCatalogItemsRequestEvent; + public event PlayFabResultEvent OnServerGetCatalogItemsResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterDataRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterDataResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterInventoryRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterInventoryResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterLeaderboardRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterLeaderboardResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerGetCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnServerGetCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnServerGetContentDownloadUrlRequestEvent; + public event PlayFabResultEvent OnServerGetContentDownloadUrlResultEvent; + public event PlayFabRequestEvent OnServerGetFriendLeaderboardRequestEvent; + public event PlayFabResultEvent OnServerGetFriendLeaderboardResultEvent; + public event PlayFabRequestEvent OnServerGetFriendsListRequestEvent; + public event PlayFabResultEvent OnServerGetFriendsListResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardAroundCharacterRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardAroundCharacterResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardAroundUserRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardAroundUserResultEvent; + public event PlayFabRequestEvent OnServerGetLeaderboardForUserCharactersRequestEvent; + public event PlayFabResultEvent OnServerGetLeaderboardForUserCharactersResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerCombinedInfoRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerCombinedInfoResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerProfileRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerProfileResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerSegmentsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerSegmentsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayersInSegmentRequestEvent; + public event PlayFabResultEvent OnServerGetPlayersInSegmentResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerStatisticVersionsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerStatisticVersionsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayerTagsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayerTagsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromFacebookIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromFacebookIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromGenericIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromGenericIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromSteamIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromSteamIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromTwitchIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromTwitchIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent; + public event PlayFabResultEvent OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent; + public event PlayFabRequestEvent OnServerGetPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerGetPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerGetRandomResultTablesRequestEvent; + public event PlayFabResultEvent OnServerGetRandomResultTablesResultEvent; + public event PlayFabRequestEvent OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent; + public event PlayFabResultEvent OnServerGetServerCustomIDsFromPlayFabIDsResultEvent; + public event PlayFabRequestEvent OnServerGetSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnServerGetSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnServerGetStoreItemsRequestEvent; + public event PlayFabResultEvent OnServerGetStoreItemsResultEvent; + public event PlayFabRequestEvent OnServerGetTimeRequestEvent; + public event PlayFabResultEvent OnServerGetTimeResultEvent; + public event PlayFabRequestEvent OnServerGetTitleDataRequestEvent; + public event PlayFabResultEvent OnServerGetTitleDataResultEvent; + public event PlayFabRequestEvent OnServerGetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetTitleNewsRequestEvent; + public event PlayFabResultEvent OnServerGetTitleNewsResultEvent; + public event PlayFabRequestEvent OnServerGetUserAccountInfoRequestEvent; + public event PlayFabResultEvent OnServerGetUserAccountInfoResultEvent; + public event PlayFabRequestEvent OnServerGetUserBansRequestEvent; + public event PlayFabResultEvent OnServerGetUserBansResultEvent; + public event PlayFabRequestEvent OnServerGetUserDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserInventoryRequestEvent; + public event PlayFabResultEvent OnServerGetUserInventoryResultEvent; + public event PlayFabRequestEvent OnServerGetUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerGetUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerGetUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerGrantCharacterToUserRequestEvent; + public event PlayFabResultEvent OnServerGrantCharacterToUserResultEvent; + public event PlayFabRequestEvent OnServerGrantItemsToCharacterRequestEvent; + public event PlayFabResultEvent OnServerGrantItemsToCharacterResultEvent; + public event PlayFabRequestEvent OnServerGrantItemsToUserRequestEvent; + public event PlayFabResultEvent OnServerGrantItemsToUserResultEvent; + public event PlayFabRequestEvent OnServerGrantItemsToUsersRequestEvent; + public event PlayFabResultEvent OnServerGrantItemsToUsersResultEvent; + public event PlayFabRequestEvent OnServerLinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnServerLinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnServerLinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnServerLinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnServerLinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnServerLinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnServerLinkServerCustomIdRequestEvent; + public event PlayFabResultEvent OnServerLinkServerCustomIdResultEvent; + public event PlayFabRequestEvent OnServerLinkSteamIdRequestEvent; + public event PlayFabResultEvent OnServerLinkSteamIdResultEvent; + public event PlayFabRequestEvent OnServerLinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnServerLinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnServerLoginWithServerCustomIdRequestEvent; + public event PlayFabResultEvent OnServerLoginWithServerCustomIdResultEvent; + public event PlayFabRequestEvent OnServerLoginWithSteamIdRequestEvent; + public event PlayFabResultEvent OnServerLoginWithSteamIdResultEvent; + public event PlayFabRequestEvent OnServerLoginWithXboxRequestEvent; + public event PlayFabResultEvent OnServerLoginWithXboxResultEvent; + public event PlayFabRequestEvent OnServerLoginWithXboxIdRequestEvent; + public event PlayFabResultEvent OnServerLoginWithXboxIdResultEvent; + public event PlayFabRequestEvent OnServerModifyItemUsesRequestEvent; + public event PlayFabResultEvent OnServerModifyItemUsesResultEvent; + public event PlayFabRequestEvent OnServerMoveItemToCharacterFromCharacterRequestEvent; + public event PlayFabResultEvent OnServerMoveItemToCharacterFromCharacterResultEvent; + public event PlayFabRequestEvent OnServerMoveItemToCharacterFromUserRequestEvent; + public event PlayFabResultEvent OnServerMoveItemToCharacterFromUserResultEvent; + public event PlayFabRequestEvent OnServerMoveItemToUserFromCharacterRequestEvent; + public event PlayFabResultEvent OnServerMoveItemToUserFromCharacterResultEvent; + public event PlayFabRequestEvent OnServerNotifyMatchmakerPlayerLeftRequestEvent; + public event PlayFabResultEvent OnServerNotifyMatchmakerPlayerLeftResultEvent; + public event PlayFabRequestEvent OnServerRedeemCouponRequestEvent; + public event PlayFabResultEvent OnServerRedeemCouponResultEvent; + public event PlayFabRequestEvent OnServerRedeemMatchmakerTicketRequestEvent; + public event PlayFabResultEvent OnServerRedeemMatchmakerTicketResultEvent; + public event PlayFabRequestEvent OnServerRefreshGameServerInstanceHeartbeatRequestEvent; + public event PlayFabResultEvent OnServerRefreshGameServerInstanceHeartbeatResultEvent; + public event PlayFabRequestEvent OnServerRegisterGameRequestEvent; + public event PlayFabResultEvent OnServerRegisterGameResultEvent; + public event PlayFabRequestEvent OnServerRemoveFriendRequestEvent; + public event PlayFabResultEvent OnServerRemoveFriendResultEvent; + public event PlayFabRequestEvent OnServerRemoveGenericIDRequestEvent; + public event PlayFabResultEvent OnServerRemoveGenericIDResultEvent; + public event PlayFabRequestEvent OnServerRemovePlayerTagRequestEvent; + public event PlayFabResultEvent OnServerRemovePlayerTagResultEvent; + public event PlayFabRequestEvent OnServerRemoveSharedGroupMembersRequestEvent; + public event PlayFabResultEvent OnServerRemoveSharedGroupMembersResultEvent; + public event PlayFabRequestEvent OnServerReportPlayerRequestEvent; + public event PlayFabResultEvent OnServerReportPlayerResultEvent; + public event PlayFabRequestEvent OnServerRevokeAllBansForUserRequestEvent; + public event PlayFabResultEvent OnServerRevokeAllBansForUserResultEvent; + public event PlayFabRequestEvent OnServerRevokeBansRequestEvent; + public event PlayFabResultEvent OnServerRevokeBansResultEvent; + public event PlayFabRequestEvent OnServerRevokeInventoryItemRequestEvent; + public event PlayFabResultEvent OnServerRevokeInventoryItemResultEvent; + public event PlayFabRequestEvent OnServerRevokeInventoryItemsRequestEvent; + public event PlayFabResultEvent OnServerRevokeInventoryItemsResultEvent; + public event PlayFabRequestEvent OnServerSavePushNotificationTemplateRequestEvent; + public event PlayFabResultEvent OnServerSavePushNotificationTemplateResultEvent; + public event PlayFabRequestEvent OnServerSendCustomAccountRecoveryEmailRequestEvent; + public event PlayFabResultEvent OnServerSendCustomAccountRecoveryEmailResultEvent; + public event PlayFabRequestEvent OnServerSendEmailFromTemplateRequestEvent; + public event PlayFabResultEvent OnServerSendEmailFromTemplateResultEvent; + public event PlayFabRequestEvent OnServerSendPushNotificationRequestEvent; + public event PlayFabResultEvent OnServerSendPushNotificationResultEvent; + public event PlayFabRequestEvent OnServerSendPushNotificationFromTemplateRequestEvent; + public event PlayFabResultEvent OnServerSendPushNotificationFromTemplateResultEvent; + public event PlayFabRequestEvent OnServerSetFriendTagsRequestEvent; + public event PlayFabResultEvent OnServerSetFriendTagsResultEvent; + public event PlayFabRequestEvent OnServerSetGameServerInstanceDataRequestEvent; + public event PlayFabResultEvent OnServerSetGameServerInstanceDataResultEvent; + public event PlayFabRequestEvent OnServerSetGameServerInstanceStateRequestEvent; + public event PlayFabResultEvent OnServerSetGameServerInstanceStateResultEvent; + public event PlayFabRequestEvent OnServerSetGameServerInstanceTagsRequestEvent; + public event PlayFabResultEvent OnServerSetGameServerInstanceTagsResultEvent; + public event PlayFabRequestEvent OnServerSetPlayerSecretRequestEvent; + public event PlayFabResultEvent OnServerSetPlayerSecretResultEvent; + public event PlayFabRequestEvent OnServerSetPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerSetPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerSetTitleDataRequestEvent; + public event PlayFabResultEvent OnServerSetTitleDataResultEvent; + public event PlayFabRequestEvent OnServerSetTitleInternalDataRequestEvent; + public event PlayFabResultEvent OnServerSetTitleInternalDataResultEvent; + public event PlayFabRequestEvent OnServerSubtractCharacterVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerSubtractCharacterVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerSubtractUserVirtualCurrencyRequestEvent; + public event PlayFabResultEvent OnServerSubtractUserVirtualCurrencyResultEvent; + public event PlayFabRequestEvent OnServerUnlinkNintendoServiceAccountRequestEvent; + public event PlayFabResultEvent OnServerUnlinkNintendoServiceAccountResultEvent; + public event PlayFabRequestEvent OnServerUnlinkNintendoSwitchDeviceIdRequestEvent; + public event PlayFabResultEvent OnServerUnlinkNintendoSwitchDeviceIdResultEvent; + public event PlayFabRequestEvent OnServerUnlinkPSNAccountRequestEvent; + public event PlayFabResultEvent OnServerUnlinkPSNAccountResultEvent; + public event PlayFabRequestEvent OnServerUnlinkServerCustomIdRequestEvent; + public event PlayFabResultEvent OnServerUnlinkServerCustomIdResultEvent; + public event PlayFabRequestEvent OnServerUnlinkSteamIdRequestEvent; + public event PlayFabResultEvent OnServerUnlinkSteamIdResultEvent; + public event PlayFabRequestEvent OnServerUnlinkXboxAccountRequestEvent; + public event PlayFabResultEvent OnServerUnlinkXboxAccountResultEvent; + public event PlayFabRequestEvent OnServerUnlockContainerInstanceRequestEvent; + public event PlayFabResultEvent OnServerUnlockContainerInstanceResultEvent; + public event PlayFabRequestEvent OnServerUnlockContainerItemRequestEvent; + public event PlayFabResultEvent OnServerUnlockContainerItemResultEvent; + public event PlayFabRequestEvent OnServerUpdateAvatarUrlRequestEvent; + public event PlayFabResultEvent OnServerUpdateAvatarUrlResultEvent; + public event PlayFabRequestEvent OnServerUpdateBansRequestEvent; + public event PlayFabResultEvent OnServerUpdateBansResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterInternalDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterInternalDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateCharacterStatisticsRequestEvent; + public event PlayFabResultEvent OnServerUpdateCharacterStatisticsResultEvent; + public event PlayFabRequestEvent OnServerUpdatePlayerStatisticsRequestEvent; + public event PlayFabResultEvent OnServerUpdatePlayerStatisticsResultEvent; + public event PlayFabRequestEvent OnServerUpdateSharedGroupDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateSharedGroupDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserInternalDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserInternalDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserInventoryItemCustomDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserInventoryItemCustomDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserPublisherDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserPublisherDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserPublisherInternalDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserPublisherInternalDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserPublisherReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserPublisherReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerUpdateUserReadOnlyDataRequestEvent; + public event PlayFabResultEvent OnServerUpdateUserReadOnlyDataResultEvent; + public event PlayFabRequestEvent OnServerWriteCharacterEventRequestEvent; + public event PlayFabResultEvent OnServerWriteCharacterEventResultEvent; + public event PlayFabRequestEvent OnServerWritePlayerEventRequestEvent; + public event PlayFabResultEvent OnServerWritePlayerEventResultEvent; + public event PlayFabRequestEvent OnServerWriteTitleEventRequestEvent; + public event PlayFabResultEvent OnServerWriteTitleEventResultEvent; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta new file mode 100644 index 00000000..0cac239c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0d5076be1f923f141a2a5ea2a53a1385 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs new file mode 100644 index 00000000..01cf1cca --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs @@ -0,0 +1,1953 @@ +#if ENABLE_PLAYFABSERVER_API && !DISABLE_PLAYFAB_STATIC_API + +using System; +using System.Collections.Generic; +using PlayFab.ServerModels; +using PlayFab.Internal; + +namespace PlayFab +{ + /// + /// Provides functionality to allow external (developer-controlled) servers to interact with user inventories and data in a + /// trusted manner, and to handle matchmaking and client connection orchestration + /// + public static class PlayFabServerAPI + { + static PlayFabServerAPI() {} + + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public static void ForgetAllCredentials() + { + PlayFabSettings.staticPlayer.ForgetAllCredentials(); + } + + /// + /// Increments the character's balance of the specified virtual currency by the stated amount + /// + public static void AddCharacterVirtualCurrency(AddCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the Friend user to the friendlist of the user with PlayFabId. At least one of + /// FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public static void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public static void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group (and the server) can add new members. Shared Groups are designed for sharing data between a very small + /// number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Increments the user's balance of the specified virtual currency by the stated amount + /// + public static void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Validated a client's session ticket, and if successful, returns details for that user + /// + public static void AuthenticateSessionTicket(AuthenticateSessionTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AuthenticateSessionTicket", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Awards the specified users the specified Steam achievements + /// + public static void AwardSteamAchievement(AwardSteamAchievementRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/AwardSteamAchievement", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public static void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's inventory. + /// + public static void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ConsumeItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. When created by a server, the group will initially have no members. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/CreateSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes the specific character ID from the specified user. + /// + public static void DeleteCharacterFromUser(DeleteCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeleteCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public static void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes push notification template for title + /// + public static void DeletePushNotificationTemplate(DeletePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeletePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Deletes a shared group, freeing up the shared group ID to be reused for a new group. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void DeleteSharedGroup(DeleteSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeleteSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Inform the matchmaker that a Game Server Instance is removed. + /// + [Obsolete("No longer available", true)] + public static void DeregisterGame(DeregisterGameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/DeregisterGame", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns the result of an evaluation of a Random Result Table - the ItemId from the game Catalog which would have been + /// added to the player inventory, if the Random Result Table were added via a Bundle or a call to UnlockContainer. + /// + public static void EvaluateRandomResultTable(EvaluateRandomResultTableRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/EvaluateRandomResultTable", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public static void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + public static void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public static void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public static void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetAllUsersCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public static void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user's character which cannot be accessed by the client + /// + public static void GetCharacterInternalData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the specified character's current inventory of virtual goods + /// + public static void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user's character which can only be read by the client + /// + public static void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the details of all title-specific statistics for the specific character + /// + public static void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public static void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetContentDownloadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked friends of the given player for the given statistic, starting from the indicated point in the + /// leaderboard + /// + public static void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetFriendLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current friends for the user with PlayFabId, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public static void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetFriendsList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public static void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested user + /// + public static void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the currently signed-in user + /// + public static void GetLeaderboardAroundUser(GetLeaderboardAroundUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public static void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardForUserCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Returns whatever info is requested in the response for the user. Note that PII (like email address, facebook id) may be + /// returned. All parameters default to false. + /// + public static void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerCombinedInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the player's profile + /// + public static void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public static void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public static void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current version and values for the indicated statistics, for the local player. + /// + public static void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public static void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public static void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public static void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Games identifiers. + /// + public static void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public static void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromGenericIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public static void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public static void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public static void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public static void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromSteamIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public static void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromTwitchIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public static void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public static void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the configuration information for the specified random results tables for the title, including all ItemId + /// values and weights + /// + public static void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the associated PlayFab account identifiers for the given set of server custom identifiers. + /// + public static void GetServerCustomIDsFromPlayFabIDs(GetServerCustomIDsFromPlayFabIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetServerCustomIDsFromPlayFabIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. The server can access all + /// public and private group data. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the set of items defined for the specified store, including all prices defined, for the specified player + /// + public static void GetStoreItems(GetStoreItemsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the current server time + /// + public static void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTime", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public static void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the key-value store of custom internal title settings + /// + public static void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public static void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetTitleNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the relevant details for a specified user + /// + public static void GetUserAccountInfo(GetUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Gets all bans for a user. + /// + public static void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the specified user's current inventory of virtual goods + /// + public static void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public static void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public static void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public static void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantCharacterToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified items to the specified character's inventory + /// + public static void GrantItemsToCharacter(GrantItemsToCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantItemsToCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified items to the specified user's inventory + /// + public static void GrantItemsToUser(GrantItemsToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the specified items to the specified user inventories + /// + public static void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account + /// + public static void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public static void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public static void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the custom server identifier, generated by the title, to the user's PlayFab account. + /// + public static void LinkServerCustomId(LinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public static void LinkSteamId(LinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public static void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Securely login a game client from an external server backend using a custom identifier for that player. Server Custom ID + /// and Client Custom ID are mutually exclusive and cannot be used to retrieve the same player account. + /// + public static void LoginWithServerCustomId(LoginWithServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using an Steam ID, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user + /// + public static void LoginWithSteamId(LoginWithSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using a Xbox Live Token from an external server backend, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public static void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithXbox", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Signs the user in using an Xbox ID and Sandbox ID, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public static void LoginWithXboxId(LoginWithXboxIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/LoginWithXboxId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Modifies the number of remaining uses of a player's inventory item + /// + public static void ModifyItemUses(ModifyItemUsesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ModifyItemUses", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Moves an item from a character's inventory into another of the users's character's inventory. + /// + public static void MoveItemToCharacterFromCharacter(MoveItemToCharacterFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Moves an item from a user's inventory into their character's inventory. + /// + public static void MoveItemToCharacterFromUser(MoveItemToCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Moves an item from a character's inventory into the owning user's inventory. + /// + public static void MoveItemToUserFromCharacter(MoveItemToUserFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/MoveItemToUserFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Informs the PlayFab match-making service that the user specified has left the Game Server Instance + /// + [Obsolete("No longer available", true)] + public static void NotifyMatchmakerPlayerLeft(NotifyMatchmakerPlayerLeftRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/NotifyMatchmakerPlayerLeft", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public static void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RedeemCoupon", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Validates a Game Server session ticket and returns details about the user + /// + [Obsolete("No longer available", true)] + public static void RedeemMatchmakerTicket(RedeemMatchmakerTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RedeemMatchmakerTicket", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Set the state of the indicated Game Server Instance. Also update the heartbeat for the instance. + /// + [Obsolete("No longer available", true)] + public static void RefreshGameServerInstanceHeartbeat(RefreshGameServerInstanceHeartbeatRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RefreshGameServerInstanceHeartbeat", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Inform the matchmaker that a new Game Server Instance is added. + /// + [Obsolete("No longer available", true)] + public static void RegisterGame(RegisterGameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RegisterGame", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes the specified friend from the the user's friend list + /// + public static void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemoveFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public static void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemoveGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public static void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RemoveSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Submit a report about a player (due to bad bahavior, etc.) on behalf of another player, so that customer service + /// representatives for the title can take action concerning potentially toxic players. + /// + public static void ReportPlayer(ReportPlayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/ReportPlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans for a user. + /// + public static void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public static void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revokes access to an item in a user's inventory + /// + public static void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Revokes access for up to 25 items across multiple users and characters. + /// + public static void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Saves push notification template for title + /// + public static void SavePushNotificationTemplate(SavePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SavePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Forces an email to be sent to the registered contact email address for the user's account based on an account recovery + /// email template + /// + public static void SendCustomAccountRecoveryEmail(SendCustomAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendCustomAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sends an email based on an email template to a player's contact email + /// + public static void SendEmailFromTemplate(SendEmailFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendEmailFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sends an iOS/Android Push Notification to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public static void SendPushNotification(SendPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sends an iOS/Android Push Notification template to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public static void SendPushNotificationFromTemplate(SendPushNotificationFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SendPushNotificationFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the tag list for a specified user in the friend list of another user + /// + public static void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetFriendTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the custom data of the indicated Game Server Instance + /// + [Obsolete("No longer available", true)] + public static void SetGameServerInstanceData(SetGameServerInstanceDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetGameServerInstanceData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Set the state of the indicated Game Server Instance. + /// + [Obsolete("No longer available", true)] + public static void SetGameServerInstanceState(SetGameServerInstanceStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetGameServerInstanceState", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Set custom tags for the specified Game Server Instance + /// + [Obsolete("No longer available", true)] + public static void SetGameServerInstanceTags(SetGameServerInstanceTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetGameServerInstanceTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public static void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public static void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom title settings + /// + public static void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value store of custom title settings + /// + public static void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Decrements the character's balance of the specified virtual currency by the stated amount. It is possible to make a VC + /// balance negative with this API. + /// + public static void SubtractCharacterVirtualCurrency(SubtractCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SubtractCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make a VC + /// balance negative with this API. + /// + public static void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account + /// + public static void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public static void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public static void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the custom server identifier from the user's PlayFab account. + /// + public static void UnlinkServerCustomId(UnlinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public static void UnlinkSteamId(UnlinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public static void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Opens a specific container (ContainerItemInstanceId), with a specific key (KeyItemInstanceId, when required), and + /// returns the contents of the opened container. If the container (and key when relevant) are consumable (RemainingUses > + /// 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public static void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlockContainerInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Searches Player or Character inventory for any ItemInstance matching the given CatalogItemId, if necessary unlocks it + /// using any appropriate key, and returns the contents of the opened container. If the container (and key when relevant) + /// are consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of + /// ConsumeItem. + /// + public static void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UnlockContainerItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Update the avatar URL of the specified player + /// + public static void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateAvatarUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public static void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public static void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user's character which cannot be accessed by the client + /// + public static void UpdateCharacterInternalData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user's character which can only be read by the client + /// + public static void UpdateCharacterReadOnlyData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character + /// + public static void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the values of the specified title-specific statistics for the user + /// + public static void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdatePlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group (and the server) can update the data. Shared Groups are + /// designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public static void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the key-value pair data tagged to the specified item, which is read-only from the client. + /// + public static void UpdateUserInventoryItemCustomData(UpdateUserInventoryItemDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserInventoryItemCustomData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public static void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public static void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public static void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public static void WriteCharacterEvent(WriteServerCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/WriteCharacterEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public static void WritePlayerEvent(WriteServerPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/WritePlayerEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public static void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? PlayFabSettings.staticPlayer; + var callSettings = PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + + + PlayFabHttp.MakeApiCall("/Server/WriteTitleEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings); + } + + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta new file mode 100644 index 00000000..259a32e7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d1e12172e1632754fa9cf42f58d7bc9e +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs new file mode 100644 index 00000000..d362d399 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs @@ -0,0 +1,1692 @@ +#if ENABLE_PLAYFABSERVER_API + +using System; +using System.Collections.Generic; +using PlayFab.ServerModels; +using PlayFab.Internal; +using PlayFab.SharedModels; + +namespace PlayFab +{ + /// + /// Provides functionality to allow external (developer-controlled) servers to interact with user inventories and data in a + /// trusted manner, and to handle matchmaking and client connection orchestration + /// + public class PlayFabServerInstanceAPI : IPlayFabInstanceApi + { + public readonly PlayFabApiSettings apiSettings = null; + public readonly PlayFabAuthenticationContext authenticationContext = null; + + public PlayFabServerInstanceAPI() { } + + public PlayFabServerInstanceAPI(PlayFabApiSettings settings) + { + apiSettings = settings; + } + + public PlayFabServerInstanceAPI(PlayFabAuthenticationContext context) + { + authenticationContext = context; + } + + public PlayFabServerInstanceAPI(PlayFabApiSettings settings, PlayFabAuthenticationContext context) + { + apiSettings = settings; + authenticationContext = context; + } + + /// + /// Clear the Client SessionToken which allows this Client to call API calls requiring login. + /// A new/fresh login will be required after calling this. + /// + public void ForgetAllCredentials() + { + if (authenticationContext != null) + { + authenticationContext.ForgetAllCredentials(); + } + } + + /// + /// Increments the character's balance of the specified virtual currency by the stated amount + /// + public void AddCharacterVirtualCurrency(AddCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the Friend user to the friendlist of the user with PlayFabId. At least one of + /// FriendPlayFabId,FriendUsername,FriendEmail, or FriendTitleDisplayName should be initialized. + /// + public void AddFriend(AddFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified generic service identifier to the player's PlayFab account. This is designed to allow for a PlayFab + /// ID lookup of any arbitrary service identifier a title wants to add. This identifier should never be used as + /// authentication credentials, as the intent is that it is easily accessible by other players. + /// + public void AddGenericID(AddGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds a given tag to a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void AddPlayerTag(AddPlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddPlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds users to the set of those able to update both the shared data, as well as the set of users in the group. Only users + /// in the group (and the server) can add new members. Shared Groups are designed for sharing data between a very small + /// number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void AddSharedGroupMembers(AddSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Increments the user's balance of the specified virtual currency by the stated amount + /// + public void AddUserVirtualCurrency(AddUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AddUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Validated a client's session ticket, and if successful, returns details for that user + /// + public void AuthenticateSessionTicket(AuthenticateSessionTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AuthenticateSessionTicket", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Awards the specified users the specified Steam achievements + /// + public void AwardSteamAchievement(AwardSteamAchievementRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/AwardSteamAchievement", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Bans users by PlayFab ID with optional IP address, or MAC address for the provided game. + /// + public void BanUsers(BanUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/BanUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Consume uses of a consumable item. When all uses are consumed, it will be removed from the player's inventory. + /// + public void ConsumeItem(ConsumeItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ConsumeItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Requests the creation of a shared group object, containing key/value pairs which may be updated by all members of the + /// group. When created by a server, the group will initially have no members. Shared Groups are designed for sharing data + /// between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void CreateSharedGroup(CreateSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/CreateSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes the specific character ID from the specified user. + /// + public void DeleteCharacterFromUser(DeleteCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeleteCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes a user's player account from a title and deletes all associated data + /// + public void DeletePlayer(DeletePlayerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeletePlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes push notification template for title + /// + public void DeletePushNotificationTemplate(DeletePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeletePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Deletes a shared group, freeing up the shared group ID to be reused for a new group. Shared Groups are designed for + /// sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void DeleteSharedGroup(DeleteSharedGroupRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeleteSharedGroup", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Inform the matchmaker that a Game Server Instance is removed. + /// + [Obsolete("No longer available", true)] + public void DeregisterGame(DeregisterGameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/DeregisterGame", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns the result of an evaluation of a Random Result Table - the ItemId from the game Catalog which would have been + /// added to the player inventory, if the Random Result Table were added via a Bundle or a call to UnlockContainer. + /// + public void EvaluateRandomResultTable(EvaluateRandomResultTableRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/EvaluateRandomResultTable", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Executes a CloudScript function, with the 'currentPlayerId' set to the PlayFab ID of the authenticated player. The + /// PlayFab ID is the entity ID of the player's master_player_account entity. + /// + public void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + public void ExecuteCloudScript(ExecuteCloudScriptServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); + Action wrappedResultCallback = (wrappedResult) => + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var wrappedJson = serializer.SerializeObject(wrappedResult.FunctionResult); + try { + wrappedResult.FunctionResult = serializer.DeserializeObject(wrappedJson); + } catch (Exception) { + wrappedResult.FunctionResult = wrappedJson; + wrappedResult.Logs.Add(new LogStatement { Level = "Warning", Data = wrappedJson, Message = "Sdk Message: Could not deserialize result as: " + typeof(TOut).Name }); + } + resultCallback(wrappedResult); + }; + PlayFabHttp.MakeApiCall("/Server/ExecuteCloudScript", request, AuthType.DevSecretKey, wrappedResultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves an array of player segment definitions. Results from this can be used in subsequent API calls such as + /// GetPlayersInSegment which requires a Segment ID. While segment names can change the ID for that segment will not change. + /// + public void GetAllSegments(GetAllSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetAllSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Lists all of the characters that belong to a specific user. CharacterIds are not globally unique; characterId must be + /// evaluated with the parent PlayFabId to guarantee uniqueness. + /// + public void GetAllUsersCharacters(ListUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetAllUsersCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the specified version of the title's catalog of virtual goods, including all defined properties + /// + public void GetCatalogItems(GetCatalogItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCatalogItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetCharacterData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user's character which cannot be accessed by the client + /// + public void GetCharacterInternalData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the specified character's current inventory of virtual goods + /// + public void GetCharacterInventory(GetCharacterInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetCharacterLeaderboard(GetCharacterLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user's character which can only be read by the client + /// + public void GetCharacterReadOnlyData(GetCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the details of all title-specific statistics for the specific character + /// + public void GetCharacterStatistics(GetCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// This API retrieves a pre-signed URL for accessing a content file for the title. A subsequent HTTP GET to the returned + /// URL will attempt to download the content. A HEAD query to the returned URL will attempt to retrieve the metadata of the + /// content. Note that a successful result does not guarantee the existence of this content - if it has not been uploaded, + /// the query to retrieve the data will fail. See this post for more information: + /// https://community.playfab.com/hc/community/posts/205469488-How-to-upload-files-to-PlayFab-s-Content-Service. Also, + /// please be aware that the Content service is specifically PlayFab's CDN offering, for which standard CDN rates apply. + /// + public void GetContentDownloadUrl(GetContentDownloadUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetContentDownloadUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked friends of the given player for the given statistic, starting from the indicated point in the + /// leaderboard + /// + public void GetFriendLeaderboard(GetFriendLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetFriendLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current friends for the user with PlayFabId, constrained to users who have PlayFab accounts. Friends from + /// linked accounts (Facebook, Steam) are also included. You may optionally exclude some linked services' friends. + /// + public void GetFriendsList(GetFriendsListRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetFriendsList", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, starting from the indicated point in the leaderboard + /// + public void GetLeaderboard(GetLeaderboardRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboard", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked characters for the given statistic, centered on the requested user + /// + public void GetLeaderboardAroundCharacter(GetLeaderboardAroundCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of ranked users for the given statistic, centered on the currently signed-in user + /// + public void GetLeaderboardAroundUser(GetLeaderboardAroundUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardAroundUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves a list of all of the user's characters for the given statistic. + /// + public void GetLeaderboardForUserCharacters(GetLeaderboardForUsersCharactersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetLeaderboardForUserCharacters", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Returns whatever info is requested in the response for the user. Note that PII (like email address, facebook id) may be + /// returned. All parameters default to false. + /// + public void GetPlayerCombinedInfo(GetPlayerCombinedInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerCombinedInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the player's profile + /// + public void GetPlayerProfile(GetPlayerProfileRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerProfile", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// List all segments that a player currently belongs to at this moment in time. + /// + public void GetPlayerSegments(GetPlayersSegmentsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerSegments", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Allows for paging through all players in a given segment. This API creates a snapshot of all player profiles that match + /// the segment definition at the time of its creation and lives through the Total Seconds to Live, refreshing its life span + /// on each subsequent use of the Continuation Token. Profiles that change during the course of paging will not be reflected + /// in the results. AB Test segments are currently not supported by this operation. NOTE: This API is limited to being + /// called 30 times in one minute. You will be returned an error if you exceed this threshold. + /// + public void GetPlayersInSegment(GetPlayersInSegmentRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayersInSegment", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current version and values for the indicated statistics, for the local player. + /// + public void GetPlayerStatistics(GetPlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the information on the available versions of the specified statistic. + /// + public void GetPlayerStatisticVersions(GetPlayerStatisticVersionsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerStatisticVersions", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Get all tags with a given Namespace (optional) from a player profile. + /// + public void GetPlayerTags(GetPlayerTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayerTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook identifiers. + /// + public void GetPlayFabIDsFromFacebookIDs(GetPlayFabIDsFromFacebookIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Facebook Instant Games identifiers. + /// + public void GetPlayFabIDsFromFacebookInstantGamesIds(GetPlayFabIDsFromFacebookInstantGamesIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromFacebookInstantGamesIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of generic service identifiers. A generic identifier is the + /// service name plus the service-specific ID for the player, as specified by the title when the generic identifier was + /// added to the player account. + /// + public void GetPlayFabIDsFromGenericIDs(GetPlayFabIDsFromGenericIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromGenericIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Service Account identifiers. + /// + public void GetPlayFabIDsFromNintendoServiceAccountIds(GetPlayFabIDsFromNintendoServiceAccountIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoServiceAccountIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Nintendo Switch Device identifiers. + /// + public void GetPlayFabIDsFromNintendoSwitchDeviceIds(GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromNintendoSwitchDeviceIds", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of PlayStation :tm: Network identifiers. + /// + public void GetPlayFabIDsFromPSNAccountIDs(GetPlayFabIDsFromPSNAccountIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromPSNAccountIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Steam identifiers. The Steam identifiers are the profile + /// IDs for the user accounts, available as SteamId in the Steamworks Community API calls. + /// + public void GetPlayFabIDsFromSteamIDs(GetPlayFabIDsFromSteamIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromSteamIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of Twitch identifiers. The Twitch identifiers are the IDs for + /// the user accounts, available as "_id" from the Twitch API methods (ex: + /// https://github.com/justintv/Twitch-API/blob/master/v3_resources/users.md#get-usersuser). + /// + public void GetPlayFabIDsFromTwitchIDs(GetPlayFabIDsFromTwitchIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromTwitchIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the unique PlayFab identifiers for the given set of XboxLive identifiers. + /// + public void GetPlayFabIDsFromXboxLiveIDs(GetPlayFabIDsFromXboxLiveIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPlayFabIDsFromXboxLiveIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom publisher settings + /// + public void GetPublisherData(GetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the configuration information for the specified random results tables for the title, including all ItemId + /// values and weights + /// + public void GetRandomResultTables(GetRandomResultTablesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetRandomResultTables", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the associated PlayFab account identifiers for the given set of server custom identifiers. + /// + public void GetServerCustomIDsFromPlayFabIDs(GetServerCustomIDsFromPlayFabIDsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetServerCustomIDsFromPlayFabIDs", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves data stored in a shared group object, as well as the list of members in the group. The server can access all + /// public and private group data. Shared Groups are designed for sharing data between a very small number of players, + /// please see our guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void GetSharedGroupData(GetSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the set of items defined for the specified store, including all prices defined, for the specified player + /// + public void GetStoreItems(GetStoreItemsServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetStoreItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the current server time + /// + public void GetTime(GetTimeRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTime", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom title settings + /// + public void GetTitleData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the key-value store of custom internal title settings + /// + public void GetTitleInternalData(GetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title news feed, as configured in the developer portal + /// + public void GetTitleNews(GetTitleNewsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetTitleNews", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the relevant details for a specified user + /// + public void GetUserAccountInfo(GetUserAccountInfoRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserAccountInfo", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Gets all bans for a user. + /// + public void GetUserBans(GetUserBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which is readable and writable by the client + /// + public void GetUserData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the specified user's current inventory of virtual goods + /// + public void GetUserInventory(GetUserInventoryRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserInventory", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which is readable and writable by the client + /// + public void GetUserPublisherData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void GetUserPublisherInternalData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the publisher-specific custom data for the user which can only be read by the client + /// + public void GetUserPublisherReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Retrieves the title-specific custom data for the user which can only be read by the client + /// + public void GetUserReadOnlyData(GetUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GetUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Grants the specified character type to the user. CharacterIds are not globally unique; characterId must be evaluated + /// with the parent PlayFabId to guarantee uniqueness. + /// + public void GrantCharacterToUser(GrantCharacterToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantCharacterToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified items to the specified character's inventory + /// + public void GrantItemsToCharacter(GrantItemsToCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantItemsToCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified items to the specified user's inventory + /// + public void GrantItemsToUser(GrantItemsToUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the specified items to the specified user inventories + /// + public void GrantItemsToUsers(GrantItemsToUsersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/GrantItemsToUsers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Nintendo account associated with the token to the user's PlayFab account + /// + public void LinkNintendoServiceAccount(LinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the NintendoSwitchDeviceId to the user's PlayFab account + /// + public void LinkNintendoSwitchDeviceId(LinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the PlayStation :tm: Network account associated with the provided access code to the user's PlayFab account + /// + public void LinkPSNAccount(LinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the custom server identifier, generated by the title, to the user's PlayFab account. + /// + public void LinkServerCustomId(LinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public void LinkSteamId(LinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Links the Xbox Live account associated with the provided access code to the user's PlayFab account + /// + public void LinkXboxAccount(LinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Securely login a game client from an external server backend using a custom identifier for that player. Server Custom ID + /// and Client Custom ID are mutually exclusive and cannot be used to retrieve the same player account. + /// + public void LoginWithServerCustomId(LoginWithServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using an Steam ID, returning a session identifier that can subsequently be used for API calls which + /// require an authenticated user + /// + public void LoginWithSteamId(LoginWithSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using a Xbox Live Token from an external server backend, returning a session identifier that can + /// subsequently be used for API calls which require an authenticated user + /// + public void LoginWithXbox(LoginWithXboxRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithXbox", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Signs the user in using an Xbox ID and Sandbox ID, returning a session identifier that can subsequently be used for API + /// calls which require an authenticated user + /// + public void LoginWithXboxId(LoginWithXboxIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/LoginWithXboxId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Modifies the number of remaining uses of a player's inventory item + /// + public void ModifyItemUses(ModifyItemUsesRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ModifyItemUses", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Moves an item from a character's inventory into another of the users's character's inventory. + /// + public void MoveItemToCharacterFromCharacter(MoveItemToCharacterFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Moves an item from a user's inventory into their character's inventory. + /// + public void MoveItemToCharacterFromUser(MoveItemToCharacterFromUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/MoveItemToCharacterFromUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Moves an item from a character's inventory into the owning user's inventory. + /// + public void MoveItemToUserFromCharacter(MoveItemToUserFromCharacterRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/MoveItemToUserFromCharacter", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Informs the PlayFab match-making service that the user specified has left the Game Server Instance + /// + [Obsolete("No longer available", true)] + public void NotifyMatchmakerPlayerLeft(NotifyMatchmakerPlayerLeftRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/NotifyMatchmakerPlayerLeft", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds the virtual goods associated with the coupon to the user's inventory. Coupons can be generated via the + /// Economy->Catalogs tab in the PlayFab Game Manager. + /// + public void RedeemCoupon(RedeemCouponRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RedeemCoupon", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Validates a Game Server session ticket and returns details about the user + /// + [Obsolete("No longer available", true)] + public void RedeemMatchmakerTicket(RedeemMatchmakerTicketRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RedeemMatchmakerTicket", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Set the state of the indicated Game Server Instance. Also update the heartbeat for the instance. + /// + [Obsolete("No longer available", true)] + public void RefreshGameServerInstanceHeartbeat(RefreshGameServerInstanceHeartbeatRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RefreshGameServerInstanceHeartbeat", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Inform the matchmaker that a new Game Server Instance is added. + /// + [Obsolete("No longer available", true)] + public void RegisterGame(RegisterGameRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RegisterGame", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes the specified friend from the the user's friend list + /// + public void RemoveFriend(RemoveFriendRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemoveFriend", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes the specified generic service identifier from the player's PlayFab account. + /// + public void RemoveGenericID(RemoveGenericIDRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemoveGenericID", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Remove a given tag from a player profile. The tag's namespace is automatically generated based on the source of the tag. + /// + public void RemovePlayerTag(RemovePlayerTagRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemovePlayerTag", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Removes users from the set of those able to update the shared data and the set of users in the group. Only users in the + /// group can remove members. If as a result of the call, zero users remain with access, the group and its associated data + /// will be deleted. Shared Groups are designed for sharing data between a very small number of players, please see our + /// guide: https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void RemoveSharedGroupMembers(RemoveSharedGroupMembersRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RemoveSharedGroupMembers", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Submit a report about a player (due to bad bahavior, etc.) on behalf of another player, so that customer service + /// representatives for the title can take action concerning potentially toxic players. + /// + public void ReportPlayer(ReportPlayerServerRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/ReportPlayer", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans for a user. + /// + public void RevokeAllBansForUser(RevokeAllBansForUserRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeAllBansForUser", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revoke all active bans specified with BanId. + /// + public void RevokeBans(RevokeBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revokes access to an item in a user's inventory + /// + public void RevokeInventoryItem(RevokeInventoryItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Revokes access for up to 25 items across multiple users and characters. + /// + public void RevokeInventoryItems(RevokeInventoryItemsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/RevokeInventoryItems", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Saves push notification template for title + /// + public void SavePushNotificationTemplate(SavePushNotificationTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SavePushNotificationTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Forces an email to be sent to the registered contact email address for the user's account based on an account recovery + /// email template + /// + public void SendCustomAccountRecoveryEmail(SendCustomAccountRecoveryEmailRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendCustomAccountRecoveryEmail", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sends an email based on an email template to a player's contact email + /// + public void SendEmailFromTemplate(SendEmailFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendEmailFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sends an iOS/Android Push Notification to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public void SendPushNotification(SendPushNotificationRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendPushNotification", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sends an iOS/Android Push Notification template to a specific user, if that user's device has been configured for Push + /// Notifications in PlayFab. If a user has linked both Android and iOS devices, both will be notified. + /// + public void SendPushNotificationFromTemplate(SendPushNotificationFromTemplateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SendPushNotificationFromTemplate", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the tag list for a specified user in the friend list of another user + /// + public void SetFriendTags(SetFriendTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetFriendTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the custom data of the indicated Game Server Instance + /// + [Obsolete("No longer available", true)] + public void SetGameServerInstanceData(SetGameServerInstanceDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetGameServerInstanceData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Set the state of the indicated Game Server Instance. + /// + [Obsolete("No longer available", true)] + public void SetGameServerInstanceState(SetGameServerInstanceStateRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetGameServerInstanceState", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Set custom tags for the specified Game Server Instance + /// + [Obsolete("No longer available", true)] + public void SetGameServerInstanceTags(SetGameServerInstanceTagsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetGameServerInstanceTags", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Sets the player's secret if it is not already set. Player secrets are used to sign API requests. To reset a player's + /// secret use the Admin or Server API method SetPlayerSecret. + /// + public void SetPlayerSecret(SetPlayerSecretRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetPlayerSecret", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom publisher settings + /// + public void SetPublisherData(SetPublisherDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom title settings + /// + public void SetTitleData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetTitleData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value store of custom title settings + /// + public void SetTitleInternalData(SetTitleDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SetTitleInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Decrements the character's balance of the specified virtual currency by the stated amount. It is possible to make a VC + /// balance negative with this API. + /// + public void SubtractCharacterVirtualCurrency(SubtractCharacterVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SubtractCharacterVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Decrements the user's balance of the specified virtual currency by the stated amount. It is possible to make a VC + /// balance negative with this API. + /// + public void SubtractUserVirtualCurrency(SubtractUserVirtualCurrencyRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/SubtractUserVirtualCurrency", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Nintendo account from the user's PlayFab account + /// + public void UnlinkNintendoServiceAccount(UnlinkNintendoServiceAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoServiceAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related NintendoSwitchDeviceId from the user's PlayFab account + /// + public void UnlinkNintendoSwitchDeviceId(UnlinkNintendoSwitchDeviceIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkNintendoSwitchDeviceId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related PlayStation :tm: Network account from the user's PlayFab account + /// + public void UnlinkPSNAccount(UnlinkPSNAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkPSNAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the custom server identifier from the user's PlayFab account. + /// + public void UnlinkServerCustomId(UnlinkServerCustomIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkServerCustomId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the Steam account associated with the provided Steam ID to the user's PlayFab account + /// + public void UnlinkSteamId(UnlinkSteamIdRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkSteamId", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Unlinks the related Xbox Live account from the user's PlayFab account + /// + public void UnlinkXboxAccount(UnlinkXboxAccountRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlinkXboxAccount", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Opens a specific container (ContainerItemInstanceId), with a specific key (KeyItemInstanceId, when required), and + /// returns the contents of the opened container. If the container (and key when relevant) are consumable (RemainingUses > + /// 0), their RemainingUses will be decremented, consistent with the operation of ConsumeItem. + /// + public void UnlockContainerInstance(UnlockContainerInstanceRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlockContainerInstance", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Searches Player or Character inventory for any ItemInstance matching the given CatalogItemId, if necessary unlocks it + /// using any appropriate key, and returns the contents of the opened container. If the container (and key when relevant) + /// are consumable (RemainingUses > 0), their RemainingUses will be decremented, consistent with the operation of + /// ConsumeItem. + /// + public void UnlockContainerItem(UnlockContainerItemRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UnlockContainerItem", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Update the avatar URL of the specified player + /// + public void UpdateAvatarUrl(UpdateAvatarUrlRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateAvatarUrl", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates information of a list of existing bans specified with Ban Ids. + /// + public void UpdateBans(UpdateBansRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateBans", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user's character which is readable and writable by the client + /// + public void UpdateCharacterData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user's character which cannot be accessed by the client + /// + public void UpdateCharacterInternalData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user's character which can only be read by the client + /// + public void UpdateCharacterReadOnlyData(UpdateCharacterDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the specific character + /// + public void UpdateCharacterStatistics(UpdateCharacterStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateCharacterStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the values of the specified title-specific statistics for the user + /// + public void UpdatePlayerStatistics(UpdatePlayerStatisticsRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdatePlayerStatistics", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Adds, updates, and removes data keys for a shared group object. If the permission is set to Public, all fields updated + /// or added in this call will be readable by users not in the group. By default, data permissions are set to Private. + /// Regardless of the permission setting, only members of the group (and the server) can update the data. Shared Groups are + /// designed for sharing data between a very small number of players, please see our guide: + /// https://docs.microsoft.com/gaming/playfab/features/social/groups/using-shared-group-data + /// + public void UpdateSharedGroupData(UpdateSharedGroupDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateSharedGroupData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the key-value pair data tagged to the specified item, which is read-only from the client. + /// + public void UpdateUserInventoryItemCustomData(UpdateUserInventoryItemDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserInventoryItemCustomData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which is readable and writable by the client + /// + public void UpdateUserPublisherData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which cannot be accessed by the client + /// + public void UpdateUserPublisherInternalData(UpdateUserInternalDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherInternalData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the publisher-specific custom data for the user which can only be read by the client + /// + public void UpdateUserPublisherReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserPublisherReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Updates the title-specific custom data for the user which can only be read by the client + /// + public void UpdateUserReadOnlyData(UpdateUserDataRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/UpdateUserReadOnlyData", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a character-based event into PlayStream. + /// + public void WriteCharacterEvent(WriteServerCharacterEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/WriteCharacterEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a player-based event into PlayStream. + /// + public void WritePlayerEvent(WriteServerPlayerEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/WritePlayerEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + /// + /// Writes a title-based event into PlayStream. + /// + public void WriteTitleEvent(WriteTitleEventRequest request, Action resultCallback, Action errorCallback, object customData = null, Dictionary extraHeaders = null) + { + var context = (request == null ? null : request.AuthenticationContext) ?? authenticationContext; + var callSettings = apiSettings ?? PlayFabSettings.staticSettings; + if (string.IsNullOrEmpty(callSettings.DeveloperSecretKey)) { throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "Must set DeveloperSecretKey in settings to call this method"); } + PlayFabHttp.MakeApiCall("/Server/WriteTitleEvent", request, AuthType.DevSecretKey, resultCallback, errorCallback, customData, extraHeaders, context, callSettings, this); + } + + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta new file mode 100644 index 00000000..c087b059 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerInstanceAPI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 76d4a622fa263d34b9f73488c0095f8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs new file mode 100644 index 00000000..c6299fbe --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs @@ -0,0 +1,7306 @@ +#if ENABLE_PLAYFABSERVER_API +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.ServerModels +{ + [Serializable] + public class AdCampaignAttribution : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AdCampaignAttributionModel : PlayFabBaseModel + { + /// + /// UTC time stamp of attribution + /// + public DateTime AttributedAt; + /// + /// Attribution campaign identifier + /// + public string CampaignId; + /// + /// Attribution network name + /// + public string Platform; + } + + [Serializable] + public class AddCharacterVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the character balance of the specified virtual currency. Maximum VC balance is Int32 + /// (2,147,483,647). Any increase over this value will be discarded. + /// + public int Amount; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be incremented. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class AddFriendRequest : PlayFabRequestCommon + { + /// + /// Email address of the user being added. + /// + public string FriendEmail; + /// + /// The PlayFab identifier of the user being added. + /// + public string FriendPlayFabId; + /// + /// Title-specific display name of the user to being added. + /// + public string FriendTitleDisplayName; + /// + /// The PlayFab username of the user being added + /// + public string FriendUsername; + /// + /// PlayFab identifier of the player to add a new friend. + /// + public string PlayFabId; + } + + [Serializable] + public class AddGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to add to the player account. + /// + public GenericServiceId GenericId; + /// + /// PlayFabId of the user to link. + /// + public string PlayFabId; + } + + /// + /// This API will trigger a player_tag_added event and add a tag with the given TagName and PlayFabID to the corresponding + /// player profile. TagName can be used for segmentation and it is limited to 256 characters. Also there is a limit on the + /// number of tags a title can have. + /// + [Serializable] + public class AddPlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class AddPlayerTagResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class AddSharedGroupMembersResult : PlayFabResultCommon + { + } + + [Serializable] + public class AddUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be added to the user balance of the specified virtual currency. Maximum VC balance is Int32 (2,147,483,647). + /// Any increase over this value will be discarded. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be increased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be incremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class AdvancedPushPlatformMsg : PlayFabBaseModel + { + /// + /// Stops GoogleCloudMessaging notifications from including both notification and data properties and instead only sends the + /// data property. + /// + public bool? GCMDataOnly; + /// + /// The Json the platform should receive. + /// + public string Json; + /// + /// The platform that should receive the Json. + /// + public PushNotificationPlatform Platform; + } + + /// + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class AuthenticateSessionTicketRequest : PlayFabRequestCommon + { + /// + /// Session ticket as issued by a PlayFab client login API. + /// + public string SessionTicket; + } + + [Serializable] + public class AuthenticateSessionTicketResult : PlayFabResultCommon + { + /// + /// Indicates if token was expired at request time. + /// + public bool? IsSessionTicketExpired; + /// + /// Account info for the user whose session ticket was supplied. + /// + public UserAccountInfo UserInfo; + } + + [Serializable] + public class AwardSteamAchievementItem : PlayFabBaseModel + { + /// + /// Unique Steam achievement name. + /// + public string AchievementName; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Result of the award attempt (only valid on response, not on request). + /// + public bool Result; + } + + [Serializable] + public class AwardSteamAchievementRequest : PlayFabRequestCommon + { + /// + /// Array of achievements to grant and the users to whom they are to be granted. + /// + public List Achievements; + } + + [Serializable] + public class AwardSteamAchievementResult : PlayFabResultCommon + { + /// + /// Array of achievements granted. + /// + public List AchievementResults; + } + + /// + /// Contains information for a ban. + /// + [Serializable] + public class BanInfo : PlayFabBaseModel + { + /// + /// The active state of this ban. Expired bans may still have this value set to true but they will have no effect. + /// + public bool Active; + /// + /// The unique Ban Id associated with this ban. + /// + public string BanId; + /// + /// The time when this ban was applied. + /// + public DateTime? Created; + /// + /// The time when this ban expires. Permanent bans do not have expiration date. + /// + public DateTime? Expires; + /// + /// The IP address on which the ban was applied. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason why this ban was applied. + /// + public string Reason; + } + + /// + /// Represents a single ban request. + /// + [Serializable] + public class BanRequest : PlayFabBaseModel + { + /// + /// The duration in hours for the ban. Leave this blank for a permanent ban. + /// + public uint? DurationInHours; + /// + /// IP address to be banned. May affect multiple players. + /// + public string IPAddress; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The reason for this ban. Maximum 140 characters. + /// + public string Reason; + } + + /// + /// The existence of each user will not be verified. When banning by IP or MAC address, multiple players may be affected, so + /// use this feature with caution. Returns information about the new bans. + /// + [Serializable] + public class BanUsersRequest : PlayFabRequestCommon + { + /// + /// List of ban requests to be applied. Maximum 100. + /// + public List Bans; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + } + + [Serializable] + public class BanUsersResult : PlayFabResultCommon + { + /// + /// Information on the bans that were applied + /// + public List BanData; + } + + /// + /// A purchasable item from the item catalog + /// + [Serializable] + public class CatalogItem : PlayFabBaseModel + { + /// + /// defines the bundle properties for the item - bundles are items which contain other items, including random drop tables + /// and virtual currencies + /// + public CatalogItemBundleInfo Bundle; + /// + /// if true, then an item instance of this type can be used to grant a character to a user. + /// + public bool CanBecomeCharacter; + /// + /// catalog version for this item + /// + public string CatalogVersion; + /// + /// defines the consumable properties (number of uses, timeout) for the item + /// + public CatalogItemConsumableInfo Consumable; + /// + /// defines the container properties for the item - what items it contains, including random drop tables and virtual + /// currencies, and what item (if any) is required to open it via the UnlockContainerItem API + /// + public CatalogItemContainerInfo Container; + /// + /// game specific custom data + /// + public string CustomData; + /// + /// text description of item, to show in-game + /// + public string Description; + /// + /// text name for the item, to show in-game + /// + public string DisplayName; + /// + /// If the item has IsLImitedEdition set to true, and this is the first time this ItemId has been defined as a limited + /// edition item, this value determines the total number of instances to allocate for the title. Once this limit has been + /// reached, no more instances of this ItemId can be created, and attempts to purchase or grant it will return a Result of + /// false for that ItemId. If the item has already been defined to have a limited edition count, or if this value is less + /// than zero, it will be ignored. + /// + public int InitialLimitedEditionCount; + /// + /// BETA: If true, then only a fixed number can ever be granted. + /// + public bool IsLimitedEdition; + /// + /// if true, then only one item instance of this type will exist and its remaininguses will be incremented instead. + /// RemainingUses will cap out at Int32.Max (2,147,483,647). All subsequent increases will be discarded + /// + public bool IsStackable; + /// + /// if true, then an item instance of this type can be traded between players using the trading APIs + /// + public bool IsTradable; + /// + /// class to which the item belongs + /// + public string ItemClass; + /// + /// unique identifier for this item + /// + public string ItemId; + /// + /// URL to the item image. For Facebook purchase to display the image on the item purchase page, this must be set to an HTTP + /// URL. + /// + public string ItemImageUrl; + /// + /// override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// list of item tags + /// + public List Tags; + /// + /// price of this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + [Serializable] + public class CatalogItemBundleInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory when the bundle is added + /// + public List BundledItems; + /// + /// unique TableId values for all RandomResultTable objects which are part of the bundle (random tables will be resolved and + /// add the relevant items to the player inventory when the bundle is added) + /// + public List BundledResultTables; + /// + /// virtual currency types and balances which will be added to the player inventory when the bundle is added + /// + public Dictionary BundledVirtualCurrencies; + } + + [Serializable] + public class CatalogItemConsumableInfo : PlayFabBaseModel + { + /// + /// number of times this object can be used, after which it will be removed from the player inventory + /// + public uint? UsageCount; + /// + /// duration in seconds for how long the item will remain in the player inventory - once elapsed, the item will be removed + /// (recommended minimum value is 5 seconds, as lower values can cause the item to expire before operations depending on + /// this item's details have completed) + /// + public uint? UsagePeriod; + /// + /// all inventory item instances in the player inventory sharing a non-null UsagePeriodGroup have their UsagePeriod values + /// added together, and share the result - when that period has elapsed, all the items in the group will be removed + /// + public string UsagePeriodGroup; + } + + /// + /// Containers are inventory items that can hold other items defined in the catalog, as well as virtual currency, which is + /// added to the player inventory when the container is unlocked, using the UnlockContainerItem API. The items can be + /// anything defined in the catalog, as well as RandomResultTable objects which will be resolved when the container is + /// unlocked. Containers and their keys should be defined as Consumable (having a limited number of uses) in their catalog + /// defintiions, unless the intent is for the player to be able to re-use them infinitely. + /// + [Serializable] + public class CatalogItemContainerInfo : PlayFabBaseModel + { + /// + /// unique ItemId values for all items which will be added to the player inventory, once the container has been unlocked + /// + public List ItemContents; + /// + /// ItemId for the catalog item used to unlock the container, if any (if not specified, a call to UnlockContainerItem will + /// open the container, adding the contents to the player inventory and currency balances) + /// + public string KeyItemId; + /// + /// unique TableId values for all RandomResultTable objects which are part of the container (once unlocked, random tables + /// will be resolved and add the relevant items to the player inventory) + /// + public List ResultTableContents; + /// + /// virtual currency types and balances which will be added to the player inventory when the container is unlocked + /// + public Dictionary VirtualCurrencyContents; + } + + [Serializable] + public class CharacterInventory : PlayFabBaseModel + { + /// + /// The id of this character. + /// + public string CharacterId; + /// + /// The inventory of this character. + /// + public List Inventory; + } + + [Serializable] + public class CharacterLeaderboardEntry : PlayFabBaseModel + { + /// + /// PlayFab unique identifier of the character that belongs to the user for this leaderboard entry. + /// + public string CharacterId; + /// + /// Title-specific display name of the character for this leaderboard entry. + /// + public string CharacterName; + /// + /// Name of the character class for this entry. + /// + public string CharacterType; + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class CharacterResult : PlayFabBaseModel + { + /// + /// The id for this character on this player. + /// + public string CharacterId; + /// + /// The name of this character. + /// + public string CharacterName; + /// + /// The type-string that was given to this character on creation. + /// + public string CharacterType; + } + + public enum ChurnRiskLevel + { + NoData, + LowRisk, + MediumRisk, + HighRisk + } + + public enum CloudScriptRevisionOption + { + Live, + Latest, + Specific + } + + [Serializable] + public class ConsumeItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Number of uses to consume from the item. + /// + public int ConsumeCount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique instance identifier of the item to be consumed. + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ConsumeItemResult : PlayFabResultCommon + { + /// + /// Unique instance identifier of the item with uses consumed. + /// + public string ItemInstanceId; + /// + /// Number of uses remaining on the item. + /// + public int RemainingUses; + } + + [Serializable] + public class ContactEmailInfo : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + [Serializable] + public class ContactEmailInfoModel : PlayFabBaseModel + { + /// + /// The email address + /// + public string EmailAddress; + /// + /// The name of the email info data + /// + public string Name; + /// + /// The verification status of the email + /// + public EmailVerificationStatus? VerificationStatus; + } + + public enum ContinentCode + { + AF, + AN, + AS, + EU, + NA, + OC, + SA + } + + public enum CountryCode + { + AF, + AX, + AL, + DZ, + AS, + AD, + AO, + AI, + AQ, + AG, + AR, + AM, + AW, + AU, + AT, + AZ, + BS, + BH, + BD, + BB, + BY, + BE, + BZ, + BJ, + BM, + BT, + BO, + BQ, + BA, + BW, + BV, + BR, + IO, + BN, + BG, + BF, + BI, + KH, + CM, + CA, + CV, + KY, + CF, + TD, + CL, + CN, + CX, + CC, + CO, + KM, + CG, + CD, + CK, + CR, + CI, + HR, + CU, + CW, + CY, + CZ, + DK, + DJ, + DM, + DO, + EC, + EG, + SV, + GQ, + ER, + EE, + ET, + FK, + FO, + FJ, + FI, + FR, + GF, + PF, + TF, + GA, + GM, + GE, + DE, + GH, + GI, + GR, + GL, + GD, + GP, + GU, + GT, + GG, + GN, + GW, + GY, + HT, + HM, + VA, + HN, + HK, + HU, + IS, + IN, + ID, + IR, + IQ, + IE, + IM, + IL, + IT, + JM, + JP, + JE, + JO, + KZ, + KE, + KI, + KP, + KR, + KW, + KG, + LA, + LV, + LB, + LS, + LR, + LY, + LI, + LT, + LU, + MO, + MK, + MG, + MW, + MY, + MV, + ML, + MT, + MH, + MQ, + MR, + MU, + YT, + MX, + FM, + MD, + MC, + MN, + ME, + MS, + MA, + MZ, + MM, + NA, + NR, + NP, + NL, + NC, + NZ, + NI, + NE, + NG, + NU, + NF, + MP, + NO, + OM, + PK, + PW, + PS, + PA, + PG, + PY, + PE, + PH, + PN, + PL, + PT, + PR, + QA, + RE, + RO, + RU, + RW, + BL, + SH, + KN, + LC, + MF, + PM, + VC, + WS, + SM, + ST, + SA, + SN, + RS, + SC, + SL, + SG, + SX, + SK, + SI, + SB, + SO, + ZA, + GS, + SS, + ES, + LK, + SD, + SR, + SJ, + SZ, + SE, + CH, + SY, + TW, + TJ, + TZ, + TH, + TL, + TG, + TK, + TO, + TT, + TN, + TR, + TM, + TC, + TV, + UG, + UA, + AE, + GB, + US, + UM, + UY, + UZ, + VU, + VE, + VN, + VG, + VI, + WF, + EH, + YE, + ZM, + ZW + } + + /// + /// If SharedGroupId is specified, the service will attempt to create a group with that identifier, and will return an error + /// if it is already in use. If no SharedGroupId is specified, a random identifier will be assigned. + /// + [Serializable] + public class CreateSharedGroupRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the shared group (a random identifier will be assigned, if one is not specified). + /// + public string SharedGroupId; + } + + [Serializable] + public class CreateSharedGroupResult : PlayFabResultCommon + { + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + public enum Currency + { + AED, + AFN, + ALL, + AMD, + ANG, + AOA, + ARS, + AUD, + AWG, + AZN, + BAM, + BBD, + BDT, + BGN, + BHD, + BIF, + BMD, + BND, + BOB, + BRL, + BSD, + BTN, + BWP, + BYR, + BZD, + CAD, + CDF, + CHF, + CLP, + CNY, + COP, + CRC, + CUC, + CUP, + CVE, + CZK, + DJF, + DKK, + DOP, + DZD, + EGP, + ERN, + ETB, + EUR, + FJD, + FKP, + GBP, + GEL, + GGP, + GHS, + GIP, + GMD, + GNF, + GTQ, + GYD, + HKD, + HNL, + HRK, + HTG, + HUF, + IDR, + ILS, + IMP, + INR, + IQD, + IRR, + ISK, + JEP, + JMD, + JOD, + JPY, + KES, + KGS, + KHR, + KMF, + KPW, + KRW, + KWD, + KYD, + KZT, + LAK, + LBP, + LKR, + LRD, + LSL, + LYD, + MAD, + MDL, + MGA, + MKD, + MMK, + MNT, + MOP, + MRO, + MUR, + MVR, + MWK, + MXN, + MYR, + MZN, + NAD, + NGN, + NIO, + NOK, + NPR, + NZD, + OMR, + PAB, + PEN, + PGK, + PHP, + PKR, + PLN, + PYG, + QAR, + RON, + RSD, + RUB, + RWF, + SAR, + SBD, + SCR, + SDG, + SEK, + SGD, + SHP, + SLL, + SOS, + SPL, + SRD, + STD, + SVC, + SYP, + SZL, + THB, + TJS, + TMT, + TND, + TOP, + TRY, + TTD, + TVD, + TWD, + TZS, + UAH, + UGX, + USD, + UYU, + UZS, + VEF, + VND, + VUV, + WST, + XAF, + XCD, + XDR, + XOF, + XPF, + YER, + ZAR, + ZMW, + ZWD + } + + /// + /// This function will delete the specified character from the list allowed by the user, and will also delete any inventory + /// or VC currently held by that character. It will NOT delete any statistics associated for this character, in order to + /// preserve leaderboard integrity. + /// + [Serializable] + public class DeleteCharacterFromUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If true, the character's inventory will be transferred up to the owning user; otherwise, this request will purge those + /// items. + /// + public bool SaveCharacterInventory; + } + + [Serializable] + public class DeleteCharacterFromUserResult : PlayFabResultCommon + { + } + + /// + /// Deletes all data associated with the player, including statistics, custom data, inventory, purchases, virtual currency + /// balances, characters and shared group memberships. Removes the player from all leaderboards and player search indexes. + /// Does not delete PlayStream event history associated with the player. Does not delete the publisher user account that + /// created the player in the title nor associated data such as username, password, email address, account linkages, or + /// friends list. Note, this API queues the player for deletion and returns immediately. It may take several minutes or more + /// before all player data is fully deleted. Until the player data is fully deleted, attempts to recreate the player with + /// the same user account in the same title will fail with the 'AccountDeleted' error. This API must be enabled for use as + /// an option in the game manager website. It is disabled by default. + /// + [Serializable] + public class DeletePlayerRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class DeletePlayerResult : PlayFabResultCommon + { + } + + /// + /// Represents the request to delete a push notification template. + /// + [Serializable] + public class DeletePushNotificationTemplateRequest : PlayFabRequestCommon + { + /// + /// Id of the push notification template to be deleted. + /// + public string PushNotificationTemplateId; + } + + [Serializable] + public class DeletePushNotificationTemplateResult : PlayFabResultCommon + { + } + + [Serializable] + public class DeleteSharedGroupRequest : PlayFabRequestCommon + { + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class DeregisterGameRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier for the Game Server Instance that is being deregistered. + /// + public string LobbyId; + } + + [Serializable] + public class DeregisterGameResponse : PlayFabResultCommon + { + } + + public enum EmailVerificationStatus + { + Unverified, + Pending, + Confirmed + } + + [Serializable] + public class EmptyResponse : PlayFabResultCommon + { + } + + [Serializable] + public class EmptyResult : PlayFabResultCommon + { + } + + /// + /// Combined entity type and ID structure which uniquely identifies a single entity. + /// + [Serializable] + public class EntityKey : PlayFabBaseModel + { + /// + /// Unique ID of the entity. + /// + public string Id; + /// + /// Entity type. See https://docs.microsoft.com/gaming/playfab/features/data/entities/available-built-in-entity-types + /// + public string Type; + } + + [Serializable] + public class EntityTokenResponse : PlayFabBaseModel + { + /// + /// The entity id and type. + /// + public EntityKey Entity; + /// + /// The token used to set X-EntityToken for all entity based API calls. + /// + public string EntityToken; + /// + /// The time the token will expire, if it is an expiring token, in UTC. + /// + public DateTime? TokenExpiration; + } + + [Serializable] + public class EvaluateRandomResultTableRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to evaluate the Random Result Table. If unspecified, uses + /// default/primary catalog. + /// + public string CatalogVersion; + /// + /// The unique identifier of the Random Result Table to use. + /// + public string TableId; + } + + /// + /// Note that if the Random Result Table contains no entries, or does not exist for the catalog specified (the Primary + /// catalog if one is not specified), an InvalidDropTable error will be returned. + /// + [Serializable] + public class EvaluateRandomResultTableResult : PlayFabResultCommon + { + /// + /// Unique identifier for the item returned from the Random Result Table evaluation, for the given catalog. + /// + public string ResultItemId; + } + + [Serializable] + public class ExecuteCloudScriptResult : PlayFabResultCommon + { + /// + /// Number of PlayFab API requests issued by the CloudScript function + /// + public int APIRequestsIssued; + /// + /// Information about the error, if any, that occurred during execution + /// + public ScriptExecutionError Error; + public double ExecutionTimeSeconds; + /// + /// The name of the function that executed + /// + public string FunctionName; + /// + /// The object returned from the CloudScript function, if any + /// + public object FunctionResult; + /// + /// Flag indicating if the FunctionResult was too large and was subsequently dropped from this event. This only occurs if + /// the total event size is larger than 350KB. + /// + public bool? FunctionResultTooLarge; + /// + /// Number of external HTTP requests issued by the CloudScript function + /// + public int HttpRequestsIssued; + /// + /// Entries logged during the function execution. These include both entries logged in the function code using log.info() + /// and log.error() and error entries for API and HTTP request failures. + /// + public List Logs; + /// + /// Flag indicating if the logs were too large and were subsequently dropped from this event. This only occurs if the total + /// event size is larger than 350KB after the FunctionResult was removed. + /// + public bool? LogsTooLarge; + public uint MemoryConsumedBytes; + /// + /// Processor time consumed while executing the function. This does not include time spent waiting on API calls or HTTP + /// requests. + /// + public double ProcessorTimeSeconds; + /// + /// The revision of the CloudScript that executed + /// + public int Revision; + } + + [Serializable] + public class ExecuteCloudScriptServerRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the CloudScript function to execute + /// + public string FunctionName; + /// + /// Object that is passed in to the function as the first argument + /// + public object FunctionParameter; + /// + /// Generate a 'player_executed_cloudscript' PlayStream event containing the results of the function execution and other + /// contextual information. This event will show up in the PlayStream debugger console for the player in Game Manager. + /// + public bool? GeneratePlayStreamEvent; + /// + /// The unique user identifier for the player on whose behalf the script is being run + /// + public string PlayFabId; + /// + /// Option for which revision of the CloudScript to execute. 'Latest' executes the most recently created revision, 'Live' + /// executes the current live, published revision, and 'Specific' executes the specified revision. The default value is + /// 'Specific', if the SpeificRevision parameter is specified, otherwise it is 'Live'. + /// + public CloudScriptRevisionOption? RevisionSelection; + /// + /// The specivic revision to execute, when RevisionSelection is set to 'Specific' + /// + public int? SpecificRevision; + } + + public enum ExternalFriendSources + { + None, + Steam, + Facebook, + Xbox, + Psn, + All + } + + [Serializable] + public class FacebookInstantGamesPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook Instant Games identifier for a user. + /// + public string FacebookInstantGamesId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook Instant Games identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FacebookPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Facebook identifier for a user. + /// + public string FacebookId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Facebook identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class FriendInfo : PlayFabBaseModel + { + /// + /// Available Facebook information (if the user and PlayFab friend are also connected in Facebook). + /// + public UserFacebookInfo FacebookInfo; + /// + /// PlayFab unique identifier for this friend. + /// + public string FriendPlayFabId; + /// + /// Available Game Center information (if the user and PlayFab friend are also connected in Game Center). + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Available PlayStation :tm: Network information, if the user and PlayFab friend are both connected to PlayStation :tm: + /// Network. + /// + public UserPsnInfo PSNInfo; + /// + /// Available Steam information (if the user and PlayFab friend are also connected in Steam). + /// + public UserSteamInfo SteamInfo; + /// + /// Tags which have been associated with this friend. + /// + public List Tags; + /// + /// Title-specific display name for this friend. + /// + public string TitleDisplayName; + /// + /// PlayFab unique username for this friend. + /// + public string Username; + /// + /// Available Xbox information, if the user and PlayFab friend are both connected to Xbox Live. + /// + public UserXboxInfo XboxInfo; + } + + public enum GameInstanceState + { + Open, + Closed + } + + public enum GenericErrorCodes + { + Success, + UnkownError, + InvalidParams, + AccountNotFound, + AccountBanned, + InvalidUsernameOrPassword, + InvalidTitleId, + InvalidEmailAddress, + EmailAddressNotAvailable, + InvalidUsername, + InvalidPassword, + UsernameNotAvailable, + InvalidSteamTicket, + AccountAlreadyLinked, + LinkedAccountAlreadyClaimed, + InvalidFacebookToken, + AccountNotLinked, + FailedByPaymentProvider, + CouponCodeNotFound, + InvalidContainerItem, + ContainerNotOwned, + KeyNotOwned, + InvalidItemIdInTable, + InvalidReceipt, + ReceiptAlreadyUsed, + ReceiptCancelled, + GameNotFound, + GameModeNotFound, + InvalidGoogleToken, + UserIsNotPartOfDeveloper, + InvalidTitleForDeveloper, + TitleNameConflicts, + UserisNotValid, + ValueAlreadyExists, + BuildNotFound, + PlayerNotInGame, + InvalidTicket, + InvalidDeveloper, + InvalidOrderInfo, + RegistrationIncomplete, + InvalidPlatform, + UnknownError, + SteamApplicationNotOwned, + WrongSteamAccount, + TitleNotActivated, + RegistrationSessionNotFound, + NoSuchMod, + FileNotFound, + DuplicateEmail, + ItemNotFound, + ItemNotOwned, + ItemNotRecycleable, + ItemNotAffordable, + InvalidVirtualCurrency, + WrongVirtualCurrency, + WrongPrice, + NonPositiveValue, + InvalidRegion, + RegionAtCapacity, + ServerFailedToStart, + NameNotAvailable, + InsufficientFunds, + InvalidDeviceID, + InvalidPushNotificationToken, + NoRemainingUses, + InvalidPaymentProvider, + PurchaseInitializationFailure, + DuplicateUsername, + InvalidBuyerInfo, + NoGameModeParamsSet, + BodyTooLarge, + ReservedWordInBody, + InvalidTypeInBody, + InvalidRequest, + ReservedEventName, + InvalidUserStatistics, + NotAuthenticated, + StreamAlreadyExists, + ErrorCreatingStream, + StreamNotFound, + InvalidAccount, + PurchaseDoesNotExist, + InvalidPurchaseTransactionStatus, + APINotEnabledForGameClientAccess, + NoPushNotificationARNForTitle, + BuildAlreadyExists, + BuildPackageDoesNotExist, + CustomAnalyticsEventsNotEnabledForTitle, + InvalidSharedGroupId, + NotAuthorized, + MissingTitleGoogleProperties, + InvalidItemProperties, + InvalidPSNAuthCode, + InvalidItemId, + PushNotEnabledForAccount, + PushServiceError, + ReceiptDoesNotContainInAppItems, + ReceiptContainsMultipleInAppItems, + InvalidBundleID, + JavascriptException, + InvalidSessionTicket, + UnableToConnectToDatabase, + InternalServerError, + InvalidReportDate, + ReportNotAvailable, + DatabaseThroughputExceeded, + InvalidGameTicket, + ExpiredGameTicket, + GameTicketDoesNotMatchLobby, + LinkedDeviceAlreadyClaimed, + DeviceAlreadyLinked, + DeviceNotLinked, + PartialFailure, + PublisherNotSet, + ServiceUnavailable, + VersionNotFound, + RevisionNotFound, + InvalidPublisherId, + DownstreamServiceUnavailable, + APINotIncludedInTitleUsageTier, + DAULimitExceeded, + APIRequestLimitExceeded, + InvalidAPIEndpoint, + BuildNotAvailable, + ConcurrentEditError, + ContentNotFound, + CharacterNotFound, + CloudScriptNotFound, + ContentQuotaExceeded, + InvalidCharacterStatistics, + PhotonNotEnabledForTitle, + PhotonApplicationNotFound, + PhotonApplicationNotAssociatedWithTitle, + InvalidEmailOrPassword, + FacebookAPIError, + InvalidContentType, + KeyLengthExceeded, + DataLengthExceeded, + TooManyKeys, + FreeTierCannotHaveVirtualCurrency, + MissingAmazonSharedKey, + AmazonValidationError, + InvalidPSNIssuerId, + PSNInaccessible, + ExpiredAuthToken, + FailedToGetEntitlements, + FailedToConsumeEntitlement, + TradeAcceptingUserNotAllowed, + TradeInventoryItemIsAssignedToCharacter, + TradeInventoryItemIsBundle, + TradeStatusNotValidForCancelling, + TradeStatusNotValidForAccepting, + TradeDoesNotExist, + TradeCancelled, + TradeAlreadyFilled, + TradeWaitForStatusTimeout, + TradeInventoryItemExpired, + TradeMissingOfferedAndAcceptedItems, + TradeAcceptedItemIsBundle, + TradeAcceptedItemIsStackable, + TradeInventoryItemInvalidStatus, + TradeAcceptedCatalogItemInvalid, + TradeAllowedUsersInvalid, + TradeInventoryItemDoesNotExist, + TradeInventoryItemIsConsumed, + TradeInventoryItemIsStackable, + TradeAcceptedItemsMismatch, + InvalidKongregateToken, + FeatureNotConfiguredForTitle, + NoMatchingCatalogItemForReceipt, + InvalidCurrencyCode, + NoRealMoneyPriceForCatalogItem, + TradeInventoryItemIsNotTradable, + TradeAcceptedCatalogItemIsNotTradable, + UsersAlreadyFriends, + LinkedIdentifierAlreadyClaimed, + CustomIdNotLinked, + TotalDataSizeExceeded, + DeleteKeyConflict, + InvalidXboxLiveToken, + ExpiredXboxLiveToken, + ResettableStatisticVersionRequired, + NotAuthorizedByTitle, + NoPartnerEnabled, + InvalidPartnerResponse, + APINotEnabledForGameServerAccess, + StatisticNotFound, + StatisticNameConflict, + StatisticVersionClosedForWrites, + StatisticVersionInvalid, + APIClientRequestRateLimitExceeded, + InvalidJSONContent, + InvalidDropTable, + StatisticVersionAlreadyIncrementedForScheduledInterval, + StatisticCountLimitExceeded, + StatisticVersionIncrementRateExceeded, + ContainerKeyInvalid, + CloudScriptExecutionTimeLimitExceeded, + NoWritePermissionsForEvent, + CloudScriptFunctionArgumentSizeExceeded, + CloudScriptAPIRequestCountExceeded, + CloudScriptAPIRequestError, + CloudScriptHTTPRequestError, + InsufficientGuildRole, + GuildNotFound, + OverLimit, + EventNotFound, + InvalidEventField, + InvalidEventName, + CatalogNotConfigured, + OperationNotSupportedForPlatform, + SegmentNotFound, + StoreNotFound, + InvalidStatisticName, + TitleNotQualifiedForLimit, + InvalidServiceLimitLevel, + ServiceLimitLevelInTransition, + CouponAlreadyRedeemed, + GameServerBuildSizeLimitExceeded, + GameServerBuildCountLimitExceeded, + VirtualCurrencyCountLimitExceeded, + VirtualCurrencyCodeExists, + TitleNewsItemCountLimitExceeded, + InvalidTwitchToken, + TwitchResponseError, + ProfaneDisplayName, + UserAlreadyAdded, + InvalidVirtualCurrencyCode, + VirtualCurrencyCannotBeDeleted, + IdentifierAlreadyClaimed, + IdentifierNotLinked, + InvalidContinuationToken, + ExpiredContinuationToken, + InvalidSegment, + InvalidSessionId, + SessionLogNotFound, + InvalidSearchTerm, + TwoFactorAuthenticationTokenRequired, + GameServerHostCountLimitExceeded, + PlayerTagCountLimitExceeded, + RequestAlreadyRunning, + ActionGroupNotFound, + MaximumSegmentBulkActionJobsRunning, + NoActionsOnPlayersInSegmentJob, + DuplicateStatisticName, + ScheduledTaskNameConflict, + ScheduledTaskCreateConflict, + InvalidScheduledTaskName, + InvalidTaskSchedule, + SteamNotEnabledForTitle, + LimitNotAnUpgradeOption, + NoSecretKeyEnabledForCloudScript, + TaskNotFound, + TaskInstanceNotFound, + InvalidIdentityProviderId, + MisconfiguredIdentityProvider, + InvalidScheduledTaskType, + BillingInformationRequired, + LimitedEditionItemUnavailable, + InvalidAdPlacementAndReward, + AllAdPlacementViewsAlreadyConsumed, + GoogleOAuthNotConfiguredForTitle, + GoogleOAuthError, + UserNotFriend, + InvalidSignature, + InvalidPublicKey, + GoogleOAuthNoIdTokenIncludedInResponse, + StatisticUpdateInProgress, + LeaderboardVersionNotAvailable, + StatisticAlreadyHasPrizeTable, + PrizeTableHasOverlappingRanks, + PrizeTableHasMissingRanks, + PrizeTableRankStartsAtZero, + InvalidStatistic, + ExpressionParseFailure, + ExpressionInvokeFailure, + ExpressionTooLong, + DataUpdateRateExceeded, + RestrictedEmailDomain, + EncryptionKeyDisabled, + EncryptionKeyMissing, + EncryptionKeyBroken, + NoSharedSecretKeyConfigured, + SecretKeyNotFound, + PlayerSecretAlreadyConfigured, + APIRequestsDisabledForTitle, + InvalidSharedSecretKey, + PrizeTableHasNoRanks, + ProfileDoesNotExist, + ContentS3OriginBucketNotConfigured, + InvalidEnvironmentForReceipt, + EncryptedRequestNotAllowed, + SignedRequestNotAllowed, + RequestViewConstraintParamsNotAllowed, + BadPartnerConfiguration, + XboxBPCertificateFailure, + XboxXASSExchangeFailure, + InvalidEntityId, + StatisticValueAggregationOverflow, + EmailMessageFromAddressIsMissing, + EmailMessageToAddressIsMissing, + SmtpServerAuthenticationError, + SmtpServerLimitExceeded, + SmtpServerInsufficientStorage, + SmtpServerCommunicationError, + SmtpServerGeneralFailure, + EmailClientTimeout, + EmailClientCanceledTask, + EmailTemplateMissing, + InvalidHostForTitleId, + EmailConfirmationTokenDoesNotExist, + EmailConfirmationTokenExpired, + AccountDeleted, + PlayerSecretNotConfigured, + InvalidSignatureTime, + NoContactEmailAddressFound, + InvalidAuthToken, + AuthTokenDoesNotExist, + AuthTokenExpired, + AuthTokenAlreadyUsedToResetPassword, + MembershipNameTooLong, + MembershipNotFound, + GoogleServiceAccountInvalid, + GoogleServiceAccountParseFailure, + EntityTokenMissing, + EntityTokenInvalid, + EntityTokenExpired, + EntityTokenRevoked, + InvalidProductForSubscription, + XboxInaccessible, + SubscriptionAlreadyTaken, + SmtpAddonNotEnabled, + APIConcurrentRequestLimitExceeded, + XboxRejectedXSTSExchangeRequest, + VariableNotDefined, + TemplateVersionNotDefined, + FileTooLarge, + TitleDeleted, + TitleContainsUserAccounts, + TitleDeletionPlayerCleanupFailure, + EntityFileOperationPending, + NoEntityFileOperationPending, + EntityProfileVersionMismatch, + TemplateVersionTooOld, + MembershipDefinitionInUse, + PaymentPageNotConfigured, + FailedLoginAttemptRateLimitExceeded, + EntityBlockedByGroup, + RoleDoesNotExist, + EntityIsAlreadyMember, + DuplicateRoleId, + GroupInvitationNotFound, + GroupApplicationNotFound, + OutstandingInvitationAcceptedInstead, + OutstandingApplicationAcceptedInstead, + RoleIsGroupDefaultMember, + RoleIsGroupAdmin, + RoleNameNotAvailable, + GroupNameNotAvailable, + EmailReportAlreadySent, + EmailReportRecipientBlacklisted, + EventNamespaceNotAllowed, + EventEntityNotAllowed, + InvalidEntityType, + NullTokenResultFromAad, + InvalidTokenResultFromAad, + NoValidCertificateForAad, + InvalidCertificateForAad, + DuplicateDropTableId, + MultiplayerServerError, + MultiplayerServerTooManyRequests, + MultiplayerServerNoContent, + MultiplayerServerBadRequest, + MultiplayerServerUnauthorized, + MultiplayerServerForbidden, + MultiplayerServerNotFound, + MultiplayerServerConflict, + MultiplayerServerInternalServerError, + MultiplayerServerUnavailable, + ExplicitContentDetected, + PIIContentDetected, + InvalidScheduledTaskParameter, + PerEntityEventRateLimitExceeded, + TitleDefaultLanguageNotSet, + EmailTemplateMissingDefaultVersion, + FacebookInstantGamesIdNotLinked, + InvalidFacebookInstantGamesSignature, + FacebookInstantGamesAuthNotConfiguredForTitle, + EntityProfileConstraintValidationFailed, + TelemetryIngestionKeyPending, + TelemetryIngestionKeyNotFound, + StatisticChildNameInvalid, + DataIntegrityError, + VirtualCurrencyCannotBeSetToOlderVersion, + VirtualCurrencyMustBeWithinIntegerRange, + EmailTemplateInvalidSyntax, + EmailTemplateMissingCallback, + PushNotificationTemplateInvalidPayload, + InvalidLocalizedPushNotificationLanguage, + MissingLocalizedPushNotificationMessage, + PushNotificationTemplateMissingPlatformPayload, + PushNotificationTemplatePayloadContainsInvalidJson, + PushNotificationTemplateContainsInvalidIosPayload, + PushNotificationTemplateContainsInvalidAndroidPayload, + PushNotificationTemplateIosPayloadMissingNotificationBody, + PushNotificationTemplateAndroidPayloadMissingNotificationBody, + PushNotificationTemplateNotFound, + PushNotificationTemplateMissingDefaultVersion, + PushNotificationTemplateInvalidSyntax, + PushNotificationTemplateNoCustomPayloadForV1, + NoLeaderboardForStatistic, + TitleNewsMissingDefaultLanguage, + TitleNewsNotFound, + TitleNewsDuplicateLanguage, + TitleNewsMissingTitleOrBody, + TitleNewsInvalidLanguage, + EmailRecipientBlacklisted, + InvalidGameCenterAuthRequest, + GameCenterAuthenticationFailed, + CannotEnablePartiesForTitle, + PartyError, + PartyRequests, + PartyNoContent, + PartyBadRequest, + PartyUnauthorized, + PartyForbidden, + PartyNotFound, + PartyConflict, + PartyInternalServerError, + PartyUnavailable, + PartyTooManyRequests, + PushNotificationTemplateMissingName, + CannotEnableMultiplayerServersForTitle, + WriteAttemptedDuringExport, + MultiplayerServerTitleQuotaCoresExceeded, + AutomationRuleNotFound, + EntityAPIKeyLimitExceeded, + EntityAPIKeyNotFound, + EntityAPIKeyOrSecretInvalid, + EconomyServiceUnavailable, + EconomyServiceInternalError, + QueryRateLimitExceeded, + EntityAPIKeyCreationDisabledForEntity, + ForbiddenByEntityPolicy, + UpdateInventoryRateLimitExceeded, + StudioCreationRateLimited, + StudioCreationInProgress, + DuplicateStudioName, + StudioNotFound, + StudioDeleted, + StudioDeactivated, + StudioActivated, + TitleCreationRateLimited, + TitleCreationInProgress, + DuplicateTitleName, + TitleActivationRateLimited, + TitleActivationInProgress, + TitleDeactivated, + TitleActivated, + CloudScriptAzureFunctionsExecutionTimeLimitExceeded, + CloudScriptAzureFunctionsArgumentSizeExceeded, + CloudScriptAzureFunctionsReturnSizeExceeded, + CloudScriptAzureFunctionsHTTPRequestError, + VirtualCurrencyBetaGetError, + VirtualCurrencyBetaCreateError, + VirtualCurrencyBetaInitialDepositSaveError, + VirtualCurrencyBetaSaveError, + VirtualCurrencyBetaDeleteError, + VirtualCurrencyBetaRestoreError, + VirtualCurrencyBetaSaveConflict, + VirtualCurrencyBetaUpdateError, + InsightsManagementDatabaseNotFound, + InsightsManagementOperationNotFound, + InsightsManagementErrorPendingOperationExists, + InsightsManagementSetPerformanceLevelInvalidParameter, + InsightsManagementSetStorageRetentionInvalidParameter, + InsightsManagementGetStorageUsageInvalidParameter, + InsightsManagementGetOperationStatusInvalidParameter, + DuplicatePurchaseTransactionId, + EvaluationModePlayerCountExceeded, + GetPlayersInSegmentRateLimitExceeded, + CloudScriptFunctionNameSizeExceeded, + PaidInsightsFeaturesNotEnabled, + CloudScriptAzureFunctionsQueueRequestError, + EvaluationModeTitleCountExceeded, + InsightsManagementTitleNotInFlight, + LimitNotFound, + LimitNotAvailableViaAPI, + InsightsManagementSetStorageRetentionBelowMinimum, + InsightsManagementSetStorageRetentionAboveMaximum, + AppleNotEnabledForTitle, + InsightsManagementNewActiveEventExportLimitInvalid, + InsightsManagementSetPerformanceRateLimited, + PartyRequestsThrottledFromRateLimiter, + XboxServiceTooManyRequests, + NintendoSwitchNotEnabledForTitle, + RequestMultiplayerServersThrottledFromRateLimiter, + TitleDataOverrideNotFound, + DuplicateKeys, + WasNotCreatedWithCloudRoot, + LegacyMultiplayerServersDeprecated, + VirtualCurrencyCurrentlyUnavailable, + SteamUserNotFound, + ElasticSearchOperationFailed, + NotImplemented, + PublisherNotFound, + PublisherDeleted, + ApiDisabledForMigration, + ResourceNameUpdateNotAllowed, + ApiNotEnabledForTitle, + DuplicateTitleNameForPublisher, + AzureTitleCreationInProgress, + TitleConstraintsPublisherDeletion, + InvalidPlayerAccountPoolId, + PlayerAccountPoolNotFound, + PlayerAccountPoolDeleted, + TitleCleanupInProgress, + AzureResourceConcurrentOperationInProgress, + TitlePublisherUpdateNotAllowed, + AzureResourceManagerNotSupportedInStamp, + ApiNotIncludedInAzurePlayFabFeatureSet, + GoogleServiceAccountFailedAuth, + GoogleAPIServiceUnavailable, + GoogleAPIServiceUnknownError, + NoValidIdentityForAad, + PlayerIdentityLinkNotFound, + PhotonApplicationIdAlreadyInUse, + CloudScriptUnableToDeleteProductionRevision, + CustomIdNotFound, + AutomationInvalidInput, + AutomationInvalidRuleName, + AutomationRuleAlreadyExists, + AutomationRuleLimitExceeded, + InvalidGooglePlayGamesServerAuthCode, + PlayStreamConnectionFailed, + InvalidEventContents, + InsightsV1Deprecated, + AnalysisSubscriptionNotFound, + AnalysisSubscriptionFailed, + AnalysisSubscriptionFoundAlready, + AnalysisSubscriptionManagementInvalidInput, + InvalidGameCenterId, + InvalidNintendoSwitchAccountId, + EntityAPIKeysNotSupported, + IpAddressBanned, + EntityLineageBanned, + NamespaceMismatch, + InvalidServiceConfiguration, + InvalidNamespaceMismatch, + MatchmakingEntityInvalid, + MatchmakingPlayerAttributesInvalid, + MatchmakingQueueNotFound, + MatchmakingMatchNotFound, + MatchmakingTicketNotFound, + MatchmakingAlreadyJoinedTicket, + MatchmakingTicketAlreadyCompleted, + MatchmakingQueueConfigInvalid, + MatchmakingMemberProfileInvalid, + NintendoSwitchDeviceIdNotLinked, + MatchmakingNotEnabled, + MatchmakingPlayerAttributesTooLarge, + MatchmakingNumberOfPlayersInTicketTooLarge, + MatchmakingAttributeInvalid, + MatchmakingPlayerHasNotJoinedTicket, + MatchmakingRateLimitExceeded, + MatchmakingTicketMembershipLimitExceeded, + MatchmakingUnauthorized, + MatchmakingQueueLimitExceeded, + MatchmakingRequestTypeMismatch, + MatchmakingBadRequest, + PubSubFeatureNotEnabledForTitle, + PubSubTooManyRequests, + PubSubConnectionNotFoundForEntity, + PubSubConnectionHandleInvalid, + PubSubSubscriptionLimitExceeded, + TitleConfigNotFound, + TitleConfigUpdateConflict, + TitleConfigSerializationError, + CatalogApiNotImplemented, + CatalogEntityInvalid, + CatalogTitleIdMissing, + CatalogPlayerIdMissing, + CatalogClientIdentityInvalid, + CatalogOneOrMoreFilesInvalid, + CatalogItemMetadataInvalid, + CatalogItemIdInvalid, + CatalogSearchParameterInvalid, + CatalogFeatureDisabled, + CatalogConfigInvalid, + CatalogItemTypeInvalid, + CatalogBadRequest, + CatalogTooManyRequests, + ExportInvalidStatusUpdate, + ExportInvalidPrefix, + ExportBlobContainerDoesNotExist, + ExportNotFound, + ExportCouldNotUpdate, + ExportInvalidStorageType, + ExportAmazonBucketDoesNotExist, + ExportInvalidBlobStorage, + ExportKustoException, + ExportKustoConnectionFailed, + ExportUnknownError, + ExportCantEditPendingExport, + ExportLimitExports, + ExportLimitEvents, + ExportInvalidPartitionStatusModification, + ExportCouldNotCreate, + ExportNoBackingDatabaseFound, + ExportCouldNotDelete, + ExportCannotDetermineEventQuery, + ExportInvalidQuerySchemaModification, + ExportQuerySchemaMissingRequiredColumns, + ExportCannotParseQuery, + ExportControlCommandsNotAllowed, + ExportQueryMissingTableReference, + ExportInsightsV1Deprecated, + ExplorerBasicInvalidQueryName, + ExplorerBasicInvalidQueryDescription, + ExplorerBasicInvalidQueryConditions, + ExplorerBasicInvalidQueryStartDate, + ExplorerBasicInvalidQueryEndDate, + ExplorerBasicInvalidQueryGroupBy, + ExplorerBasicInvalidQueryAggregateType, + ExplorerBasicInvalidQueryAggregateProperty, + ExplorerBasicLoadQueriesError, + ExplorerBasicLoadQueryError, + ExplorerBasicCreateQueryError, + ExplorerBasicDeleteQueryError, + ExplorerBasicUpdateQueryError, + ExplorerBasicSavedQueriesLimit, + ExplorerBasicSavedQueryNotFound, + TenantShardMapperShardNotFound, + TitleNotEnabledForParty, + PartyVersionNotFound, + MultiplayerServerBuildReferencedByMatchmakingQueue, + MultiplayerServerBuildReferencedByBuildAlias, + MultiplayerServerBuildAliasReferencedByMatchmakingQueue, + ExperimentationExperimentStopped, + ExperimentationExperimentRunning, + ExperimentationExperimentNotFound, + ExperimentationExperimentNeverStarted, + ExperimentationExperimentDeleted, + ExperimentationClientTimeout, + ExperimentationInvalidVariantConfiguration, + ExperimentationInvalidVariableConfiguration, + ExperimentInvalidId, + ExperimentationNoScorecard, + ExperimentationTreatmentAssignmentFailed, + ExperimentationTreatmentAssignmentDisabled, + ExperimentationInvalidDuration, + ExperimentationMaxExperimentsReached, + ExperimentationExperimentSchedulingInProgress, + ExperimentationInvalidEndDate, + ExperimentationInvalidStartDate, + ExperimentationMaxDurationExceeded, + ExperimentationExclusionGroupNotFound, + ExperimentationExclusionGroupInsufficientCapacity, + ExperimentationExclusionGroupCannotDelete, + ExperimentationExclusionGroupInvalidTrafficAllocation, + ExperimentationExclusionGroupInvalidName, + MaxActionDepthExceeded, + TitleNotOnUpdatedPricingPlan, + SegmentManagementTitleNotInFlight, + SegmentManagementNoExpressionTree, + SegmentManagementTriggerActionCountOverLimit, + SegmentManagementSegmentCountOverLimit, + SegmentManagementInvalidSegmentId, + SegmentManagementInvalidInput, + SegmentManagementInvalidSegmentName, + DeleteSegmentRateLimitExceeded, + CreateSegmentRateLimitExceeded, + UpdateSegmentRateLimitExceeded, + GetSegmentsRateLimitExceeded, + AsyncExportNotInFlight, + AsyncExportNotFound, + AsyncExportRateLimitExceeded, + AnalyticsSegmentCountOverLimit, + SnapshotNotFound, + InventoryApiNotImplemented, + LobbyDoesNotExist, + LobbyRateLimitExceeded, + LobbyPlayerAlreadyJoined, + LobbyNotJoinable, + LobbyMemberCannotRejoin, + LobbyCurrentPlayersMoreThanMaxPlayers, + LobbyPlayerNotPresent, + LobbyBadRequest, + LobbyPlayerMaxLobbyLimitExceeded, + LobbyNewOwnerMustBeConnected, + LobbyCurrentOwnerStillConnected, + LobbyMemberIsNotOwner, + EventSamplingInvalidRatio, + EventSamplingInvalidEventNamespace, + EventSamplingInvalidEventName, + EventSamplingRatioNotFound, + TelemetryKeyNotFound, + TelemetryKeyInvalidName, + TelemetryKeyAlreadyExists, + TelemetryKeyInvalid, + TelemetryKeyCountOverLimit, + TelemetryKeyDeactivated, + TelemetryKeyLongInsightsRetentionNotAllowed, + EventSinkConnectionInvalid, + EventSinkConnectionUnauthorized, + EventSinkRegionInvalid, + EventSinkLimitExceeded, + EventSinkSasTokenInvalid, + EventSinkNotFound, + EventSinkNameInvalid, + EventSinkSasTokenPermissionInvalid, + EventSinkSecretInvalid, + EventSinkTenantNotFound, + EventSinkAadNotFound, + EventSinkDatabaseNotFound, + OperationCanceled, + InvalidDisplayNameRandomSuffixLength, + AllowNonUniquePlayerDisplayNamesDisableNotAllowed, + PartitionedEventInvalid, + PartitionedEventCountOverLimit, + PlayerCustomPropertiesPropertyNameTooLong, + PlayerCustomPropertiesPropertyNameIsInvalid, + PlayerCustomPropertiesStringPropertyValueTooLong, + PlayerCustomPropertiesValueIsInvalidType, + PlayerCustomPropertiesVersionMismatch, + PlayerCustomPropertiesPropertyCountTooHigh, + PlayerCustomPropertiesDuplicatePropertyName, + PlayerCustomPropertiesPropertyDoesNotExist + } + + [Serializable] + public class GenericPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique generic service identifier for a user. + /// + public GenericServiceId GenericId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the given generic identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class GenericServiceId : PlayFabBaseModel + { + /// + /// Name of the service for which the player has a unique identifier. + /// + public string ServiceName; + /// + /// Unique identifier of the player in that service. + /// + public string UserId; + } + + /// + /// Request has no paramaters. + /// + [Serializable] + public class GetAllSegmentsRequest : PlayFabRequestCommon + { + } + + [Serializable] + public class GetAllSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments for this title. + /// + public List Segments; + } + + [Serializable] + public class GetCatalogItemsRequest : PlayFabRequestCommon + { + /// + /// Which catalog is being requested. If null, uses the default catalog. + /// + public string CatalogVersion; + } + + [Serializable] + public class GetCatalogItemsResult : PlayFabResultCommon + { + /// + /// Array of items which can be purchased. + /// + public List Catalog; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterDataResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// All items currently in the character inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. Also returns their virtual currency balances. + /// + [Serializable] + public class GetCharacterInventoryRequest : PlayFabRequestCommon + { + /// + /// Used to limit results to only those from a specific catalog version. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterInventoryResult : PlayFabResultCommon + { + /// + /// Unique identifier of the character for this inventory. + /// + public string CharacterId; + /// + /// Array of inventory items belonging to the character. + /// + public List Inventory; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Array of virtual currency balance(s) belonging to the character. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + [Serializable] + public class GetCharacterLeaderboardRequest : PlayFabRequestCommon + { + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// First entry in the leaderboard to be retrieved. + /// + public int StartPosition; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note that the Position of the character in the results is for the overall leaderboard. + /// + [Serializable] + public class GetCharacterLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + /// + /// Character statistics are similar to user statistics in that they are numeric values which may only be updated by a + /// server operation, in order to minimize the opportunity for unauthorized changes. In addition to being available for use + /// by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetCharacterStatisticsResult : PlayFabResultCommon + { + /// + /// Unique identifier of the character for the statistics. + /// + public string CharacterId; + /// + /// Character statistics for the requested user. + /// + public Dictionary CharacterStatistics; + /// + /// PlayFab unique identifier of the user whose character statistics are being returned. + /// + public string PlayFabId; + } + + [Serializable] + public class GetContentDownloadUrlRequest : PlayFabRequestCommon + { + /// + /// HTTP method to fetch item - GET or HEAD. Use HEAD when only fetching metadata. Default is GET. + /// + public string HttpMethod; + /// + /// Key of the content item to fetch, usually formatted as a path, e.g. images/a.png + /// + public string Key; + /// + /// True to download through CDN. CDN provides higher download bandwidth and lower latency. However, if you want the latest, + /// non-cached version of the content during development, set this to false. Default is true. + /// + public bool? ThruCDN; + } + + [Serializable] + public class GetContentDownloadUrlResult : PlayFabResultCommon + { + /// + /// URL for downloading content via HTTP GET or HEAD method. The URL will expire in approximately one hour. + /// + public string URL; + } + + [Serializable] + public class GetFriendLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// The player whose friend leaderboard to get + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Position in the leaderboard to start this listing (defaults to the first entry). + /// + public int StartPosition; + /// + /// Statistic used to rank friends for this leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + [Serializable] + public class GetFriendsListRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates which other platforms' friends should be included in the response. In HTTP, it is represented as a + /// comma-separated list of platforms. + /// + public ExternalFriendSources? ExternalPlatformFriends; + /// + /// PlayFab identifier of the player whose friend list to get. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Xbox token if Xbox friends should be included. Requires Xbox be configured on PlayFab. + /// + public string XboxToken; + } + + /// + /// If any additional services are queried for the user's friends, those friends who also have a PlayFab account registered + /// for the title will be returned in the results. For Facebook, user has to have logged into the title's Facebook app + /// recently, and only friends who also plays this game will be included. For Xbox Live, user has to have logged into the + /// Xbox Live recently, and only friends who also play this game will be included. + /// + [Serializable] + public class GetFriendsListResult : PlayFabResultCommon + { + /// + /// Array of friends found. + /// + public List Friends; + } + + [Serializable] + public class GetLeaderboardAroundCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the character defaults to 0 when the character does + /// not have the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundCharacterResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardAroundUserRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note: When calling 'GetLeaderboardAround...' APIs, the position of the user defaults to 0 when the user does not have + /// the corresponding statistic. + /// + [Serializable] + public class GetLeaderboardAroundUserResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetLeaderboardForUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + } + + /// + /// NOTE: The position of the character in the results is relative to the other characters for that specific user. This mean + /// the values will always be between 0 and one less than the number of characters returned regardless of the size of the + /// actual leaderboard. + /// + [Serializable] + public class GetLeaderboardForUsersCharactersResult : PlayFabResultCommon + { + /// + /// Ordered list of leaderboard entries. + /// + public List Leaderboard; + } + + [Serializable] + public class GetLeaderboardRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Maximum number of entries to retrieve. + /// + public int MaxResultsCount; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// First entry in the leaderboard to be retrieved. + /// + public int StartPosition; + /// + /// Unique identifier for the title-specific statistic for the leaderboard. + /// + public string StatisticName; + /// + /// The version of the leaderboard to get. + /// + public int? Version; + } + + /// + /// Note that the Position of the user in the results is for the overall leaderboard. + /// + [Serializable] + public class GetLeaderboardResult : PlayFabResultCommon + { + /// + /// Ordered listing of users and their positions in the requested leaderboard. + /// + public List Leaderboard; + /// + /// The time the next scheduled reset will occur. Null if the leaderboard does not reset on a schedule. + /// + public DateTime? NextReset; + /// + /// The version of the leaderboard returned. + /// + public int Version; + } + + [Serializable] + public class GetPlayerCombinedInfoRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// PlayFabId of the user whose data will be returned + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoRequestParams : PlayFabBaseModel + { + /// + /// Whether to get character inventories. Defaults to false. + /// + public bool GetCharacterInventories; + /// + /// Whether to get the list of characters. Defaults to false. + /// + public bool GetCharacterList; + /// + /// Whether to get player profile. Defaults to false. Has no effect for a new player. + /// + public bool GetPlayerProfile; + /// + /// Whether to get player statistics. Defaults to false. + /// + public bool GetPlayerStatistics; + /// + /// Whether to get title data. Defaults to false. + /// + public bool GetTitleData; + /// + /// Whether to get the player's account Info. Defaults to false + /// + public bool GetUserAccountInfo; + /// + /// Whether to get the player's custom data. Defaults to false + /// + public bool GetUserData; + /// + /// Whether to get the player's inventory. Defaults to false + /// + public bool GetUserInventory; + /// + /// Whether to get the player's read only data. Defaults to false + /// + public bool GetUserReadOnlyData; + /// + /// Whether to get the player's virtual currency balances. Defaults to false + /// + public bool GetUserVirtualCurrency; + /// + /// Specific statistics to retrieve. Leave null to get all keys. Has no effect if GetPlayerStatistics is false + /// + public List PlayerStatisticNames; + /// + /// Specifies the properties to return from the player profile. Defaults to returning the player's display name. + /// + public PlayerProfileViewConstraints ProfileConstraints; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetTitleData is false + /// + public List TitleDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserData is false + /// + public List UserDataKeys; + /// + /// Specific keys to search for in the custom data. Leave null to get all keys. Has no effect if GetUserReadOnlyData is + /// false + /// + public List UserReadOnlyDataKeys; + } + + [Serializable] + public class GetPlayerCombinedInfoResult : PlayFabResultCommon + { + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerCombinedInfoResultPayload : PlayFabBaseModel + { + /// + /// Account information for the user. This is always retrieved. + /// + public UserAccountInfo AccountInfo; + /// + /// Inventories for each character for the user. + /// + public List CharacterInventories; + /// + /// List of characters for the user. + /// + public List CharacterList; + /// + /// The profile of the players. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + /// + /// List of statistics for this player. + /// + public List PlayerStatistics; + /// + /// Title data for this title. + /// + public Dictionary TitleData; + /// + /// User specific custom data. + /// + public Dictionary UserData; + /// + /// The version of the UserData that was returned. + /// + public uint UserDataVersion; + /// + /// Array of inventory items in the user's current inventory. + /// + public List UserInventory; + /// + /// User specific read-only data. + /// + public Dictionary UserReadOnlyData; + /// + /// The version of the Read-Only UserData that was returned. + /// + public uint UserReadOnlyDataVersion; + /// + /// Dictionary of virtual currency balance(s) belonging to the user. + /// + public Dictionary UserVirtualCurrency; + /// + /// Dictionary of remaining times and timestamps for virtual currencies. + /// + public Dictionary UserVirtualCurrencyRechargeTimes; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetPlayerProfileRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// If non-null, this determines which properties of the resulting player profiles to return. For API calls from the client, + /// only the allowed client profile properties for the title may be requested. These allowed properties are configured in + /// the Game Manager "Client Profile Options" tab in the "Settings" section. + /// + public PlayerProfileViewConstraints ProfileConstraints; + } + + [Serializable] + public class GetPlayerProfileResult : PlayFabResultCommon + { + /// + /// The profile of the player. This profile is not guaranteed to be up-to-date. For a new player, this profile will not + /// exist. + /// + public PlayerProfileModel PlayerProfile; + } + + [Serializable] + public class GetPlayerSegmentsResult : PlayFabResultCommon + { + /// + /// Array of segments the requested player currently belongs to. + /// + public List Segments; + } + + /// + /// Initial request must contain at least a Segment ID. Subsequent requests must contain the Segment ID as well as the + /// Continuation Token. Failure to send the Continuation Token will result in a new player segment list being generated. + /// Each time the Continuation Token is passed in the length of the Total Seconds to Live is refreshed. If too much time + /// passes between requests to the point that a subsequent request is past the Total Seconds to Live an error will be + /// returned and paging will be terminated. This API is resource intensive and should not be used in scenarios which might + /// generate high request volumes. Only one request to this API at a time should be made per title. Concurrent requests to + /// the API may be rejected with the APIConcurrentRequestLimitExceeded error. + /// + [Serializable] + public class GetPlayersInSegmentRequest : PlayFabRequestCommon + { + /// + /// Continuation token if retrieving subsequent pages of results. + /// + public string ContinuationToken; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If set to true, the profiles are loaded asynchronously and the response will include a continuation token and + /// approximate profile count until the first batch of profiles is loaded. Use this parameter to help avoid network + /// timeouts. + /// + public bool? GetProfilesAsync; + /// + /// Maximum is 10,000. The value 0 will prevent loading any profiles and return only the count of profiles matching this + /// segment. + /// + public uint? MaxBatchSize; + /// + /// Number of seconds to keep the continuation token active. After token expiration it is not possible to continue paging + /// results. Default is 300 (5 minutes). Maximum is 5,400 (90 minutes). + /// + public uint? SecondsToLive; + /// + /// Unique identifier for this segment. + /// + public string SegmentId; + } + + [Serializable] + public class GetPlayersInSegmentResult : PlayFabResultCommon + { + /// + /// Continuation token to use to retrieve subsequent pages of results. If token returns null there are no more results. + /// + public string ContinuationToken; + /// + /// Array of player profiles in this segment. + /// + public List PlayerProfiles; + /// + /// Count of profiles matching this segment. + /// + public int ProfilesInSegment; + } + + [Serializable] + public class GetPlayersSegmentsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// user for whom statistics are being requested + /// + public string PlayFabId; + /// + /// statistics to return + /// + public List StatisticNames; + /// + /// statistics to return, if StatisticNames is not set (only statistics which have a version matching that provided will be + /// returned) + /// + public List StatisticNameVersions; + } + + /// + /// In addition to being available for use by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class GetPlayerStatisticsResult : PlayFabResultCommon + { + /// + /// PlayFab unique identifier of the user whose statistics are being returned + /// + public string PlayFabId; + /// + /// User statistics for the requested user. + /// + public List Statistics; + } + + [Serializable] + public class GetPlayerStatisticVersionsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// unique name of the statistic + /// + public string StatisticName; + } + + [Serializable] + public class GetPlayerStatisticVersionsResult : PlayFabResultCommon + { + /// + /// version change history of the statistic + /// + public List StatisticVersions; + } + + /// + /// This API will return a list of canonical tags which includes both namespace and tag's name. If namespace is not + /// provided, the result is a list of all canonical tags. TagName can be used for segmentation and Namespace is limited to + /// 128 characters. + /// + [Serializable] + public class GetPlayerTagsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional namespace to filter results by + /// + public string Namespace; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetPlayerTagsResult : PlayFabResultCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Canonical tags (including namespace and tag's name) for the requested user + /// + public List Tags; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook identifiers for which the title needs to get PlayFab identifiers. The array cannot exceed 2,000 + /// in length. + /// + public List FacebookIDs; + } + + /// + /// For Facebook identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Facebook Instant Games identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 25 in length. + /// + public List FacebookInstantGamesIds; + } + + /// + /// For Facebook Instant Games identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromFacebookInstantGamesIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Facebook Instant Games identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromGenericIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique generic service identifiers for which the title needs to get PlayFab identifiers. Currently limited to a + /// maximum of 10 in a single request. + /// + public List GenericIDs; + } + + /// + /// For generic service identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromGenericIDsResult : PlayFabResultCommon + { + /// + /// Mapping of generic service identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Account identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoAccountIds; + } + + /// + /// For Nintendo Service Account identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoServiceAccountIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Service Account identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Nintendo Switch Device identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List NintendoSwitchDeviceIds; + } + + /// + /// For Nintendo Switch Device identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromNintendoSwitchDeviceIdsResult : PlayFabResultCommon + { + /// + /// Mapping of Nintendo Switch Device identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsRequest : PlayFabRequestCommon + { + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Array of unique PlayStation :tm: Network identifiers for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List PSNAccountIDs; + } + + /// + /// For PlayStation :tm: Network identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromPSNAccountIDsResult : PlayFabResultCommon + { + /// + /// Mapping of PlayStation :tm: Network identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromSteamIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Steam identifiers (Steam profile IDs) for which the title needs to get PlayFab identifiers. The array + /// cannot exceed 2,000 in length. + /// + public List SteamStringIDs; + } + + /// + /// For Steam identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromSteamIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Steam identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromTwitchIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique Twitch identifiers (Twitch's _id) for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List TwitchIds; + } + + /// + /// For Twitch identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromTwitchIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Twitch identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsRequest : PlayFabRequestCommon + { + /// + /// The ID of Xbox Live sandbox. + /// + public string Sandbox; + /// + /// Array of unique Xbox Live account identifiers for which the title needs to get PlayFab identifiers. The array cannot + /// exceed 2,000 in length. + /// + public List XboxLiveAccountIDs; + } + + /// + /// For XboxLive identifiers which have not been linked to PlayFab accounts, null will be returned. + /// + [Serializable] + public class GetPlayFabIDsFromXboxLiveIDsResult : PlayFabResultCommon + { + /// + /// Mapping of Xbox Live identifiers to PlayFab identifiers. + /// + public List Data; + } + + /// + /// This API is designed to return publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. For more information email helloplayfab@microsoft.com. Note that there may up + /// to a minute delay in between updating title data and this API call returning the newest value. + /// + [Serializable] + public class GetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// array of keys to get back data from the Publisher data blob, set by the admin tools + /// + public List Keys; + } + + [Serializable] + public class GetPublisherDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetRandomResultTablesRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to retrieve the Random Result Tables. If unspecified, uses + /// default/primary catalog. + /// + public string CatalogVersion; + /// + /// The unique identifier of the Random Result Table to use. + /// + public List TableIDs; + } + + /// + /// Note that if a specified Random Result Table contains no entries, or does not exist in the catalog, an InvalidDropTable + /// error will be returned. + /// + [Serializable] + public class GetRandomResultTablesResult : PlayFabResultCommon + { + /// + /// array of random result tables currently available + /// + public Dictionary Tables; + } + + [Serializable] + public class GetSegmentResult : PlayFabBaseModel + { + /// + /// Identifier of the segments AB Test, if it is attached to one. + /// + public string ABTestParent; + /// + /// Unique identifier for this segment. + /// + public string Id; + /// + /// Segment name. + /// + public string Name; + } + + [Serializable] + public class GetServerCustomIDsFromPlayFabIDsRequest : PlayFabRequestCommon + { + /// + /// Array of unique PlayFab player identifiers for which the title needs to get server custom identifiers. Cannot contain + /// more than 25 identifiers. + /// + public List PlayFabIDs; + } + + /// + /// For a PlayFab account that isn't associated with a server custom identity, ServerCustomId will be null. + /// + [Serializable] + public class GetServerCustomIDsFromPlayFabIDsResult : PlayFabResultCommon + { + /// + /// Mapping of server custom player identifiers to PlayFab identifiers. + /// + public List Data; + } + + [Serializable] + public class GetSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// If true, return the list of all members of the shared group. + /// + public bool? GetMembers; + /// + /// Specific keys to retrieve from the shared group (if not specified, all keys will be returned, while an empty array + /// indicates that no keys should be returned). + /// + public List Keys; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class GetSharedGroupDataResult : PlayFabResultCommon + { + /// + /// Data for the requested keys. + /// + public Dictionary Data; + /// + /// List of PlayFabId identifiers for the members of this group, if requested. + /// + public List Members; + } + + [Serializable] + public class GetStoreItemsResult : PlayFabResultCommon + { + /// + /// The base catalog that this store is a part of. + /// + public string CatalogVersion; + /// + /// Additional data about the store. + /// + public StoreMarketingModel MarketingData; + /// + /// How the store was last updated (Admin or a third party). + /// + public SourceType? Source; + /// + /// Array of items which can be purchased from this store. + /// + public List Store; + /// + /// The ID of this store. + /// + public string StoreId; + } + + /// + /// A store contains an array of references to items defined in one or more catalog versions of the game, along with the + /// prices for the item, in both real world and virtual currencies. These prices act as an override to any prices defined in + /// the catalog. In this way, the base definitions of the items may be defined in the catalog, with all associated + /// properties, while the pricing can be set for each store, as needed. This allows for subsets of goods to be defined for + /// different purposes (in order to simplify showing some, but not all catalog items to users, based upon different + /// characteristics), along with unique prices. Note that all prices defined in the catalog and store definitions for the + /// item are considered valid, and that a compromised client can be made to send a request for an item based upon any of + /// these definitions. If no price is specified in the store for an item, the price set in the catalog should be displayed + /// to the user. + /// + [Serializable] + public class GetStoreItemsServerRequest : PlayFabRequestCommon + { + /// + /// Catalog version to store items from. Use default catalog version if null + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Optional identifier for the player to use in requesting the store information - if used, segment overrides will be + /// applied + /// + public string PlayFabId; + /// + /// Unqiue identifier for the store which is being requested + /// + public string StoreId; + } + + /// + /// This query retrieves the current time from one of the servers in PlayFab. Please note that due to clock drift between + /// servers, there is a potential variance of up to 5 seconds. + /// + [Serializable] + public class GetTimeRequest : PlayFabRequestCommon + { + } + + /// + /// Time is always returned as Coordinated Universal Time (UTC). + /// + [Serializable] + public class GetTimeResult : PlayFabResultCommon + { + /// + /// Current server time when the request was received, in UTC + /// + public DateTime Time; + } + + /// + /// This API is designed to return title specific values which can be read, but not written to, by the client. For example, + /// a developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. If an override label is specified in the request, the overrides are applied automatically and returned with the + /// title data. Note that there may up to a minute delay in between updating title data and this API call returning the + /// newest value. + /// + [Serializable] + public class GetTitleDataRequest : PlayFabRequestCommon + { + /// + /// Specific keys to search for in the title data (leave null to get all keys) + /// + public List Keys; + /// + /// Optional field that specifies the name of an override. This value is ignored when used by the game client; otherwise, + /// the overrides are applied automatically to the title data. + /// + public string OverrideLabel; + } + + [Serializable] + public class GetTitleDataResult : PlayFabResultCommon + { + /// + /// a dictionary object of key / value pairs + /// + public Dictionary Data; + } + + [Serializable] + public class GetTitleNewsRequest : PlayFabRequestCommon + { + /// + /// Limits the results to the last n entries. Defaults to 10 if not set. + /// + public int? Count; + } + + [Serializable] + public class GetTitleNewsResult : PlayFabResultCommon + { + /// + /// Array of localized news items. + /// + public List News; + } + + /// + /// This API allows for access to details regarding a user in the PlayFab service, usually for purposes of customer support. + /// Note that data returned may be Personally Identifying Information (PII), such as email address, and so care should be + /// taken in how this data is stored and managed. Since this call will always return the relevant information for users who + /// have accessed the title, the recommendation is to not store this data locally. + /// + [Serializable] + public class GetUserAccountInfoRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserAccountInfoResult : PlayFabResultCommon + { + /// + /// Account details for the user whose information was requested. + /// + public UserAccountInfo UserInfo; + } + + /// + /// Get all bans for a user, including inactive and expired bans. + /// + [Serializable] + public class GetUserBansRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserBansResult : PlayFabResultCommon + { + /// + /// Information about the bans + /// + public List BanData; + } + + /// + /// Data is stored as JSON key-value pairs. If the Keys parameter is provided, the data object returned will only contain + /// the data specific to the indicated Keys. Otherwise, the full set of custom user data will be returned. + /// + [Serializable] + public class GetUserDataRequest : PlayFabRequestCommon + { + /// + /// The version that currently exists according to the caller. The call will return the data for all of the keys if the + /// version in the system is greater than this. + /// + public uint? IfChangedFromDataVersion; + /// + /// Specific keys to search for in the custom user data. + /// + public List Keys; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserDataResult : PlayFabResultCommon + { + /// + /// User specific data for this title. + /// + public Dictionary Data; + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + /// + /// PlayFab unique identifier of the user whose custom data is being returned. + /// + public string PlayFabId; + } + + /// + /// All items currently in the user inventory will be returned, irrespective of how they were acquired (via purchasing, + /// grants, coupons, etc.). Items that are expired, fully consumed, or are no longer valid are not considered to be in the + /// user's current inventory, and so will not be not included. + /// + [Serializable] + public class GetUserInventoryRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GetUserInventoryResult : PlayFabResultCommon + { + /// + /// Array of inventory items belonging to the user. + /// + public List Inventory; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Array of virtual currency balance(s) belonging to the user. + /// + public Dictionary VirtualCurrency; + /// + /// Array of remaining times and timestamps for virtual currencies. + /// + public Dictionary VirtualCurrencyRechargeTimes; + } + + /// + /// Grants a character to the user of the type and name specified in the request. + /// + [Serializable] + public class GrantCharacterToUserRequest : PlayFabRequestCommon + { + /// + /// Non-unique display name of the character being granted (1-40 characters in length). + /// + public string CharacterName; + /// + /// Type of the character being granted; statistics can be sliced based on this value. + /// + public string CharacterType; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GrantCharacterToUserResult : PlayFabResultCommon + { + /// + /// Unique identifier tagged to this character. + /// + public string CharacterId; + } + + /// + /// Result of granting an item to a user. Note, to retrieve additional information for an item such as Tags, Description + /// that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can be matched + /// to a catalog entry, which contains the additional information. Also note that Custom Data is only set when the User's + /// specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields such as + /// UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class GrantedItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Result of this operation. + /// + public bool Result; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + /// + /// This function directly adds inventory items to the character's inventories. As a result of this operations, the user + /// will not be charged any transaction fee, regardless of the inventory item catalog definition. Please note that the + /// processing time for inventory grants and purchases increases fractionally the more items are in the inventory, and the + /// more items are in the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToCharacterRequest : PlayFabRequestCommon + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of itemIds to grant to the user. + /// + public List ItemIds; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class GrantItemsToCharacterResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + /// + /// This function directly adds inventory items to the user's inventories. As a result of this operations, the user will not + /// be charged any transaction fee, regardless of the inventory item catalog definition. Please note that the processing + /// time for inventory grants and purchases increases fractionally the more items are in the inventory, and the more items + /// are in the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToUserRequest : PlayFabRequestCommon + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of itemIds to grant to the user. + /// + public List ItemIds; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// Please note that the order of the items in the response may not match the order of items in the request. + /// + [Serializable] + public class GrantItemsToUserResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + /// + /// This function directly adds inventory items to user inventories. As a result of this operations, the user will not be + /// charged any transaction fee, regardless of the inventory item catalog definition. Please note that the processing time + /// for inventory grants and purchases increases fractionally the more items are in the inventory, and the more items are in + /// the grant/purchase operation. + /// + [Serializable] + public class GrantItemsToUsersRequest : PlayFabRequestCommon + { + /// + /// Catalog version from which items are to be granted. + /// + public string CatalogVersion; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Array of items to grant and the users to whom the items are to be granted. + /// + public List ItemGrants; + } + + /// + /// Please note that the order of the items in the response may not match the order of items in the request. + /// + [Serializable] + public class GrantItemsToUsersResult : PlayFabResultCommon + { + /// + /// Array of items granted to users. + /// + public List ItemGrantResults; + } + + [Serializable] + public class ItemGrant : PlayFabBaseModel + { + /// + /// String detailing any additional information concerning this operation. + /// + public string Annotation; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Unique identifier of the catalog item to be granted to the user. + /// + public string ItemId; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// A unique instance of an item in a user's inventory. Note, to retrieve additional information for an item such as Tags, + /// Description that are the same across all instances of the item, a call to GetCatalogItems is required. The ItemID of can + /// be matched to a catalog entry, which contains the additional information. Also note that Custom Data is only set when + /// the User's specific instance has updated the CustomData via a call to UpdateUserInventoryItemCustomData. Other fields + /// such as UnitPrice and UnitCurrency are only set when the item was granted via a purchase. + /// + [Serializable] + public class ItemInstance : PlayFabBaseModel + { + /// + /// Game specific comment associated with this instance when it was added to the user inventory. + /// + public string Annotation; + /// + /// Array of unique items that were awarded when this catalog item was purchased. + /// + public List BundleContents; + /// + /// Unique identifier for the parent inventory item, as defined in the catalog, for object which were added from a bundle or + /// container. + /// + public string BundleParent; + /// + /// Catalog version for the inventory item, when this instance was created. + /// + public string CatalogVersion; + /// + /// A set of custom key-value pairs on the instance of the inventory item, which is not to be confused with the catalog + /// item's custom data. + /// + public Dictionary CustomData; + /// + /// CatalogItem.DisplayName at the time this item was purchased. + /// + public string DisplayName; + /// + /// Timestamp for when this instance will expire. + /// + public DateTime? Expiration; + /// + /// Class name for the inventory item, as defined in the catalog. + /// + public string ItemClass; + /// + /// Unique identifier for the inventory item, as defined in the catalog. + /// + public string ItemId; + /// + /// Unique item identifier for this specific instance of the item. + /// + public string ItemInstanceId; + /// + /// Timestamp for when this instance was purchased. + /// + public DateTime? PurchaseDate; + /// + /// Total number of remaining uses, if this is a consumable item. + /// + public int? RemainingUses; + /// + /// Currency type for the cost of the catalog item. Not available when granting items. + /// + public string UnitCurrency; + /// + /// Cost of the catalog item in the given currency. Not available when granting items. + /// + public uint UnitPrice; + /// + /// The number of uses that were added or removed to this item in this call. + /// + public int? UsesIncrementedBy; + } + + [Serializable] + public class LinkedPlatformAccountModel : PlayFabBaseModel + { + /// + /// Linked account email of the user on the platform, if available + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Unique account identifier of the user on the platform + /// + public string PlatformUserId; + /// + /// Linked account username of the user on the platform, if available + /// + public string Username; + } + + [Serializable] + public class LinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to a specific Nintendo Switch account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// The JSON Web token (JWT) returned by Nintendo after login. Used to validate the request and find the user ID (Nintendo + /// Switch subject) to link with. + /// + public string IdentityToken; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the Nintendo Switch Device ID, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Nintendo Switch unique identifier for the user's device. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class LinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// Authentication code provided by the PlayStation :tm: Network. + /// + public string AuthCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Id of the PlayStation :tm: Network issuer environment. If null, defaults to production environment. + /// + public int? IssuerId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Redirect URI supplied to PlayStation :tm: Network when requesting an auth code + /// + public string RedirectUri; + } + + [Serializable] + public class LinkPSNAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkServerCustomIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the custom ID, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Unique PlayFab identifier. + /// + public string PlayFabId; + /// + /// Unique server custom identifier for this player. + /// + public string ServerCustomId; + } + + [Serializable] + public class LinkServerCustomIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkSteamIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Unique Steam identifier for a user. + /// + public string SteamId; + } + + [Serializable] + public class LinkSteamIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class LinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// If another user is already linked to the account, unlink the other user and re-link. + /// + public bool? ForceLink; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Returns a list of every character that currently belongs to a user. + /// + [Serializable] + public class ListUsersCharactersRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class ListUsersCharactersResult : PlayFabResultCommon + { + /// + /// The requested list of characters. + /// + public List Characters; + } + + /// + /// Contains the localized push notification content. + /// + [Serializable] + public class LocalizedPushNotificationProperties : PlayFabBaseModel + { + /// + /// Message of the localized push notification template. + /// + public string Message; + /// + /// Subject of the localized push notification template. + /// + public string Subject; + } + + [Serializable] + public class LocationModel : PlayFabBaseModel + { + /// + /// City name. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode? ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode? CountryCode; + /// + /// Latitude coordinate of the geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the geographic location. + /// + public double? Longitude; + } + + public enum LoginIdentityProvider + { + Unknown, + PlayFab, + Custom, + GameCenter, + GooglePlay, + Steam, + XBoxLive, + PSN, + Kongregate, + Facebook, + IOSDevice, + AndroidDevice, + Twitch, + WindowsHello, + GameServer, + CustomServer, + NintendoSwitch, + FacebookInstantGames, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class LoginWithServerCustomIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// The backend server identifier for this player. + /// + public string ServerCustomId; + } + + /// + /// If this is the first time a user has signed in with the Steam ID and CreateAccount is set to true, a new PlayFab account + /// will be created and linked to the Steam account. In this case, no email or username will be associated with the PlayFab + /// account. Otherwise, if no PlayFab account is linked to the Steam account, an error indicating this will be returned, so + /// that the title can guide the user through creation of a PlayFab account. Steam users that are not logged into the Steam + /// Client app will only have their Steam username synced, other data, such as currency and country will not be available + /// until they login while the Client is open. + /// + [Serializable] + public class LoginWithSteamIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Unique Steam identifier for a user. + /// + public string SteamId; + } + + /// + /// If this is the first time a user has signed in with the Xbox ID and CreateAccount is set to true, a new PlayFab account + /// will be created and linked to the Xbox Live account. In this case, no email or username will be associated with the + /// PlayFab account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error indicating this will be + /// returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithXboxIdRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// The id of Xbox Live sandbox. + /// + public string Sandbox; + /// + /// Unique Xbox identifier for a user. + /// + public string XboxId; + } + + /// + /// If this is the first time a user has signed in with the Xbox Live account and CreateAccount is set to true, a new + /// PlayFab account will be created and linked to the Xbox Live account. In this case, no email or username will be + /// associated with the PlayFab account. Otherwise, if no PlayFab account is linked to the Xbox Live account, an error + /// indicating this will be returned, so that the title can guide the user through creation of a PlayFab account. + /// + [Serializable] + public class LoginWithXboxRequest : PlayFabRequestCommon + { + /// + /// Automatically create a PlayFab account if one is not currently linked to this ID. + /// + public bool? CreateAccount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Flags for which pieces of info to return for the user. + /// + public GetPlayerCombinedInfoRequestParams InfoRequestParameters; + /// + /// Token provided by the Xbox Live SDK/XDK method GetTokenAndSignatureAsync("POST", "https://playfabapi.com/", ""). + /// + public string XboxToken; + } + + [Serializable] + public class LogStatement : PlayFabBaseModel + { + /// + /// Optional object accompanying the message as contextual information + /// + public object Data; + /// + /// 'Debug', 'Info', or 'Error' + /// + public string Level; + public string Message; + } + + [Serializable] + public class MembershipModel : PlayFabBaseModel + { + /// + /// Whether this membership is active. That is, whether the MembershipExpiration time has been reached. + /// + public bool IsActive; + /// + /// The time this membership expires + /// + public DateTime MembershipExpiration; + /// + /// The id of the membership + /// + public string MembershipId; + /// + /// Membership expirations can be explicitly overridden (via game manager or the admin api). If this membership has been + /// overridden, this will be the new expiration time. + /// + public DateTime? OverrideExpiration; + /// + /// The list of subscriptions that this player has for this membership + /// + public List Subscriptions; + } + + [Serializable] + public class ModifyCharacterVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// This function can both add and remove uses of an inventory item. If the number of uses drops below zero, the item will + /// be removed from active inventory. + /// + [Serializable] + public class ModifyItemUsesRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique instance identifier of the item to be modified. + /// + public string ItemInstanceId; + /// + /// PlayFab unique identifier of the user whose item is being modified. + /// + public string PlayFabId; + /// + /// Number of uses to add to the item. Can be negative to remove uses. + /// + public int UsesToAdd; + } + + [Serializable] + public class ModifyItemUsesResult : PlayFabResultCommon + { + /// + /// Unique instance identifier of the item with uses consumed. + /// + public string ItemInstanceId; + /// + /// Number of uses remaining on the item. + /// + public int RemainingUses; + } + + [Serializable] + public class ModifyUserVirtualCurrencyResult : PlayFabResultCommon + { + /// + /// Balance of the virtual currency after modification. + /// + public int Balance; + /// + /// Amount added or subtracted from the user's virtual currency. Maximum VC balance is Int32 (2,147,483,647). Any increase + /// over this value will be discarded. + /// + public int BalanceChange; + /// + /// User currency was subtracted from. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which was modified. + /// + public string VirtualCurrency; + } + + /// + /// Transfers an item from a character to another character that is owned by the same user. This will remove the item from + /// the character's inventory (until and unless it is moved back), and will enable the other character to make use of the + /// item instead. + /// + [Serializable] + public class MoveItemToCharacterFromCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the character that currently has the item. + /// + public string GivingCharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique identifier of the character that will be receiving the item. + /// + public string ReceivingCharacterId; + } + + [Serializable] + public class MoveItemToCharacterFromCharacterResult : PlayFabResultCommon + { + } + + /// + /// Transfers an item from a user to a character she owns. This will remove the item from the user's inventory (until and + /// unless it is moved back), and will enable the character to make use of the item instead. + /// + [Serializable] + public class MoveItemToCharacterFromUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class MoveItemToCharacterFromUserResult : PlayFabResultCommon + { + } + + /// + /// Transfers an item from a character to the owning user. This will remove the item from the character's inventory (until + /// and unless it is moved back), and will enable the user to make use of the item instead. + /// + [Serializable] + public class MoveItemToUserFromCharacterRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class MoveItemToUserFromCharacterResult : PlayFabResultCommon + { + } + + [Serializable] + public class NintendoServiceAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Service Account identifier for a user. + /// + public string NintendoServiceAccountId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Service Account + /// identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class NintendoSwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique Nintendo Switch Device identifier for a user. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Nintendo Switch Device identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class NotifyMatchmakerPlayerLeftRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the Game Instance the user is leaving. + /// + public string LobbyId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class NotifyMatchmakerPlayerLeftResult : PlayFabResultCommon + { + /// + /// State of user leaving the Game Server Instance. + /// + public PlayerConnectionState? PlayerState; + } + + public enum PlayerConnectionState + { + Unassigned, + Connecting, + Participating, + Participated + } + + [Serializable] + public class PlayerLeaderboardEntry : PlayFabBaseModel + { + /// + /// Title-specific display name of the user for this leaderboard entry. + /// + public string DisplayName; + /// + /// PlayFab unique identifier of the user for this leaderboard entry. + /// + public string PlayFabId; + /// + /// User's overall position in the leaderboard. + /// + public int Position; + /// + /// The profile of the user, if requested. + /// + public PlayerProfileModel Profile; + /// + /// Specific value of the user's statistic. + /// + public int StatValue; + } + + [Serializable] + public class PlayerLinkedAccount : PlayFabBaseModel + { + /// + /// Linked account's email + /// + public string Email; + /// + /// Authentication platform + /// + public LoginIdentityProvider? Platform; + /// + /// Platform user identifier + /// + public string PlatformUserId; + /// + /// Linked account's username + /// + public string Username; + } + + [Serializable] + public class PlayerLocation : PlayFabBaseModel + { + /// + /// City of the player's geographic location. + /// + public string City; + /// + /// The two-character continent code for this location + /// + public ContinentCode ContinentCode; + /// + /// The two-character ISO 3166-1 country code for the country associated with the location + /// + public CountryCode CountryCode; + /// + /// Latitude coordinate of the player's geographic location. + /// + public double? Latitude; + /// + /// Longitude coordinate of the player's geographic location. + /// + public double? Longitude; + } + + [Serializable] + public class PlayerProfile : PlayFabBaseModel + { + /// + /// Array of ad campaigns player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// Image URL of the player's avatar. + /// + public string AvatarUrl; + /// + /// Banned until UTC Date. If permanent ban this is set for 20 years after the original ban date. + /// + public DateTime? BannedUntil; + /// + /// The prediction of the player to churn within the next seven days. + /// + public ChurnRiskLevel? ChurnPrediction; + /// + /// Array of contact email addresses associated with the player + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player Display Name + /// + public string DisplayName; + /// + /// Last login + /// + public DateTime? LastLogin; + /// + /// Array of third party accounts linked to this player + /// + public List LinkedAccounts; + /// + /// Dictionary of player's locations by type. + /// + public Dictionary Locations; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// List of player variants for experimentation + /// + public List PlayerExperimentVariants; + /// + /// PlayFab Player ID + /// + public string PlayerId; + /// + /// Array of player statistics + /// + public List PlayerStatistics; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// Array of configured push notification end points + /// + public List PushNotificationRegistrations; + /// + /// Dictionary of player's statistics using only the latest version's value + /// + public Dictionary Statistics; + /// + /// List of player's tags for segmentation. + /// + public List Tags; + /// + /// Title ID this profile applies to + /// + public string TitleId; + /// + /// A sum of player's total purchases in USD across all currencies. + /// + public uint? TotalValueToDateInUSD; + /// + /// Dictionary of player's total purchases by currency. + /// + public Dictionary ValuesToDate; + /// + /// Dictionary of player's virtual currency balances + /// + public Dictionary VirtualCurrencyBalances; + } + + [Serializable] + public class PlayerProfileModel : PlayFabBaseModel + { + /// + /// List of advertising campaigns the player has been attributed to + /// + public List AdCampaignAttributions; + /// + /// URL of the player's avatar image + /// + public string AvatarUrl; + /// + /// If the player is currently banned, the UTC Date when the ban expires + /// + public DateTime? BannedUntil; + /// + /// List of all contact email info associated with the player account + /// + public List ContactEmailAddresses; + /// + /// Player record created + /// + public DateTime? Created; + /// + /// Player display name + /// + public string DisplayName; + /// + /// List of experiment variants for the player. Note that these variants are not guaranteed to be up-to-date when returned + /// during login because the player profile is updated only after login. Instead, use the LoginResult.TreatmentAssignment + /// property during login to get the correct variants and variables. + /// + public List ExperimentVariants; + /// + /// UTC time when the player most recently logged in to the title + /// + public DateTime? LastLogin; + /// + /// List of all authentication systems linked to this player account + /// + public List LinkedAccounts; + /// + /// List of geographic locations from which the player has logged in to the title + /// + public List Locations; + /// + /// List of memberships for the player, along with whether are expired. + /// + public List Memberships; + /// + /// Player account origination + /// + public LoginIdentityProvider? Origination; + /// + /// PlayFab player account unique identifier + /// + public string PlayerId; + /// + /// Publisher this player belongs to + /// + public string PublisherId; + /// + /// List of configured end points registered for sending the player push notifications + /// + public List PushNotificationRegistrations; + /// + /// List of leaderboard statistic values for the player + /// + public List Statistics; + /// + /// List of player's tags for segmentation + /// + public List Tags; + /// + /// Title ID this player profile applies to + /// + public string TitleId; + /// + /// Sum of the player's purchases made with real-money currencies, converted to US dollars equivalent and represented as a + /// whole number of cents (1/100 USD). For example, 999 indicates nine dollars and ninety-nine cents. + /// + public uint? TotalValueToDateInUSD; + /// + /// List of the player's lifetime purchase totals, summed by real-money currency + /// + public List ValuesToDate; + } + + [Serializable] + public class PlayerProfileViewConstraints : PlayFabBaseModel + { + /// + /// Whether to show player's avatar URL. Defaults to false + /// + public bool ShowAvatarUrl; + /// + /// Whether to show the banned until time. Defaults to false + /// + public bool ShowBannedUntil; + /// + /// Whether to show campaign attributions. Defaults to false + /// + public bool ShowCampaignAttributions; + /// + /// Whether to show contact email addresses. Defaults to false + /// + public bool ShowContactEmailAddresses; + /// + /// Whether to show the created date. Defaults to false + /// + public bool ShowCreated; + /// + /// Whether to show the display name. Defaults to false + /// + public bool ShowDisplayName; + /// + /// Whether to show player's experiment variants. Defaults to false + /// + public bool ShowExperimentVariants; + /// + /// Whether to show the last login time. Defaults to false + /// + public bool ShowLastLogin; + /// + /// Whether to show the linked accounts. Defaults to false + /// + public bool ShowLinkedAccounts; + /// + /// Whether to show player's locations. Defaults to false + /// + public bool ShowLocations; + /// + /// Whether to show player's membership information. Defaults to false + /// + public bool ShowMemberships; + /// + /// Whether to show origination. Defaults to false + /// + public bool ShowOrigination; + /// + /// Whether to show push notification registrations. Defaults to false + /// + public bool ShowPushNotificationRegistrations; + /// + /// Reserved for future development + /// + public bool ShowStatistics; + /// + /// Whether to show tags. Defaults to false + /// + public bool ShowTags; + /// + /// Whether to show the total value to date in usd. Defaults to false + /// + public bool ShowTotalValueToDateInUsd; + /// + /// Whether to show the values to date. Defaults to false + /// + public bool ShowValuesToDate; + } + + [Serializable] + public class PlayerStatistic : PlayFabBaseModel + { + /// + /// Statistic ID + /// + public string Id; + /// + /// Statistic name + /// + public string Name; + /// + /// Current statistic value + /// + public int StatisticValue; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int StatisticVersion; + } + + [Serializable] + public class PlayerStatisticVersion : PlayFabBaseModel + { + /// + /// time when the statistic version became active + /// + public DateTime ActivationTime; + /// + /// time when the statistic version became inactive due to statistic version incrementing + /// + public DateTime? DeactivationTime; + /// + /// time at which the statistic version was scheduled to become active, based on the configured ResetInterval + /// + public DateTime? ScheduledActivationTime; + /// + /// time at which the statistic version was scheduled to become inactive, based on the configured ResetInterval + /// + public DateTime? ScheduledDeactivationTime; + /// + /// name of the statistic when the version became active + /// + public string StatisticName; + /// + /// version of the statistic + /// + public uint Version; + } + + [Serializable] + public class PSNAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the PlayStation :tm: Network + /// identifier. + /// + public string PlayFabId; + /// + /// Unique PlayStation :tm: Network identifier for a user. + /// + public string PSNAccountId; + } + + [Serializable] + public class PushNotificationPackage : PlayFabBaseModel + { + /// + /// Numerical badge to display on App icon (iOS only) + /// + public int Badge; + /// + /// This must be a JSON formatted object. For use with developer-created custom Push Notification plugins + /// + public string CustomData; + /// + /// Icon file to display with the message (Not supported for iOS) + /// + public string Icon; + /// + /// Content of the message (all platforms) + /// + public string Message; + /// + /// Sound file to play with the message (all platforms) + /// + public string Sound; + /// + /// Title/Subject of the message. Not supported for iOS + /// + public string Title; + } + + public enum PushNotificationPlatform + { + ApplePushNotificationService, + GoogleCloudMessaging + } + + [Serializable] + public class PushNotificationRegistration : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class PushNotificationRegistrationModel : PlayFabBaseModel + { + /// + /// Notification configured endpoint + /// + public string NotificationEndpointARN; + /// + /// Push notification platform + /// + public PushNotificationPlatform? Platform; + } + + [Serializable] + public class RandomResultTableListing : PlayFabBaseModel + { + /// + /// Catalog version this table is associated with + /// + public string CatalogVersion; + /// + /// Child nodes that indicate what kind of drop table item this actually is. + /// + public List Nodes; + /// + /// Unique name for this drop table + /// + public string TableId; + } + + /// + /// Coupon codes can be created for any item, or set of items, in the catalog for the title. This operation causes the + /// coupon to be consumed, and the specific items to be awarded to the user. Attempting to re-use an already consumed code, + /// or a code which has not yet been created in the service, will result in an error. + /// + [Serializable] + public class RedeemCouponRequest : PlayFabRequestCommon + { + /// + /// Catalog version of the coupon. + /// + public string CatalogVersion; + /// + /// Optional identifier for the Character that should receive the item. If null, item is added to the player + /// + public string CharacterId; + /// + /// Generated coupon code to redeem. + /// + public string CouponCode; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RedeemCouponResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of redeeming the coupon. + /// + public List GrantedItems; + } + + /// + /// This function is used by a Game Server Instance to validate with the PlayFab service that a user has been registered as + /// connected to the server. The Ticket is provided to the client either as a result of a call to StartGame or Matchmake, + /// each of which return a Ticket specific to the Game Server Instance. This function will fail in any case where the Ticket + /// presented is not valid for the specific Game Server Instance making the call. Note that data returned may be Personally + /// Identifying Information (PII), such as email address, and so care should be taken in how this data is stored and + /// managed. Since this call will always return the relevant information for users who have accessed the title, the + /// recommendation is to not store this data locally. + /// + [Serializable] + public class RedeemMatchmakerTicketRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique identifier of the Game Server Instance that is asking for validation of the authorization ticket. + /// + public string LobbyId; + /// + /// Server authorization ticket passed back from a call to Matchmake or StartGame. + /// + public string Ticket; + } + + [Serializable] + public class RedeemMatchmakerTicketResult : PlayFabResultCommon + { + /// + /// Error value if the ticket was not validated. + /// + public string Error; + /// + /// Boolean indicating whether the ticket was validated by the PlayFab service. + /// + public bool TicketIsValid; + /// + /// User account information for the user validated. + /// + public UserAccountInfo UserInfo; + } + + [Serializable] + public class RefreshGameServerInstanceHeartbeatRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the Game Server Instance for which the heartbeat is updated. + /// + public string LobbyId; + } + + [Serializable] + public class RefreshGameServerInstanceHeartbeatResult : PlayFabResultCommon + { + } + + public enum Region + { + USCentral, + USEast, + EUWest, + Singapore, + Japan, + Brazil, + Australia + } + + [Serializable] + public class RegisterGameRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the build running on the Game Server Instance. + /// + public string Build; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Game Mode the Game Server instance is running. Note that this must be defined in the Game Modes tab in the PlayFab Game + /// Manager, along with the Build ID (the same Game Mode can be defined for multiple Build IDs). + /// + public string GameMode; + /// + /// Previous lobby id if re-registering an existing game. + /// + public string LobbyId; + /// + /// Region in which the Game Server Instance is running. For matchmaking using non-AWS region names, set this to any AWS + /// region and use Tags (below) to specify your custom region. + /// + public Region Region; + /// + /// IPV4 address of the game server instance. + /// + public string ServerIPV4Address; + /// + /// IPV6 address (if any) of the game server instance. + /// + public string ServerIPV6Address; + /// + /// Port number for communication with the Game Server Instance. + /// + public string ServerPort; + /// + /// Public DNS name (if any) of the server + /// + public string ServerPublicDNSName; + /// + /// Tags for the Game Server Instance + /// + public Dictionary Tags; + } + + [Serializable] + public class RegisterGameResponse : PlayFabResultCommon + { + /// + /// Unique identifier generated for the Game Server Instance that is registered. If LobbyId is specified in request and the + /// game still exists in PlayFab, the LobbyId in request is returned. Otherwise a new lobby id will be returned. + /// + public string LobbyId; + } + + [Serializable] + public class RemoveFriendRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account which is to be removed. + /// + public string FriendPlayFabId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RemoveGenericIDRequest : PlayFabRequestCommon + { + /// + /// Generic service identifier to be removed from the player. + /// + public GenericServiceId GenericId; + /// + /// PlayFabId of the user to remove. + /// + public string PlayFabId; + } + + /// + /// This API will trigger a player_tag_removed event and remove a tag with the given TagName and PlayFabID from the + /// corresponding player profile. TagName can be used for segmentation and it is limited to 256 characters + /// + [Serializable] + public class RemovePlayerTagRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Unique tag for player profile. + /// + public string TagName; + } + + [Serializable] + public class RemovePlayerTagResult : PlayFabResultCommon + { + } + + [Serializable] + public class RemoveSharedGroupMembersRequest : PlayFabRequestCommon + { + /// + /// An array of unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public List PlayFabIds; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class RemoveSharedGroupMembersResult : PlayFabResultCommon + { + } + + [Serializable] + public class ReportPlayerServerRequest : PlayFabRequestCommon + { + /// + /// Optional additional comment by reporting player. + /// + public string Comment; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier of the reported player. + /// + public string ReporteeId; + /// + /// PlayFabId of the reporting player. + /// + public string ReporterId; + } + + /// + /// Players are currently limited to five reports per day. Attempts by a single user account to submit reports beyond five + /// will result in Updated being returned as false. + /// + [Serializable] + public class ReportPlayerServerResult : PlayFabResultCommon + { + /// + /// The number of remaining reports which may be filed today by this reporting player. + /// + public int SubmissionsRemaining; + } + + [Serializable] + public class ResultTableNode : PlayFabBaseModel + { + /// + /// Either an ItemId, or the TableId of another random result table + /// + public string ResultItem; + /// + /// Whether this entry in the table is an item or a link to another table + /// + public ResultTableNodeType ResultItemType; + /// + /// How likely this is to be rolled - larger numbers add more weight + /// + public int Weight; + } + + public enum ResultTableNodeType + { + ItemId, + TableId + } + + /// + /// Setting the active state of all non-expired bans for a user to Inactive. Expired bans with an Active state will be + /// ignored, however. Returns information about applied updates only. + /// + [Serializable] + public class RevokeAllBansForUserRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class RevokeAllBansForUserResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked. + /// + public List BanData; + } + + /// + /// Setting the active state of all bans requested to Inactive regardless of whether that ban has already expired. BanIds + /// that do not exist will be skipped. Returns information about applied updates only. + /// + [Serializable] + public class RevokeBansRequest : PlayFabRequestCommon + { + /// + /// Ids of the bans to be revoked. Maximum 100. + /// + public List BanIds; + } + + [Serializable] + public class RevokeBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were revoked + /// + public List BanData; + } + + [Serializable] + public class RevokeInventoryItem : PlayFabBaseModel + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// In cases where the inventory item in question is a "crate", and the items it contained have already been dispensed, this + /// will not revoke access or otherwise remove the items which were dispensed. + /// + [Serializable] + public class RevokeInventoryItemsRequest : PlayFabRequestCommon + { + /// + /// Array of player items to revoke, between 1 and 25 items. + /// + public List Items; + } + + [Serializable] + public class RevokeInventoryItemsResult : PlayFabResultCommon + { + /// + /// Collection of any errors that occurred during processing. + /// + public List Errors; + } + + [Serializable] + public class RevokeInventoryResult : PlayFabResultCommon + { + } + + [Serializable] + public class RevokeItemError : PlayFabBaseModel + { + /// + /// Specific error that was encountered. + /// + public GenericErrorCodes? Error; + /// + /// Item information that failed to be revoked. + /// + public RevokeInventoryItem Item; + } + + /// + /// Represents the save push notification template request. + /// + [Serializable] + public class SavePushNotificationTemplateRequest : PlayFabRequestCommon + { + /// + /// Android JSON for the notification template. + /// + public string AndroidPayload; + /// + /// Id of the push notification template. + /// + public string Id; + /// + /// IOS JSON for the notification template. + /// + public string IOSPayload; + /// + /// Dictionary of localized push notification templates with the language as the key. + /// + public Dictionary LocalizedPushNotificationTemplates; + /// + /// Name of the push notification template. + /// + public string Name; + } + + /// + /// Represents the save push notification template result. + /// + [Serializable] + public class SavePushNotificationTemplateResult : PlayFabResultCommon + { + /// + /// Id of the push notification template that was saved. + /// + public string PushNotificationTemplateId; + } + + [Serializable] + public class ScriptExecutionError : PlayFabBaseModel + { + /// + /// Error code, such as CloudScriptNotFound, JavascriptException, CloudScriptFunctionArgumentSizeExceeded, + /// CloudScriptAPIRequestCountExceeded, CloudScriptAPIRequestError, or CloudScriptHTTPRequestError + /// + public string Error; + /// + /// Details about the error + /// + public string Message; + /// + /// Point during the execution of the script at which the error occurred, if any + /// + public string StackTrace; + } + + /// + /// PlayFab accounts which have valid email address or username will be able to receive a password reset email using this + /// API.The email sent must be an account recovery email template. The username or email can be passed in to send the email + /// + [Serializable] + public class SendCustomAccountRecoveryEmailRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// User email address attached to their account + /// + public string Email; + /// + /// The email template id of the account recovery email template to send. + /// + public string EmailTemplateId; + /// + /// The user's username requesting an account recovery. + /// + public string Username; + } + + [Serializable] + public class SendCustomAccountRecoveryEmailResult : PlayFabResultCommon + { + } + + /// + /// Sends an email for only players that have contact emails associated with them. Takes in an email template ID + /// specifyingthe email template to send. + /// + [Serializable] + public class SendEmailFromTemplateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The email template id of the email template to send. + /// + public string EmailTemplateId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SendEmailFromTemplateResult : PlayFabResultCommon + { + } + + /// + /// Represents the request for sending a push notification template to a recipient. + /// + [Serializable] + public class SendPushNotificationFromTemplateRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Id of the push notification template. + /// + public string PushNotificationTemplateId; + /// + /// PlayFabId of the push notification recipient. + /// + public string Recipient; + } + + [Serializable] + public class SendPushNotificationRequest : PlayFabRequestCommon + { + /// + /// Allows you to provide precisely formatted json to target devices. This is an advanced feature, allowing you to deliver + /// to custom plugin logic, fields, or functionality not natively supported by PlayFab. + /// + public List AdvancedPlatformDelivery; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Text of message to send. + /// + public string Message; + /// + /// Defines all possible push attributes like message, title, icon, etc. Some parameters are device specific - please see + /// the PushNotificationPackage documentation for details. + /// + public PushNotificationPackage Package; + /// + /// PlayFabId of the recipient of the push notification. + /// + public string Recipient; + /// + /// Subject of message to send (may not be displayed in all platforms) + /// + public string Subject; + /// + /// Target Platforms that should receive the Message or Package. If omitted, we will send to all available platforms. + /// + public List TargetPlatforms; + } + + [Serializable] + public class SendPushNotificationResult : PlayFabResultCommon + { + } + + [Serializable] + public class ServerCustomIDPlayFabIDPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier. + /// + public string PlayFabId; + /// + /// Unique server custom identifier for this player. + /// + public string ServerCustomId; + } + + [Serializable] + public class ServerLoginResult : PlayFabResultCommon + { + /// + /// If LoginTitlePlayerAccountEntity flag is set on the login request the title_player_account will also be logged in and + /// returned. + /// + public EntityTokenResponse EntityToken; + /// + /// Results for requested info. + /// + public GetPlayerCombinedInfoResultPayload InfoResultPayload; + /// + /// The time of this user's previous login. If there was no previous login, then it's DateTime.MinValue + /// + public DateTime? LastLoginTime; + /// + /// True if the account was newly created on this login. + /// + public bool NewlyCreated; + /// + /// Player's unique PlayFabId. + /// + public string PlayFabId; + /// + /// Unique token authorizing the user and game at the server level, for the current session. + /// + public string SessionTicket; + /// + /// Settings specific to this user. + /// + public UserSettings SettingsForUser; + /// + /// The experimentation treatments for this user at the time of login. + /// + public TreatmentAssignment TreatmentAssignment; + } + + /// + /// This operation is not additive. It will completely replace the tag list for the specified user. Please note that only + /// users in the PlayFab friends list can be assigned tags. Attempting to set a tag on a friend only included in the friends + /// list from a social site integration (such as Facebook or Steam) will return the AccountNotFound error. + /// + [Serializable] + public class SetFriendTagsRequest : PlayFabRequestCommon + { + /// + /// PlayFab identifier of the friend account to which the tag(s) should be applied. + /// + public string FriendPlayFabId; + /// + /// PlayFab identifier of the player whose friend is to be updated. + /// + public string PlayFabId; + /// + /// Array of tags to set on the friend account. + /// + public List Tags; + } + + [Serializable] + public class SetGameServerInstanceDataRequest : PlayFabRequestCommon + { + /// + /// Custom data to set for the specified game server instance. + /// + public string GameServerData; + /// + /// Unique identifier of the Game Instance to be updated, in decimal format. + /// + public string LobbyId; + } + + [Serializable] + public class SetGameServerInstanceDataResult : PlayFabResultCommon + { + } + + [Serializable] + public class SetGameServerInstanceStateRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the Game Instance to be updated, in decimal format. + /// + public string LobbyId; + /// + /// State to set for the specified game server instance. + /// + public GameInstanceState State; + } + + [Serializable] + public class SetGameServerInstanceStateResult : PlayFabResultCommon + { + } + + [Serializable] + public class SetGameServerInstanceTagsRequest : PlayFabRequestCommon + { + /// + /// Unique identifier of the Game Server Instance to be updated. + /// + public string LobbyId; + /// + /// Tags to set for the specified Game Server Instance. Note that this is the complete list of tags to be associated with + /// the Game Server Instance. + /// + public Dictionary Tags; + } + + [Serializable] + public class SetGameServerInstanceTagsResult : PlayFabResultCommon + { + } + + /// + /// APIs that require signatures require that the player have a configured Player Secret Key that is used to sign all + /// requests. Players that don't have a secret will be blocked from making API calls until it is configured. To create a + /// signature header add a SHA256 hashed string containing UTF8 encoded JSON body as it will be sent to the server, the + /// current time in UTC formatted to ISO 8601, and the players secret formatted as 'body.date.secret'. Place the resulting + /// hash into the header X-PlayFab-Signature, along with a header X-PlayFab-Timestamp of the same UTC timestamp used in the + /// signature. + /// + [Serializable] + public class SetPlayerSecretRequest : PlayFabRequestCommon + { + /// + /// Player secret that is used to verify API request signatures (Enterprise Only). + /// + public string PlayerSecret; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class SetPlayerSecretResult : PlayFabResultCommon + { + } + + /// + /// This API is designed to store publisher-specific values which can be read, but not written to, by the client. This data + /// is shared across all titles assigned to a particular publisher, and can be used for cross-game coordination. Only titles + /// assigned to a publisher can use this API. This operation is additive. If a Key does not exist in the current dataset, it + /// will be added with the specified Value. If it already exists, the Value for that key will be overwritten with the new + /// Value. For more information email helloplayfab@microsoft.com + /// + [Serializable] + public class SetPublisherDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetPublisherDataResult : PlayFabResultCommon + { + } + + /// + /// This API is designed to store title specific values which can be read, but not written to, by the client. For example, a + /// developer could choose to store values which modify the user experience, such as enemy spawn rates, weapon strengths, + /// movement speeds, etc. This allows a developer to update the title without the need to create, test, and ship a new + /// build. This operation is additive. If a Key does not exist in the current dataset, it will be added with the specified + /// Value. If it already exists, the Value for that key will be overwritten with the new Value. + /// + [Serializable] + public class SetTitleDataRequest : PlayFabRequestCommon + { + /// + /// key we want to set a value on (note, this is additive - will only replace an existing key's value if they are the same + /// name.) Keys are trimmed of whitespace. Keys may not begin with the '!' character. + /// + public string Key; + /// + /// new value to set. Set to null to remove a value + /// + public string Value; + } + + [Serializable] + public class SetTitleDataResult : PlayFabResultCommon + { + } + + [Serializable] + public class SharedGroupDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// PlayFabId of the user to last update this value. + /// + public string LastUpdatedBy; + /// + /// Indicates whether this data can be read by all users (public) or only members of the group (private). + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified group data key. + /// + public string Value; + } + + public enum SourceType + { + Admin, + BackEnd, + GameClient, + GameServer, + Partner, + Custom, + API + } + + [Serializable] + public class StatisticModel : PlayFabBaseModel + { + /// + /// Statistic name + /// + public string Name; + /// + /// Statistic value + /// + public int Value; + /// + /// Statistic version (0 if not a versioned statistic) + /// + public int Version; + } + + [Serializable] + public class StatisticNameVersion : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// the version of the statistic to be returned + /// + public uint Version; + } + + [Serializable] + public class StatisticUpdate : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded. Null when + /// setting the statistic value for the first time. + /// + public uint? Version; + } + + [Serializable] + public class StatisticValue : PlayFabBaseModel + { + /// + /// unique name of the statistic + /// + public string StatisticName; + /// + /// statistic value for the player + /// + public int Value; + /// + /// for updates to an existing statistic value for a player, the version of the statistic when it was loaded + /// + public uint Version; + } + + [Serializable] + public class SteamPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Steam identifier. + /// + public string PlayFabId; + /// + /// Unique Steam identifier for a user. + /// + public string SteamStringId; + } + + /// + /// A store entry that list a catalog item at a particular price + /// + [Serializable] + public class StoreItem : PlayFabBaseModel + { + /// + /// Store specific custom data. The data only exists as part of this store; it is not transferred to item instances + /// + public object CustomData; + /// + /// Intended display position for this item. Note that 0 is the first position + /// + public uint? DisplayPosition; + /// + /// Unique identifier of the item as it exists in the catalog - note that this must exactly match the ItemId from the + /// catalog + /// + public string ItemId; + /// + /// Override prices for this item for specific currencies + /// + public Dictionary RealCurrencyPrices; + /// + /// Override prices for this item in virtual currencies and "RM" (the base Real Money purchase price, in USD pennies) + /// + public Dictionary VirtualCurrencyPrices; + } + + /// + /// Marketing data about a specific store + /// + [Serializable] + public class StoreMarketingModel : PlayFabBaseModel + { + /// + /// Tagline for a store. + /// + public string Description; + /// + /// Display name of a store as it will appear to users. + /// + public string DisplayName; + /// + /// Custom data about a store. + /// + public object Metadata; + } + + [Serializable] + public class SubscriptionModel : PlayFabBaseModel + { + /// + /// When this subscription expires. + /// + public DateTime Expiration; + /// + /// The time the subscription was orignially purchased + /// + public DateTime InitialSubscriptionTime; + /// + /// Whether this subscription is currently active. That is, if Expiration > now. + /// + public bool IsActive; + /// + /// The status of this subscription, according to the subscription provider. + /// + public SubscriptionProviderStatus? Status; + /// + /// The id for this subscription + /// + public string SubscriptionId; + /// + /// The item id for this subscription from the primary catalog + /// + public string SubscriptionItemId; + /// + /// The provider for this subscription. Apple or Google Play are supported today. + /// + public string SubscriptionProvider; + } + + public enum SubscriptionProviderStatus + { + NoError, + Cancelled, + UnknownError, + BillingError, + ProductUnavailable, + CustomerDidNotAcceptPriceChange, + FreeTrial, + PaymentPending + } + + [Serializable] + public class SubtractCharacterVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class SubtractUserVirtualCurrencyRequest : PlayFabRequestCommon + { + /// + /// Amount to be subtracted from the user balance of the specified virtual currency. + /// + public int Amount; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// PlayFab unique identifier of the user whose virtual currency balance is to be decreased. + /// + public string PlayFabId; + /// + /// Name of the virtual currency which is to be decremented. + /// + public string VirtualCurrency; + } + + [Serializable] + public class TagModel : PlayFabBaseModel + { + /// + /// Full value of the tag, including namespace + /// + public string TagValue; + } + + public enum TitleActivationStatus + { + None, + ActivatedTitleKey, + PendingSteam, + ActivatedSteam, + RevokedSteam + } + + [Serializable] + public class TitleNewsItem : PlayFabBaseModel + { + /// + /// News item body. + /// + public string Body; + /// + /// Unique identifier of news item. + /// + public string NewsId; + /// + /// Date and time when the news item was posted. + /// + public DateTime Timestamp; + /// + /// Title of the news item. + /// + public string Title; + } + + [Serializable] + public class TreatmentAssignment : PlayFabBaseModel + { + /// + /// List of the experiment variables. + /// + public List Variables; + /// + /// List of the experiment variants. + /// + public List Variants; + } + + [Serializable] + public class TwitchPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Twitch identifier. + /// + public string PlayFabId; + /// + /// Unique Twitch identifier for a user. + /// + public string TwitchId; + } + + [Serializable] + public class UnlinkNintendoServiceAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Nintendo Switch Device identifier for the user. If not specified, the most recently signed in device ID will be used. + /// + public string NintendoSwitchDeviceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkNintendoSwitchDeviceIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkPSNAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkPSNAccountResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkServerCustomIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier. + /// + public string PlayFabId; + /// + /// Unique server custom identifier for this player. + /// + public string ServerCustomId; + } + + [Serializable] + public class UnlinkServerCustomIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkSteamIdRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Steam account. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkSteamIdResult : PlayFabResultCommon + { + } + + [Serializable] + public class UnlinkXboxAccountRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + } + + [Serializable] + public class UnlinkXboxAccountResult : PlayFabResultCommon + { + } + + /// + /// Specify the container and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerInstanceRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses catalog + /// associated with the item instance. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// ItemInstanceId of the container to unlock. + /// + public string ContainerItemInstanceId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// ItemInstanceId of the key that will be consumed by unlocking this container. If the container requires a key, this + /// parameter is required. + /// + public string KeyItemInstanceId; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// Specify the type of container to open and optionally the catalogVersion for the container to open + /// + [Serializable] + public class UnlockContainerItemRequest : PlayFabRequestCommon + { + /// + /// Specifies the catalog version that should be used to determine container contents. If unspecified, uses default/primary + /// catalog. + /// + public string CatalogVersion; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Catalog ItemId of the container type to unlock. + /// + public string ContainerItemId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// The items and vc found within the container. These will be added and stacked in your inventory as appropriate. + /// + [Serializable] + public class UnlockContainerItemResult : PlayFabResultCommon + { + /// + /// Items granted to the player as a result of unlocking the container. + /// + public List GrantedItems; + /// + /// Unique instance identifier of the container unlocked. + /// + public string UnlockedItemInstanceId; + /// + /// Unique instance identifier of the key used to unlock the container, if applicable. + /// + public string UnlockedWithItemInstanceId; + /// + /// Virtual currency granted to the player as a result of unlocking the container. + /// + public Dictionary VirtualCurrency; + } + + [Serializable] + public class UpdateAvatarUrlRequest : PlayFabRequestCommon + { + /// + /// URL of the avatar image. If empty, it removes the existing avatar URL. + /// + public string ImageUrl; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// Represents a single update ban request. + /// + [Serializable] + public class UpdateBanRequest : PlayFabBaseModel + { + /// + /// The updated active state for the ban. Null for no change. + /// + public bool? Active; + /// + /// The id of the ban to be updated. + /// + public string BanId; + /// + /// The updated expiration date for the ban. Null for no change. + /// + public DateTime? Expires; + /// + /// The updated IP address for the ban. Null for no change. + /// + public string IPAddress; + /// + /// Whether to make this ban permanent. Set to true to make this ban permanent. This will not modify Active state. + /// + public bool? Permanent; + /// + /// The updated reason for the ban to be updated. Maximum 140 characters. Null for no change. + /// + public string Reason; + } + + /// + /// For each ban, only updates the values that are set. Leave any value to null for no change. If a ban could not be found, + /// the rest are still applied. Returns information about applied updates only. + /// + [Serializable] + public class UpdateBansRequest : PlayFabRequestCommon + { + /// + /// List of bans to be updated. Maximum 100. + /// + public List Bans; + } + + [Serializable] + public class UpdateBansResult : PlayFabResultCommon + { + /// + /// Information on the bans that were updated + /// + public List BanData; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateCharacterDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateCharacterDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// Character statistics are similar to user statistics in that they are numeric values which may only be updated by a + /// server operation, in order to minimize the opportunity for unauthorized changes. In addition to being available for use + /// by the title, the statistics are used for all leaderboard operations in PlayFab. + /// + [Serializable] + public class UpdateCharacterStatisticsRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// Statistics to be updated with the provided values. + /// + public Dictionary CharacterStatistics; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateCharacterStatisticsResult : PlayFabResultCommon + { + } + + /// + /// This operation is additive. Statistics not currently defined will be added, while those already defined will be updated + /// with the given values. All other user statistics will remain unchanged. + /// + [Serializable] + public class UpdatePlayerStatisticsRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Indicates whether the statistics provided should be set, regardless of the aggregation method set on the statistic. + /// Default is false. + /// + public bool? ForceUpdate; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// Statistics to be updated with the provided values + /// + public List Statistics; + } + + [Serializable] + public class UpdatePlayerStatisticsResult : PlayFabResultCommon + { + } + + /// + /// Note that in the case of multiple calls to write to the same shared group data keys, the last write received by the + /// PlayFab service will determine the value available to subsequent read operations. For scenarios requiring coordination + /// of data updates, it is recommended that titles make use of user data with read permission set to public, or a + /// combination of user data and shared group data. + /// + [Serializable] + public class UpdateSharedGroupDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys in this request. + /// + public UserDataPermission? Permission; + /// + /// Unique identifier for the shared group. + /// + public string SharedGroupId; + } + + [Serializable] + public class UpdateSharedGroupDataResult : PlayFabResultCommon + { + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, while keys + /// with null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Permission to be applied to all user data keys written in this request. Defaults to "private" if not set. + /// + public UserDataPermission? Permission; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UpdateUserDataResult : PlayFabResultCommon + { + /// + /// Indicates the current version of the data that has been set. This is incremented with every set call for that type of + /// data (read-only, internal, etc). This version can be provided in Get calls to find updated data. + /// + public uint DataVersion; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the user. In + /// updating the custom data object, keys which already exist in the object will have their values overwritten, keys with + /// null values will be removed. No other key-value pairs will be changed apart from those specified in the call. + /// + [Serializable] + public class UpdateUserInternalDataRequest : PlayFabRequestCommon + { + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + /// + /// This function performs an additive update of the arbitrary JSON object containing the custom data for the item instance + /// which belongs to the specified user. In updating the custom data object, keys which already exist in the object will + /// have their values overwritten, while keys with null values will be removed. No other key-value pairs will be changed + /// apart from those specified in the call. + /// + [Serializable] + public class UpdateUserInventoryItemDataRequest : PlayFabRequestCommon + { + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// Key-value pairs to be written to the custom data. Note that keys are trimmed of whitespace, are limited in size, and may + /// not begin with a '!' character or be null. + /// + public Dictionary Data; + /// + /// Unique PlayFab assigned instance identifier of the item + /// + public string ItemInstanceId; + /// + /// Optional list of Data-keys to remove from UserData. Some SDKs cannot insert null-values into Data due to language + /// constraints. Use this to delete the keys directly. + /// + public List KeysToRemove; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + } + + [Serializable] + public class UserAccountInfo : PlayFabBaseModel + { + /// + /// User Android device information, if an Android device has been linked + /// + public UserAndroidDeviceInfo AndroidDeviceInfo; + /// + /// Sign in with Apple account information, if an Apple account has been linked + /// + public UserAppleIdInfo AppleAccountInfo; + /// + /// Timestamp indicating when the user account was created + /// + public DateTime Created; + /// + /// Custom ID information, if a custom ID has been assigned + /// + public UserCustomIdInfo CustomIdInfo; + /// + /// User Facebook information, if a Facebook account has been linked + /// + public UserFacebookInfo FacebookInfo; + /// + /// Facebook Instant Games account information, if a Facebook Instant Games account has been linked + /// + public UserFacebookInstantGamesIdInfo FacebookInstantGamesIdInfo; + /// + /// User Gamecenter information, if a Gamecenter account has been linked + /// + public UserGameCenterInfo GameCenterInfo; + /// + /// User Google account information, if a Google account has been linked + /// + public UserGoogleInfo GoogleInfo; + /// + /// User Google Play Games account information, if a Google Play Games account has been linked + /// + public UserGooglePlayGamesInfo GooglePlayGamesInfo; + /// + /// User iOS device information, if an iOS device has been linked + /// + public UserIosDeviceInfo IosDeviceInfo; + /// + /// User Kongregate account information, if a Kongregate account has been linked + /// + public UserKongregateInfo KongregateInfo; + /// + /// Nintendo Switch account information, if a Nintendo Switch account has been linked + /// + public UserNintendoSwitchAccountIdInfo NintendoSwitchAccountInfo; + /// + /// Nintendo Switch device information, if a Nintendo Switch device has been linked + /// + public UserNintendoSwitchDeviceIdInfo NintendoSwitchDeviceIdInfo; + /// + /// OpenID Connect information, if any OpenID Connect accounts have been linked + /// + public List OpenIdInfo; + /// + /// Unique identifier for the user account + /// + public string PlayFabId; + /// + /// Personal information for the user which is considered more sensitive + /// + public UserPrivateAccountInfo PrivateInfo; + /// + /// User PlayStation :tm: Network account information, if a PlayStation :tm: Network account has been linked + /// + public UserPsnInfo PsnInfo; + /// + /// User Steam information, if a Steam account has been linked + /// + public UserSteamInfo SteamInfo; + /// + /// Title-specific information for the user account + /// + public UserTitleInfo TitleInfo; + /// + /// User Twitch account information, if a Twitch account has been linked + /// + public UserTwitchInfo TwitchInfo; + /// + /// User account name in the PlayFab service + /// + public string Username; + /// + /// User XBox account information, if a XBox account has been linked + /// + public UserXboxInfo XboxInfo; + } + + [Serializable] + public class UserAndroidDeviceInfo : PlayFabBaseModel + { + /// + /// Android device ID + /// + public string AndroidDeviceId; + } + + [Serializable] + public class UserAppleIdInfo : PlayFabBaseModel + { + /// + /// Apple subject ID + /// + public string AppleSubjectId; + } + + [Serializable] + public class UserCustomIdInfo : PlayFabBaseModel + { + /// + /// Custom ID + /// + public string CustomId; + } + + /// + /// Indicates whether a given data key is private (readable only by the player) or public (readable by all players). When a + /// player makes a GetUserData request about another player, only keys marked Public will be returned. + /// + public enum UserDataPermission + { + Private, + Public + } + + [Serializable] + public class UserDataRecord : PlayFabBaseModel + { + /// + /// Timestamp for when this data was last updated. + /// + public DateTime LastUpdated; + /// + /// Indicates whether this data can be read by all users (public) or only the user (private). This is used for GetUserData + /// requests being made by one player about another player. + /// + public UserDataPermission? Permission; + /// + /// Data stored for the specified user data key. + /// + public string Value; + } + + [Serializable] + public class UserFacebookInfo : PlayFabBaseModel + { + /// + /// Facebook identifier + /// + public string FacebookId; + /// + /// Facebook full name + /// + public string FullName; + } + + [Serializable] + public class UserFacebookInstantGamesIdInfo : PlayFabBaseModel + { + /// + /// Facebook Instant Games ID + /// + public string FacebookInstantGamesId; + } + + [Serializable] + public class UserGameCenterInfo : PlayFabBaseModel + { + /// + /// Gamecenter identifier + /// + public string GameCenterId; + } + + [Serializable] + public class UserGoogleInfo : PlayFabBaseModel + { + /// + /// Email address of the Google account + /// + public string GoogleEmail; + /// + /// Gender information of the Google account + /// + public string GoogleGender; + /// + /// Google ID + /// + public string GoogleId; + /// + /// Locale of the Google account + /// + public string GoogleLocale; + /// + /// Name of the Google account user + /// + public string GoogleName; + } + + [Serializable] + public class UserGooglePlayGamesInfo : PlayFabBaseModel + { + /// + /// Avatar image url of the Google Play Games player + /// + public string GooglePlayGamesPlayerAvatarImageUrl; + /// + /// Display name of the Google Play Games player + /// + public string GooglePlayGamesPlayerDisplayName; + /// + /// Google Play Games player ID + /// + public string GooglePlayGamesPlayerId; + } + + [Serializable] + public class UserIosDeviceInfo : PlayFabBaseModel + { + /// + /// iOS device ID + /// + public string IosDeviceId; + } + + [Serializable] + public class UserKongregateInfo : PlayFabBaseModel + { + /// + /// Kongregate ID + /// + public string KongregateId; + /// + /// Kongregate Username + /// + public string KongregateName; + } + + [Serializable] + public class UserNintendoSwitchAccountIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch account subject ID + /// + public string NintendoSwitchAccountSubjectId; + } + + [Serializable] + public class UserNintendoSwitchDeviceIdInfo : PlayFabBaseModel + { + /// + /// Nintendo Switch Device ID + /// + public string NintendoSwitchDeviceId; + } + + [Serializable] + public class UserOpenIdInfo : PlayFabBaseModel + { + /// + /// OpenID Connection ID + /// + public string ConnectionId; + /// + /// OpenID Issuer + /// + public string Issuer; + /// + /// OpenID Subject + /// + public string Subject; + } + + public enum UserOrigination + { + Organic, + Steam, + Google, + Amazon, + Facebook, + Kongregate, + GamersFirst, + Unknown, + IOS, + LoadTest, + Android, + PSN, + GameCenter, + CustomId, + XboxLive, + Parse, + Twitch, + ServerCustomId, + NintendoSwitchDeviceId, + FacebookInstantGamesId, + OpenIdConnect, + Apple, + NintendoSwitchAccount, + GooglePlayGames + } + + [Serializable] + public class UserPrivateAccountInfo : PlayFabBaseModel + { + /// + /// user email address + /// + public string Email; + } + + [Serializable] + public class UserPsnInfo : PlayFabBaseModel + { + /// + /// PlayStation :tm: Network account ID + /// + public string PsnAccountId; + /// + /// PlayStation :tm: Network online ID + /// + public string PsnOnlineId; + } + + [Serializable] + public class UserSettings : PlayFabBaseModel + { + /// + /// Boolean for whether this player is eligible for gathering device info. + /// + public bool GatherDeviceInfo; + /// + /// Boolean for whether this player should report OnFocus play-time tracking. + /// + public bool GatherFocusInfo; + /// + /// Boolean for whether this player is eligible for ad tracking. + /// + public bool NeedsAttribution; + } + + [Serializable] + public class UserSteamInfo : PlayFabBaseModel + { + /// + /// what stage of game ownership the user is listed as being in, from Steam + /// + public TitleActivationStatus? SteamActivationStatus; + /// + /// the country in which the player resides, from Steam data + /// + public string SteamCountry; + /// + /// currency type set in the user Steam account + /// + public Currency? SteamCurrency; + /// + /// Steam identifier + /// + public string SteamId; + /// + /// Steam display name + /// + public string SteamName; + } + + [Serializable] + public class UserTitleInfo : PlayFabBaseModel + { + /// + /// URL to the player's avatar. + /// + public string AvatarUrl; + /// + /// timestamp indicating when the user was first associated with this game (this can differ significantly from when the user + /// first registered with PlayFab) + /// + public DateTime Created; + /// + /// name of the user, as it is displayed in-game + /// + public string DisplayName; + /// + /// timestamp indicating when the user first signed into this game (this can differ from the Created timestamp, as other + /// events, such as issuing a beta key to the user, can associate the title to the user) + /// + public DateTime? FirstLogin; + /// + /// boolean indicating whether or not the user is currently banned for a title + /// + public bool? isBanned; + /// + /// timestamp for the last user login for this title + /// + public DateTime? LastLogin; + /// + /// source by which the user first joined the game, if known + /// + public UserOrigination? Origination; + /// + /// Title player account entity for this user + /// + public EntityKey TitlePlayerAccount; + } + + [Serializable] + public class UserTwitchInfo : PlayFabBaseModel + { + /// + /// Twitch ID + /// + public string TwitchId; + /// + /// Twitch Username + /// + public string TwitchUserName; + } + + [Serializable] + public class UserXboxInfo : PlayFabBaseModel + { + /// + /// XBox user ID + /// + public string XboxUserId; + /// + /// XBox user sandbox + /// + public string XboxUserSandbox; + } + + [Serializable] + public class ValueToDateModel : PlayFabBaseModel + { + /// + /// ISO 4217 code of the currency used in the purchases + /// + public string Currency; + /// + /// Total value of the purchases in a whole number of 1/100 monetary units. For example, 999 indicates nine dollars and + /// ninety-nine cents when Currency is 'USD') + /// + public uint TotalValue; + /// + /// Total value of the purchases in a string representation of decimal monetary units. For example, '9.99' indicates nine + /// dollars and ninety-nine cents when Currency is 'USD'. + /// + public string TotalValueAsDecimal; + } + + [Serializable] + public class Variable : PlayFabBaseModel + { + /// + /// Name of the variable. + /// + public string Name; + /// + /// Value of the variable. + /// + public string Value; + } + + [Serializable] + public class VirtualCurrencyRechargeTime : PlayFabBaseModel + { + /// + /// Maximum value to which the regenerating currency will automatically increment. Note that it can exceed this value + /// through use of the AddUserVirtualCurrency API call. However, it will not regenerate automatically until it has fallen + /// below this value. + /// + public int RechargeMax; + /// + /// Server timestamp in UTC indicating the next time the virtual currency will be incremented. + /// + public DateTime RechargeTime; + /// + /// Time remaining (in seconds) before the next recharge increment of the virtual currency. + /// + public int SecondsToRecharge; + } + + [Serializable] + public class WriteEventResponse : PlayFabResultCommon + { + /// + /// The unique identifier of the event. The values of this identifier consist of ASCII characters and are not constrained to + /// any particular format. + /// + public string EventId; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any character-based event. The created event will be locked to the + /// authenticated title. + /// + [Serializable] + public class WriteServerCharacterEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// Unique PlayFab assigned ID for a specific character owned by a user + /// + public string CharacterId; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any player-based event. The created event will be locked to the + /// authenticated title. + /// + [Serializable] + public class WriteServerPlayerEventRequest : PlayFabRequestCommon + { + /// + /// Custom data properties associated with the event. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// Unique PlayFab assigned ID of the user on whom the operation will be performed. + /// + public string PlayFabId; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + /// + /// This API is designed to write a multitude of different event types into PlayStream. It supports a flexible JSON schema, + /// which allowsfor arbitrary key-value pairs to describe any title-based event. The created event will be locked to the + /// authenticated title. + /// + [Serializable] + public class WriteTitleEventRequest : PlayFabRequestCommon + { + /// + /// Custom event properties. Each property consists of a name (string) and a value (JSON object). + /// + public Dictionary Body; + /// + /// The optional custom tags associated with the request (e.g. build number, external trace identifiers, etc.). + /// + public Dictionary CustomTags; + /// + /// The name of the event, within the namespace scoped to the title. The naming convention is up to the caller, but it + /// commonly follows the subject_verb_object pattern (e.g. player_logged_in). + /// + public string EventName; + /// + /// The time (in UTC) associated with this event. The value defaults to the current time. + /// + public DateTime? Timestamp; + } + + [Serializable] + public class XboxLiveAccountPlayFabIdPair : PlayFabBaseModel + { + /// + /// Unique PlayFab identifier for a user, or null if no PlayFab account is linked to the Xbox Live identifier. + /// + public string PlayFabId; + /// + /// Unique Xbox Live identifier for a user. + /// + public string XboxLiveAccountId; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta new file mode 100644 index 00000000..cafb56b4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Server/PlayFabServerModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 85069115b99da8c4688d838452001d89 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared.meta new file mode 100644 index 00000000..f48d4b6a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7f23e4a650becd44fa8fccf00ba8529b +folderAsset: yes +timeCreated: 1468524875 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor.meta new file mode 100644 index 00000000..4bfc2ceb --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 8d731e8907f844532878b81596fe3852 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs new file mode 100644 index 00000000..75c12db2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs @@ -0,0 +1,21 @@ +#if UNITY_2017_1_OR_NEWER +using PlayFab.PfEditor; +using UnityEditor; +using UnityEngine; + +public class MakeScriptableObject +{ + [MenuItem("PlayFab/MakePlayFabSharedSettings")] + public static void MakePlayFabSharedSettings() + { + PlayFabSharedSettings asset = ScriptableObject.CreateInstance(); + + AssetDatabase.CreateAsset(asset, "Assets/PlayFabSdk/Shared/Public/Resources/PlayFabSharedSettings.asset"); // TODO: Path should not be hard coded + AssetDatabase.SaveAssets(); + + EditorUtility.FocusProjectWindow(); + + Selection.activeObject = asset; + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta new file mode 100644 index 00000000..1d5091f5 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/MakeSharedSettingsObj.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3e92542860dab28489c3d9cc0baa1ebd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs new file mode 100644 index 00000000..6cf2e91f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs @@ -0,0 +1,38 @@ +using UnityEditor; +using UnityEngine; + +namespace PlayFab.PfEditor +{ + public static class PlayFabHelp + { + [MenuItem("PlayFab/GettingStarted")] + private static void GettingStarted() + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/index#pivot=documentation&panel=quickstarts"); + } + + [MenuItem("PlayFab/Docs")] + private static void Documentation() + { + Application.OpenURL("https://docs.microsoft.com/en-us/gaming/playfab/api-references/"); + } + + [MenuItem("PlayFab/Dashboard")] + private static void Dashboard() + { + Application.OpenURL("https://developer.playfab.com/"); + } + + [MenuItem("PlayFab/Forum")] + private static void Forum() + { + Application.OpenURL("https://community.playfab.com/index.html"); + } + + [MenuItem("PlayFab/Provide Feedback")] + private static void Feedback() + { + Application.OpenURL("https://playfab.com/contact/"); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta new file mode 100644 index 00000000..b9a59d8f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabHelp.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e51e733dabbc847fa839b19c01bc577c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef new file mode 100644 index 00000000..216c53f7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef @@ -0,0 +1,16 @@ +{ + "name": "PlayFabSDKEditor", + "references": [ + "PlayFab" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [] +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef.meta new file mode 100644 index 00000000..4778f447 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFabSdkEditor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8aa8a8085039f0e4ba1c8d6480d45262 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png new file mode 100644 index 0000000000000000000000000000000000000000..8c8e7f16ea960c19c8751b65ea9f05eb612209eb GIT binary patch literal 3521 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 literal 0 HcmV?d00001 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png.meta new file mode 100644 index 00000000..f490561c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Editor/PlayFablogo.png.meta @@ -0,0 +1,91 @@ +fileFormatVersion: 2 +guid: ec8f5065b10fb4f04bebf82a992c442e +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 10 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 1024 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 16 + mipBias: -100 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal.meta new file mode 100644 index 00000000..3590aa8a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 91910e31dc88043ea918915ee9d665d9 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs new file mode 100644 index 00000000..83f1ba6c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs @@ -0,0 +1,108 @@ +using System; +using System.Globalization; +using PlayFab.Internal; + +namespace PlayFab.Json +{ + public class SimpleJsonInstance : ISerializerPlugin + { + /// + /// Most users shouldn't access this + /// JsonWrapper.Serialize, and JsonWrapper.Deserialize will always use it automatically (Unless you deliberately mess with them) + /// Any Serialization of an object in the PlayFab namespace should just use JsonWrapper + /// + public static PlayFabSimpleJsonCuztomization ApiSerializerStrategy = new PlayFabSimpleJsonCuztomization(); + public class PlayFabSimpleJsonCuztomization : PocoJsonSerializerStrategy + { + /// + /// Convert the json value into the destination field/property + /// + public override object DeserializeObject(object value, Type type) + { + var valueStr = value as string; + if (valueStr == null) // For all of our custom conversions, value is a string + return base.DeserializeObject(value, type); + + var underType = Nullable.GetUnderlyingType(type); + if (underType != null) + return DeserializeObject(value, underType); + else if (type.GetTypeInfo().IsEnum) + return Enum.Parse(type, (string)value, true); + else if (type == typeof(DateTime)) + { + DateTime output; + var result = DateTime.TryParseExact(valueStr, PlayFabUtil._defaultDateTimeFormats, CultureInfo.InvariantCulture, PlayFabUtil.DateTimeStyles, out output); + if (result) + return output; + } + else if (type == typeof(DateTimeOffset)) + { + DateTimeOffset output; + var result = DateTimeOffset.TryParseExact(valueStr, PlayFabUtil._defaultDateTimeFormats, CultureInfo.InvariantCulture, PlayFabUtil.DateTimeStyles, out output); + if (result) + return output; + } + else if (type == typeof(TimeSpan)) + { + double seconds; + if (double.TryParse(valueStr, out seconds)) + return TimeSpan.FromSeconds(seconds); + } + return base.DeserializeObject(value, type); + } + + /// + /// Set output to a string that represents the input object + /// + protected override bool TrySerializeKnownTypes(object input, out object output) + { + if (input.GetType().GetTypeInfo().IsEnum) + { + output = input.ToString(); + return true; + } + else if (input is DateTime) + { + output = ((DateTime)input).ToString(PlayFabUtil._defaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.InvariantCulture); + return true; + } + else if (input is DateTimeOffset) + { + output = ((DateTimeOffset)input).ToString(PlayFabUtil._defaultDateTimeFormats[PlayFabUtil.DEFAULT_UTC_OUTPUT_INDEX], CultureInfo.InvariantCulture); + return true; + } + else if (input is TimeSpan) + { + output = ((TimeSpan)input).TotalSeconds; + return true; + } + return base.TrySerializeKnownTypes(input, out output); + } + } + + public T DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json, ApiSerializerStrategy); + } + + public T DeserializeObject(string json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.DeserializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + + public object DeserializeObject(string json) + { + return PlayFabSimpleJson.DeserializeObject(json, typeof(object), ApiSerializerStrategy); + } + + public string SerializeObject(object json) + { + return PlayFabSimpleJson.SerializeObject(json, ApiSerializerStrategy); + } + + public string SerializeObject(object json, object jsonSerializerStrategy) + { + return PlayFabSimpleJson.SerializeObject(json, (IJsonSerializerStrategy)jsonSerializerStrategy); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta new file mode 100644 index 00000000..285cd843 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/ISerializer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1337f8c156b41834691b131f3b6774f9 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs new file mode 100644 index 00000000..40767f07 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs @@ -0,0 +1,44 @@ +using System; + +namespace PlayFab.Internal +{ + [Obsolete("This logging utility has been deprecated. Use UnityEngine.Debug.Log")] + public static class Log + { + [Obsolete("Debug is deprecated.")] + public static void Debug(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Debug) != 0) + { + UnityEngine.Debug.Log(PlayFabUtil.timeStamp + " DEBUG: " + PlayFabUtil.Format(text, args)); + } + } + + [Obsolete("Info is deprecated.")] + public static void Info(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Info) != 0) + { + UnityEngine.Debug.Log(PlayFabUtil.timeStamp + " INFO: " + PlayFabUtil.Format(text, args)); + } + } + + [Obsolete("Warning is deprecated.")] + public static void Warning(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Warning) != 0) + { + UnityEngine.Debug.LogWarning(PlayFabUtil.timeStamp + " WARNING: " + PlayFabUtil.Format(text, args)); + } + } + + [Obsolete("Error is deprecated.")] + public static void Error(string text, params object[] args) + { + if ((PlayFabSettings.LogLevel & PlayFabLogLevel.Error) != 0) + { + UnityEngine.Debug.LogError(PlayFabUtil.timeStamp + " ERROR: " + PlayFabUtil.Format(text, args)); + } + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs.meta new file mode 100644 index 00000000..ebf6395e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Log.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5b55790eeab1b3c41a4f1381cbea1213 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs new file mode 100644 index 00000000..857c33da --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs @@ -0,0 +1,808 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace PlayFab +{ + /// + /// Error codes returned by PlayFabAPIs + /// + public enum PlayFabErrorCode + { + Unknown = 1, + ConnectionError = 2, + JsonParseError = 3, + Success = 0, + UnkownError = 500, + InvalidParams = 1000, + AccountNotFound = 1001, + AccountBanned = 1002, + InvalidUsernameOrPassword = 1003, + InvalidTitleId = 1004, + InvalidEmailAddress = 1005, + EmailAddressNotAvailable = 1006, + InvalidUsername = 1007, + InvalidPassword = 1008, + UsernameNotAvailable = 1009, + InvalidSteamTicket = 1010, + AccountAlreadyLinked = 1011, + LinkedAccountAlreadyClaimed = 1012, + InvalidFacebookToken = 1013, + AccountNotLinked = 1014, + FailedByPaymentProvider = 1015, + CouponCodeNotFound = 1016, + InvalidContainerItem = 1017, + ContainerNotOwned = 1018, + KeyNotOwned = 1019, + InvalidItemIdInTable = 1020, + InvalidReceipt = 1021, + ReceiptAlreadyUsed = 1022, + ReceiptCancelled = 1023, + GameNotFound = 1024, + GameModeNotFound = 1025, + InvalidGoogleToken = 1026, + UserIsNotPartOfDeveloper = 1027, + InvalidTitleForDeveloper = 1028, + TitleNameConflicts = 1029, + UserisNotValid = 1030, + ValueAlreadyExists = 1031, + BuildNotFound = 1032, + PlayerNotInGame = 1033, + InvalidTicket = 1034, + InvalidDeveloper = 1035, + InvalidOrderInfo = 1036, + RegistrationIncomplete = 1037, + InvalidPlatform = 1038, + UnknownError = 1039, + SteamApplicationNotOwned = 1040, + WrongSteamAccount = 1041, + TitleNotActivated = 1042, + RegistrationSessionNotFound = 1043, + NoSuchMod = 1044, + FileNotFound = 1045, + DuplicateEmail = 1046, + ItemNotFound = 1047, + ItemNotOwned = 1048, + ItemNotRecycleable = 1049, + ItemNotAffordable = 1050, + InvalidVirtualCurrency = 1051, + WrongVirtualCurrency = 1052, + WrongPrice = 1053, + NonPositiveValue = 1054, + InvalidRegion = 1055, + RegionAtCapacity = 1056, + ServerFailedToStart = 1057, + NameNotAvailable = 1058, + InsufficientFunds = 1059, + InvalidDeviceID = 1060, + InvalidPushNotificationToken = 1061, + NoRemainingUses = 1062, + InvalidPaymentProvider = 1063, + PurchaseInitializationFailure = 1064, + DuplicateUsername = 1065, + InvalidBuyerInfo = 1066, + NoGameModeParamsSet = 1067, + BodyTooLarge = 1068, + ReservedWordInBody = 1069, + InvalidTypeInBody = 1070, + InvalidRequest = 1071, + ReservedEventName = 1072, + InvalidUserStatistics = 1073, + NotAuthenticated = 1074, + StreamAlreadyExists = 1075, + ErrorCreatingStream = 1076, + StreamNotFound = 1077, + InvalidAccount = 1078, + PurchaseDoesNotExist = 1080, + InvalidPurchaseTransactionStatus = 1081, + APINotEnabledForGameClientAccess = 1082, + NoPushNotificationARNForTitle = 1083, + BuildAlreadyExists = 1084, + BuildPackageDoesNotExist = 1085, + CustomAnalyticsEventsNotEnabledForTitle = 1087, + InvalidSharedGroupId = 1088, + NotAuthorized = 1089, + MissingTitleGoogleProperties = 1090, + InvalidItemProperties = 1091, + InvalidPSNAuthCode = 1092, + InvalidItemId = 1093, + PushNotEnabledForAccount = 1094, + PushServiceError = 1095, + ReceiptDoesNotContainInAppItems = 1096, + ReceiptContainsMultipleInAppItems = 1097, + InvalidBundleID = 1098, + JavascriptException = 1099, + InvalidSessionTicket = 1100, + UnableToConnectToDatabase = 1101, + InternalServerError = 1110, + InvalidReportDate = 1111, + ReportNotAvailable = 1112, + DatabaseThroughputExceeded = 1113, + InvalidGameTicket = 1115, + ExpiredGameTicket = 1116, + GameTicketDoesNotMatchLobby = 1117, + LinkedDeviceAlreadyClaimed = 1118, + DeviceAlreadyLinked = 1119, + DeviceNotLinked = 1120, + PartialFailure = 1121, + PublisherNotSet = 1122, + ServiceUnavailable = 1123, + VersionNotFound = 1124, + RevisionNotFound = 1125, + InvalidPublisherId = 1126, + DownstreamServiceUnavailable = 1127, + APINotIncludedInTitleUsageTier = 1128, + DAULimitExceeded = 1129, + APIRequestLimitExceeded = 1130, + InvalidAPIEndpoint = 1131, + BuildNotAvailable = 1132, + ConcurrentEditError = 1133, + ContentNotFound = 1134, + CharacterNotFound = 1135, + CloudScriptNotFound = 1136, + ContentQuotaExceeded = 1137, + InvalidCharacterStatistics = 1138, + PhotonNotEnabledForTitle = 1139, + PhotonApplicationNotFound = 1140, + PhotonApplicationNotAssociatedWithTitle = 1141, + InvalidEmailOrPassword = 1142, + FacebookAPIError = 1143, + InvalidContentType = 1144, + KeyLengthExceeded = 1145, + DataLengthExceeded = 1146, + TooManyKeys = 1147, + FreeTierCannotHaveVirtualCurrency = 1148, + MissingAmazonSharedKey = 1149, + AmazonValidationError = 1150, + InvalidPSNIssuerId = 1151, + PSNInaccessible = 1152, + ExpiredAuthToken = 1153, + FailedToGetEntitlements = 1154, + FailedToConsumeEntitlement = 1155, + TradeAcceptingUserNotAllowed = 1156, + TradeInventoryItemIsAssignedToCharacter = 1157, + TradeInventoryItemIsBundle = 1158, + TradeStatusNotValidForCancelling = 1159, + TradeStatusNotValidForAccepting = 1160, + TradeDoesNotExist = 1161, + TradeCancelled = 1162, + TradeAlreadyFilled = 1163, + TradeWaitForStatusTimeout = 1164, + TradeInventoryItemExpired = 1165, + TradeMissingOfferedAndAcceptedItems = 1166, + TradeAcceptedItemIsBundle = 1167, + TradeAcceptedItemIsStackable = 1168, + TradeInventoryItemInvalidStatus = 1169, + TradeAcceptedCatalogItemInvalid = 1170, + TradeAllowedUsersInvalid = 1171, + TradeInventoryItemDoesNotExist = 1172, + TradeInventoryItemIsConsumed = 1173, + TradeInventoryItemIsStackable = 1174, + TradeAcceptedItemsMismatch = 1175, + InvalidKongregateToken = 1176, + FeatureNotConfiguredForTitle = 1177, + NoMatchingCatalogItemForReceipt = 1178, + InvalidCurrencyCode = 1179, + NoRealMoneyPriceForCatalogItem = 1180, + TradeInventoryItemIsNotTradable = 1181, + TradeAcceptedCatalogItemIsNotTradable = 1182, + UsersAlreadyFriends = 1183, + LinkedIdentifierAlreadyClaimed = 1184, + CustomIdNotLinked = 1185, + TotalDataSizeExceeded = 1186, + DeleteKeyConflict = 1187, + InvalidXboxLiveToken = 1188, + ExpiredXboxLiveToken = 1189, + ResettableStatisticVersionRequired = 1190, + NotAuthorizedByTitle = 1191, + NoPartnerEnabled = 1192, + InvalidPartnerResponse = 1193, + APINotEnabledForGameServerAccess = 1194, + StatisticNotFound = 1195, + StatisticNameConflict = 1196, + StatisticVersionClosedForWrites = 1197, + StatisticVersionInvalid = 1198, + APIClientRequestRateLimitExceeded = 1199, + InvalidJSONContent = 1200, + InvalidDropTable = 1201, + StatisticVersionAlreadyIncrementedForScheduledInterval = 1202, + StatisticCountLimitExceeded = 1203, + StatisticVersionIncrementRateExceeded = 1204, + ContainerKeyInvalid = 1205, + CloudScriptExecutionTimeLimitExceeded = 1206, + NoWritePermissionsForEvent = 1207, + CloudScriptFunctionArgumentSizeExceeded = 1208, + CloudScriptAPIRequestCountExceeded = 1209, + CloudScriptAPIRequestError = 1210, + CloudScriptHTTPRequestError = 1211, + InsufficientGuildRole = 1212, + GuildNotFound = 1213, + OverLimit = 1214, + EventNotFound = 1215, + InvalidEventField = 1216, + InvalidEventName = 1217, + CatalogNotConfigured = 1218, + OperationNotSupportedForPlatform = 1219, + SegmentNotFound = 1220, + StoreNotFound = 1221, + InvalidStatisticName = 1222, + TitleNotQualifiedForLimit = 1223, + InvalidServiceLimitLevel = 1224, + ServiceLimitLevelInTransition = 1225, + CouponAlreadyRedeemed = 1226, + GameServerBuildSizeLimitExceeded = 1227, + GameServerBuildCountLimitExceeded = 1228, + VirtualCurrencyCountLimitExceeded = 1229, + VirtualCurrencyCodeExists = 1230, + TitleNewsItemCountLimitExceeded = 1231, + InvalidTwitchToken = 1232, + TwitchResponseError = 1233, + ProfaneDisplayName = 1234, + UserAlreadyAdded = 1235, + InvalidVirtualCurrencyCode = 1236, + VirtualCurrencyCannotBeDeleted = 1237, + IdentifierAlreadyClaimed = 1238, + IdentifierNotLinked = 1239, + InvalidContinuationToken = 1240, + ExpiredContinuationToken = 1241, + InvalidSegment = 1242, + InvalidSessionId = 1243, + SessionLogNotFound = 1244, + InvalidSearchTerm = 1245, + TwoFactorAuthenticationTokenRequired = 1246, + GameServerHostCountLimitExceeded = 1247, + PlayerTagCountLimitExceeded = 1248, + RequestAlreadyRunning = 1249, + ActionGroupNotFound = 1250, + MaximumSegmentBulkActionJobsRunning = 1251, + NoActionsOnPlayersInSegmentJob = 1252, + DuplicateStatisticName = 1253, + ScheduledTaskNameConflict = 1254, + ScheduledTaskCreateConflict = 1255, + InvalidScheduledTaskName = 1256, + InvalidTaskSchedule = 1257, + SteamNotEnabledForTitle = 1258, + LimitNotAnUpgradeOption = 1259, + NoSecretKeyEnabledForCloudScript = 1260, + TaskNotFound = 1261, + TaskInstanceNotFound = 1262, + InvalidIdentityProviderId = 1263, + MisconfiguredIdentityProvider = 1264, + InvalidScheduledTaskType = 1265, + BillingInformationRequired = 1266, + LimitedEditionItemUnavailable = 1267, + InvalidAdPlacementAndReward = 1268, + AllAdPlacementViewsAlreadyConsumed = 1269, + GoogleOAuthNotConfiguredForTitle = 1270, + GoogleOAuthError = 1271, + UserNotFriend = 1272, + InvalidSignature = 1273, + InvalidPublicKey = 1274, + GoogleOAuthNoIdTokenIncludedInResponse = 1275, + StatisticUpdateInProgress = 1276, + LeaderboardVersionNotAvailable = 1277, + StatisticAlreadyHasPrizeTable = 1279, + PrizeTableHasOverlappingRanks = 1280, + PrizeTableHasMissingRanks = 1281, + PrizeTableRankStartsAtZero = 1282, + InvalidStatistic = 1283, + ExpressionParseFailure = 1284, + ExpressionInvokeFailure = 1285, + ExpressionTooLong = 1286, + DataUpdateRateExceeded = 1287, + RestrictedEmailDomain = 1288, + EncryptionKeyDisabled = 1289, + EncryptionKeyMissing = 1290, + EncryptionKeyBroken = 1291, + NoSharedSecretKeyConfigured = 1292, + SecretKeyNotFound = 1293, + PlayerSecretAlreadyConfigured = 1294, + APIRequestsDisabledForTitle = 1295, + InvalidSharedSecretKey = 1296, + PrizeTableHasNoRanks = 1297, + ProfileDoesNotExist = 1298, + ContentS3OriginBucketNotConfigured = 1299, + InvalidEnvironmentForReceipt = 1300, + EncryptedRequestNotAllowed = 1301, + SignedRequestNotAllowed = 1302, + RequestViewConstraintParamsNotAllowed = 1303, + BadPartnerConfiguration = 1304, + XboxBPCertificateFailure = 1305, + XboxXASSExchangeFailure = 1306, + InvalidEntityId = 1307, + StatisticValueAggregationOverflow = 1308, + EmailMessageFromAddressIsMissing = 1309, + EmailMessageToAddressIsMissing = 1310, + SmtpServerAuthenticationError = 1311, + SmtpServerLimitExceeded = 1312, + SmtpServerInsufficientStorage = 1313, + SmtpServerCommunicationError = 1314, + SmtpServerGeneralFailure = 1315, + EmailClientTimeout = 1316, + EmailClientCanceledTask = 1317, + EmailTemplateMissing = 1318, + InvalidHostForTitleId = 1319, + EmailConfirmationTokenDoesNotExist = 1320, + EmailConfirmationTokenExpired = 1321, + AccountDeleted = 1322, + PlayerSecretNotConfigured = 1323, + InvalidSignatureTime = 1324, + NoContactEmailAddressFound = 1325, + InvalidAuthToken = 1326, + AuthTokenDoesNotExist = 1327, + AuthTokenExpired = 1328, + AuthTokenAlreadyUsedToResetPassword = 1329, + MembershipNameTooLong = 1330, + MembershipNotFound = 1331, + GoogleServiceAccountInvalid = 1332, + GoogleServiceAccountParseFailure = 1333, + EntityTokenMissing = 1334, + EntityTokenInvalid = 1335, + EntityTokenExpired = 1336, + EntityTokenRevoked = 1337, + InvalidProductForSubscription = 1338, + XboxInaccessible = 1339, + SubscriptionAlreadyTaken = 1340, + SmtpAddonNotEnabled = 1341, + APIConcurrentRequestLimitExceeded = 1342, + XboxRejectedXSTSExchangeRequest = 1343, + VariableNotDefined = 1344, + TemplateVersionNotDefined = 1345, + FileTooLarge = 1346, + TitleDeleted = 1347, + TitleContainsUserAccounts = 1348, + TitleDeletionPlayerCleanupFailure = 1349, + EntityFileOperationPending = 1350, + NoEntityFileOperationPending = 1351, + EntityProfileVersionMismatch = 1352, + TemplateVersionTooOld = 1353, + MembershipDefinitionInUse = 1354, + PaymentPageNotConfigured = 1355, + FailedLoginAttemptRateLimitExceeded = 1356, + EntityBlockedByGroup = 1357, + RoleDoesNotExist = 1358, + EntityIsAlreadyMember = 1359, + DuplicateRoleId = 1360, + GroupInvitationNotFound = 1361, + GroupApplicationNotFound = 1362, + OutstandingInvitationAcceptedInstead = 1363, + OutstandingApplicationAcceptedInstead = 1364, + RoleIsGroupDefaultMember = 1365, + RoleIsGroupAdmin = 1366, + RoleNameNotAvailable = 1367, + GroupNameNotAvailable = 1368, + EmailReportAlreadySent = 1369, + EmailReportRecipientBlacklisted = 1370, + EventNamespaceNotAllowed = 1371, + EventEntityNotAllowed = 1372, + InvalidEntityType = 1373, + NullTokenResultFromAad = 1374, + InvalidTokenResultFromAad = 1375, + NoValidCertificateForAad = 1376, + InvalidCertificateForAad = 1377, + DuplicateDropTableId = 1378, + MultiplayerServerError = 1379, + MultiplayerServerTooManyRequests = 1380, + MultiplayerServerNoContent = 1381, + MultiplayerServerBadRequest = 1382, + MultiplayerServerUnauthorized = 1383, + MultiplayerServerForbidden = 1384, + MultiplayerServerNotFound = 1385, + MultiplayerServerConflict = 1386, + MultiplayerServerInternalServerError = 1387, + MultiplayerServerUnavailable = 1388, + ExplicitContentDetected = 1389, + PIIContentDetected = 1390, + InvalidScheduledTaskParameter = 1391, + PerEntityEventRateLimitExceeded = 1392, + TitleDefaultLanguageNotSet = 1393, + EmailTemplateMissingDefaultVersion = 1394, + FacebookInstantGamesIdNotLinked = 1395, + InvalidFacebookInstantGamesSignature = 1396, + FacebookInstantGamesAuthNotConfiguredForTitle = 1397, + EntityProfileConstraintValidationFailed = 1398, + TelemetryIngestionKeyPending = 1399, + TelemetryIngestionKeyNotFound = 1400, + StatisticChildNameInvalid = 1402, + DataIntegrityError = 1403, + VirtualCurrencyCannotBeSetToOlderVersion = 1404, + VirtualCurrencyMustBeWithinIntegerRange = 1405, + EmailTemplateInvalidSyntax = 1406, + EmailTemplateMissingCallback = 1407, + PushNotificationTemplateInvalidPayload = 1408, + InvalidLocalizedPushNotificationLanguage = 1409, + MissingLocalizedPushNotificationMessage = 1410, + PushNotificationTemplateMissingPlatformPayload = 1411, + PushNotificationTemplatePayloadContainsInvalidJson = 1412, + PushNotificationTemplateContainsInvalidIosPayload = 1413, + PushNotificationTemplateContainsInvalidAndroidPayload = 1414, + PushNotificationTemplateIosPayloadMissingNotificationBody = 1415, + PushNotificationTemplateAndroidPayloadMissingNotificationBody = 1416, + PushNotificationTemplateNotFound = 1417, + PushNotificationTemplateMissingDefaultVersion = 1418, + PushNotificationTemplateInvalidSyntax = 1419, + PushNotificationTemplateNoCustomPayloadForV1 = 1420, + NoLeaderboardForStatistic = 1421, + TitleNewsMissingDefaultLanguage = 1422, + TitleNewsNotFound = 1423, + TitleNewsDuplicateLanguage = 1424, + TitleNewsMissingTitleOrBody = 1425, + TitleNewsInvalidLanguage = 1426, + EmailRecipientBlacklisted = 1427, + InvalidGameCenterAuthRequest = 1428, + GameCenterAuthenticationFailed = 1429, + CannotEnablePartiesForTitle = 1430, + PartyError = 1431, + PartyRequests = 1432, + PartyNoContent = 1433, + PartyBadRequest = 1434, + PartyUnauthorized = 1435, + PartyForbidden = 1436, + PartyNotFound = 1437, + PartyConflict = 1438, + PartyInternalServerError = 1439, + PartyUnavailable = 1440, + PartyTooManyRequests = 1441, + PushNotificationTemplateMissingName = 1442, + CannotEnableMultiplayerServersForTitle = 1443, + WriteAttemptedDuringExport = 1444, + MultiplayerServerTitleQuotaCoresExceeded = 1445, + AutomationRuleNotFound = 1446, + EntityAPIKeyLimitExceeded = 1447, + EntityAPIKeyNotFound = 1448, + EntityAPIKeyOrSecretInvalid = 1449, + EconomyServiceUnavailable = 1450, + EconomyServiceInternalError = 1451, + QueryRateLimitExceeded = 1452, + EntityAPIKeyCreationDisabledForEntity = 1453, + ForbiddenByEntityPolicy = 1454, + UpdateInventoryRateLimitExceeded = 1455, + StudioCreationRateLimited = 1456, + StudioCreationInProgress = 1457, + DuplicateStudioName = 1458, + StudioNotFound = 1459, + StudioDeleted = 1460, + StudioDeactivated = 1461, + StudioActivated = 1462, + TitleCreationRateLimited = 1463, + TitleCreationInProgress = 1464, + DuplicateTitleName = 1465, + TitleActivationRateLimited = 1466, + TitleActivationInProgress = 1467, + TitleDeactivated = 1468, + TitleActivated = 1469, + CloudScriptAzureFunctionsExecutionTimeLimitExceeded = 1470, + CloudScriptAzureFunctionsArgumentSizeExceeded = 1471, + CloudScriptAzureFunctionsReturnSizeExceeded = 1472, + CloudScriptAzureFunctionsHTTPRequestError = 1473, + VirtualCurrencyBetaGetError = 1474, + VirtualCurrencyBetaCreateError = 1475, + VirtualCurrencyBetaInitialDepositSaveError = 1476, + VirtualCurrencyBetaSaveError = 1477, + VirtualCurrencyBetaDeleteError = 1478, + VirtualCurrencyBetaRestoreError = 1479, + VirtualCurrencyBetaSaveConflict = 1480, + VirtualCurrencyBetaUpdateError = 1481, + InsightsManagementDatabaseNotFound = 1482, + InsightsManagementOperationNotFound = 1483, + InsightsManagementErrorPendingOperationExists = 1484, + InsightsManagementSetPerformanceLevelInvalidParameter = 1485, + InsightsManagementSetStorageRetentionInvalidParameter = 1486, + InsightsManagementGetStorageUsageInvalidParameter = 1487, + InsightsManagementGetOperationStatusInvalidParameter = 1488, + DuplicatePurchaseTransactionId = 1489, + EvaluationModePlayerCountExceeded = 1490, + GetPlayersInSegmentRateLimitExceeded = 1491, + CloudScriptFunctionNameSizeExceeded = 1492, + PaidInsightsFeaturesNotEnabled = 1493, + CloudScriptAzureFunctionsQueueRequestError = 1494, + EvaluationModeTitleCountExceeded = 1495, + InsightsManagementTitleNotInFlight = 1496, + LimitNotFound = 1497, + LimitNotAvailableViaAPI = 1498, + InsightsManagementSetStorageRetentionBelowMinimum = 1499, + InsightsManagementSetStorageRetentionAboveMaximum = 1500, + AppleNotEnabledForTitle = 1501, + InsightsManagementNewActiveEventExportLimitInvalid = 1502, + InsightsManagementSetPerformanceRateLimited = 1503, + PartyRequestsThrottledFromRateLimiter = 1504, + XboxServiceTooManyRequests = 1505, + NintendoSwitchNotEnabledForTitle = 1506, + RequestMultiplayerServersThrottledFromRateLimiter = 1507, + TitleDataOverrideNotFound = 1508, + DuplicateKeys = 1509, + WasNotCreatedWithCloudRoot = 1510, + LegacyMultiplayerServersDeprecated = 1511, + VirtualCurrencyCurrentlyUnavailable = 1512, + SteamUserNotFound = 1513, + ElasticSearchOperationFailed = 1514, + NotImplemented = 1515, + PublisherNotFound = 1516, + PublisherDeleted = 1517, + ApiDisabledForMigration = 1518, + ResourceNameUpdateNotAllowed = 1519, + ApiNotEnabledForTitle = 1520, + DuplicateTitleNameForPublisher = 1521, + AzureTitleCreationInProgress = 1522, + TitleConstraintsPublisherDeletion = 1524, + InvalidPlayerAccountPoolId = 1525, + PlayerAccountPoolNotFound = 1526, + PlayerAccountPoolDeleted = 1527, + TitleCleanupInProgress = 1528, + AzureResourceConcurrentOperationInProgress = 1529, + TitlePublisherUpdateNotAllowed = 1530, + AzureResourceManagerNotSupportedInStamp = 1531, + ApiNotIncludedInAzurePlayFabFeatureSet = 1532, + GoogleServiceAccountFailedAuth = 1533, + GoogleAPIServiceUnavailable = 1534, + GoogleAPIServiceUnknownError = 1535, + NoValidIdentityForAad = 1536, + PlayerIdentityLinkNotFound = 1537, + PhotonApplicationIdAlreadyInUse = 1538, + CloudScriptUnableToDeleteProductionRevision = 1539, + CustomIdNotFound = 1540, + AutomationInvalidInput = 1541, + AutomationInvalidRuleName = 1542, + AutomationRuleAlreadyExists = 1543, + AutomationRuleLimitExceeded = 1544, + InvalidGooglePlayGamesServerAuthCode = 1545, + PlayStreamConnectionFailed = 1547, + InvalidEventContents = 1548, + InsightsV1Deprecated = 1549, + AnalysisSubscriptionNotFound = 1550, + AnalysisSubscriptionFailed = 1551, + AnalysisSubscriptionFoundAlready = 1552, + AnalysisSubscriptionManagementInvalidInput = 1553, + InvalidGameCenterId = 1554, + InvalidNintendoSwitchAccountId = 1555, + EntityAPIKeysNotSupported = 1556, + IpAddressBanned = 1557, + EntityLineageBanned = 1558, + NamespaceMismatch = 1559, + InvalidServiceConfiguration = 1560, + InvalidNamespaceMismatch = 1561, + MatchmakingEntityInvalid = 2001, + MatchmakingPlayerAttributesInvalid = 2002, + MatchmakingQueueNotFound = 2016, + MatchmakingMatchNotFound = 2017, + MatchmakingTicketNotFound = 2018, + MatchmakingAlreadyJoinedTicket = 2028, + MatchmakingTicketAlreadyCompleted = 2029, + MatchmakingQueueConfigInvalid = 2031, + MatchmakingMemberProfileInvalid = 2032, + NintendoSwitchDeviceIdNotLinked = 2034, + MatchmakingNotEnabled = 2035, + MatchmakingPlayerAttributesTooLarge = 2043, + MatchmakingNumberOfPlayersInTicketTooLarge = 2044, + MatchmakingAttributeInvalid = 2046, + MatchmakingPlayerHasNotJoinedTicket = 2053, + MatchmakingRateLimitExceeded = 2054, + MatchmakingTicketMembershipLimitExceeded = 2055, + MatchmakingUnauthorized = 2056, + MatchmakingQueueLimitExceeded = 2057, + MatchmakingRequestTypeMismatch = 2058, + MatchmakingBadRequest = 2059, + PubSubFeatureNotEnabledForTitle = 2500, + PubSubTooManyRequests = 2501, + PubSubConnectionNotFoundForEntity = 2502, + PubSubConnectionHandleInvalid = 2503, + PubSubSubscriptionLimitExceeded = 2504, + TitleConfigNotFound = 3001, + TitleConfigUpdateConflict = 3002, + TitleConfigSerializationError = 3003, + CatalogApiNotImplemented = 4000, + CatalogEntityInvalid = 4001, + CatalogTitleIdMissing = 4002, + CatalogPlayerIdMissing = 4003, + CatalogClientIdentityInvalid = 4004, + CatalogOneOrMoreFilesInvalid = 4005, + CatalogItemMetadataInvalid = 4006, + CatalogItemIdInvalid = 4007, + CatalogSearchParameterInvalid = 4008, + CatalogFeatureDisabled = 4009, + CatalogConfigInvalid = 4010, + CatalogItemTypeInvalid = 4012, + CatalogBadRequest = 4013, + CatalogTooManyRequests = 4014, + ExportInvalidStatusUpdate = 5000, + ExportInvalidPrefix = 5001, + ExportBlobContainerDoesNotExist = 5002, + ExportNotFound = 5004, + ExportCouldNotUpdate = 5005, + ExportInvalidStorageType = 5006, + ExportAmazonBucketDoesNotExist = 5007, + ExportInvalidBlobStorage = 5008, + ExportKustoException = 5009, + ExportKustoConnectionFailed = 5012, + ExportUnknownError = 5013, + ExportCantEditPendingExport = 5014, + ExportLimitExports = 5015, + ExportLimitEvents = 5016, + ExportInvalidPartitionStatusModification = 5017, + ExportCouldNotCreate = 5018, + ExportNoBackingDatabaseFound = 5019, + ExportCouldNotDelete = 5020, + ExportCannotDetermineEventQuery = 5021, + ExportInvalidQuerySchemaModification = 5022, + ExportQuerySchemaMissingRequiredColumns = 5023, + ExportCannotParseQuery = 5024, + ExportControlCommandsNotAllowed = 5025, + ExportQueryMissingTableReference = 5026, + ExportInsightsV1Deprecated = 5027, + ExplorerBasicInvalidQueryName = 5100, + ExplorerBasicInvalidQueryDescription = 5101, + ExplorerBasicInvalidQueryConditions = 5102, + ExplorerBasicInvalidQueryStartDate = 5103, + ExplorerBasicInvalidQueryEndDate = 5104, + ExplorerBasicInvalidQueryGroupBy = 5105, + ExplorerBasicInvalidQueryAggregateType = 5106, + ExplorerBasicInvalidQueryAggregateProperty = 5107, + ExplorerBasicLoadQueriesError = 5108, + ExplorerBasicLoadQueryError = 5109, + ExplorerBasicCreateQueryError = 5110, + ExplorerBasicDeleteQueryError = 5111, + ExplorerBasicUpdateQueryError = 5112, + ExplorerBasicSavedQueriesLimit = 5113, + ExplorerBasicSavedQueryNotFound = 5114, + TenantShardMapperShardNotFound = 5500, + TitleNotEnabledForParty = 6000, + PartyVersionNotFound = 6001, + MultiplayerServerBuildReferencedByMatchmakingQueue = 6002, + MultiplayerServerBuildReferencedByBuildAlias = 6003, + MultiplayerServerBuildAliasReferencedByMatchmakingQueue = 6004, + ExperimentationExperimentStopped = 7000, + ExperimentationExperimentRunning = 7001, + ExperimentationExperimentNotFound = 7002, + ExperimentationExperimentNeverStarted = 7003, + ExperimentationExperimentDeleted = 7004, + ExperimentationClientTimeout = 7005, + ExperimentationInvalidVariantConfiguration = 7006, + ExperimentationInvalidVariableConfiguration = 7007, + ExperimentInvalidId = 7008, + ExperimentationNoScorecard = 7009, + ExperimentationTreatmentAssignmentFailed = 7010, + ExperimentationTreatmentAssignmentDisabled = 7011, + ExperimentationInvalidDuration = 7012, + ExperimentationMaxExperimentsReached = 7013, + ExperimentationExperimentSchedulingInProgress = 7014, + ExperimentationInvalidEndDate = 7015, + ExperimentationInvalidStartDate = 7016, + ExperimentationMaxDurationExceeded = 7017, + ExperimentationExclusionGroupNotFound = 7018, + ExperimentationExclusionGroupInsufficientCapacity = 7019, + ExperimentationExclusionGroupCannotDelete = 7020, + ExperimentationExclusionGroupInvalidTrafficAllocation = 7021, + ExperimentationExclusionGroupInvalidName = 7022, + MaxActionDepthExceeded = 8000, + TitleNotOnUpdatedPricingPlan = 9000, + SegmentManagementTitleNotInFlight = 10000, + SegmentManagementNoExpressionTree = 10001, + SegmentManagementTriggerActionCountOverLimit = 10002, + SegmentManagementSegmentCountOverLimit = 10003, + SegmentManagementInvalidSegmentId = 10004, + SegmentManagementInvalidInput = 10005, + SegmentManagementInvalidSegmentName = 10006, + DeleteSegmentRateLimitExceeded = 10007, + CreateSegmentRateLimitExceeded = 10008, + UpdateSegmentRateLimitExceeded = 10009, + GetSegmentsRateLimitExceeded = 10010, + AsyncExportNotInFlight = 10011, + AsyncExportNotFound = 10012, + AsyncExportRateLimitExceeded = 10013, + AnalyticsSegmentCountOverLimit = 10014, + SnapshotNotFound = 11000, + InventoryApiNotImplemented = 12000, + LobbyDoesNotExist = 13000, + LobbyRateLimitExceeded = 13001, + LobbyPlayerAlreadyJoined = 13002, + LobbyNotJoinable = 13003, + LobbyMemberCannotRejoin = 13004, + LobbyCurrentPlayersMoreThanMaxPlayers = 13005, + LobbyPlayerNotPresent = 13006, + LobbyBadRequest = 13007, + LobbyPlayerMaxLobbyLimitExceeded = 13008, + LobbyNewOwnerMustBeConnected = 13009, + LobbyCurrentOwnerStillConnected = 13010, + LobbyMemberIsNotOwner = 13011, + EventSamplingInvalidRatio = 14000, + EventSamplingInvalidEventNamespace = 14001, + EventSamplingInvalidEventName = 14002, + EventSamplingRatioNotFound = 14003, + TelemetryKeyNotFound = 14200, + TelemetryKeyInvalidName = 14201, + TelemetryKeyAlreadyExists = 14202, + TelemetryKeyInvalid = 14203, + TelemetryKeyCountOverLimit = 14204, + TelemetryKeyDeactivated = 14205, + TelemetryKeyLongInsightsRetentionNotAllowed = 14206, + EventSinkConnectionInvalid = 15000, + EventSinkConnectionUnauthorized = 15001, + EventSinkRegionInvalid = 15002, + EventSinkLimitExceeded = 15003, + EventSinkSasTokenInvalid = 15004, + EventSinkNotFound = 15005, + EventSinkNameInvalid = 15006, + EventSinkSasTokenPermissionInvalid = 15007, + EventSinkSecretInvalid = 15008, + EventSinkTenantNotFound = 15009, + EventSinkAadNotFound = 15010, + EventSinkDatabaseNotFound = 15011, + OperationCanceled = 16000, + InvalidDisplayNameRandomSuffixLength = 17000, + AllowNonUniquePlayerDisplayNamesDisableNotAllowed = 17001, + PartitionedEventInvalid = 18000, + PartitionedEventCountOverLimit = 18001, + PlayerCustomPropertiesPropertyNameTooLong = 19000, + PlayerCustomPropertiesPropertyNameIsInvalid = 19001, + PlayerCustomPropertiesStringPropertyValueTooLong = 19002, + PlayerCustomPropertiesValueIsInvalidType = 19003, + PlayerCustomPropertiesVersionMismatch = 19004, + PlayerCustomPropertiesPropertyCountTooHigh = 19005, + PlayerCustomPropertiesDuplicatePropertyName = 19006, + PlayerCustomPropertiesPropertyDoesNotExist = 19007 + } + + public class PlayFabError + { + public string ApiEndpoint; + public int HttpCode; + public string HttpStatus; + public PlayFabErrorCode Error; + public string ErrorMessage; + public Dictionary> ErrorDetails; + public object CustomData; + public uint? RetryAfterSeconds = null; + + public override string ToString() + { + return GenerateErrorReport(); + } + + [ThreadStatic] + private static StringBuilder _tempSb; + /// + /// This converts the PlayFabError into a human readable string describing the error. + /// If error is not found, it will return the http code, status, and error + /// + /// A description of the error that we just incur. + public string GenerateErrorReport() + { + if (_tempSb == null) + _tempSb = new StringBuilder(); + _tempSb.Length = 0; + if (String.IsNullOrEmpty(ErrorMessage)) + { + _tempSb.Append(ApiEndpoint).Append(": ").Append("Http Code: ").Append(HttpCode.ToString()).Append("\nHttp Status: ").Append(HttpStatus).Append("\nError: ").Append(Error.ToString()).Append("\n"); + } + else + { + _tempSb.Append(ApiEndpoint).Append(": ").Append(ErrorMessage); + } + + if (ErrorDetails != null) + foreach (var pair in ErrorDetails) + foreach (var msg in pair.Value) + _tempSb.Append("\n").Append(pair.Key).Append(": ").Append(msg); + return _tempSb.ToString(); + } + } + + public class PlayFabException : Exception + { + public readonly PlayFabExceptionCode Code; + public PlayFabException(PlayFabExceptionCode code, string message) : base(message) + { + Code = code; + } + } + + public enum PlayFabExceptionCode + { + AuthContextRequired, + BuildError, + DeveloperKeyNotSet, + EntityTokenNotSet, + NotLoggedIn, + TitleNotSet, + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta new file mode 100644 index 00000000..1104460f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabErrors.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ed146f2193bb8ef49ad1200eefdab503 +timeCreated: 1468524876 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta new file mode 100644 index 00000000..188ddcdd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6de758a294727f04c82bf319fdd54c60 +folderAsset: yes +timeCreated: 1462746198 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs new file mode 100644 index 00000000..59f79e13 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using PlayFab.SharedModels; + +namespace PlayFab.Internal +{ + public enum AuthType + { + None, + PreLoginSession, // Not yet defined + LoginSession, // "X-Authorization" + DevSecretKey, // "X-SecretKey" + EntityToken, // "X-EntityToken" + } + + public enum HttpRequestState + { + Sent, + Received, + Idle, + Error + } + + public class CallRequestContainer + { +#if !UNITY_WSA && !UNITY_WP8 + public HttpRequestState HttpState = HttpRequestState.Idle; + public System.Net.HttpWebRequest HttpRequest = null; +#endif +#if PLAYFAB_REQUEST_TIMING + public PlayFabHttp.RequestTiming Timing; + public System.Diagnostics.Stopwatch Stopwatch; +#endif + + // This class stores the state of the request and all associated data + public string ApiEndpoint = null; + public string FullUrl = null; + public byte[] Payload = null; + public string JsonResponse = null; + public PlayFabRequestCommon ApiRequest; + public Dictionary RequestHeaders; + public PlayFabResultCommon ApiResult; + public PlayFabError Error; + public Action DeserializeResultJson; + public Action InvokeSuccessCallback; + public Action ErrorCallback; + public object CustomData = null; + public PlayFabApiSettings settings; + public PlayFabAuthenticationContext context; + public IPlayFabInstanceApi instanceApi; + public bool CalledGetResponse = false; + + public CallRequestContainer() + { +#if PLAYFAB_REQUEST_TIMING + Stopwatch = System.Diagnostics.Stopwatch.StartNew(); +#endif + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta new file mode 100644 index 00000000..00621125 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/IPlayFabHttp.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aeac58284b4b1cd4ab93ab0e71ba8540 +timeCreated: 1462745280 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs new file mode 100644 index 00000000..3f5e7bc2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs @@ -0,0 +1,500 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using PlayFab.Public; +using PlayFab.SharedModels; +using UnityEngine; + +namespace PlayFab.Internal +{ + /// + /// This is a wrapper for Http So we can better separate the functionaity of Http Requests delegated to WWW or HttpWebRequest + /// + public class PlayFabHttp : SingletonMonoBehaviour + { + private static List _apiCallQueue = new List(); // Starts initialized, and is nulled when it's flushed + + public delegate void ApiProcessingEvent(TEventArgs e); + public delegate void ApiProcessErrorEvent(PlayFabRequestCommon request, PlayFabError error); + public static event ApiProcessingEvent ApiProcessingEventHandler; + public static event ApiProcessErrorEvent ApiProcessingErrorEventHandler; + public static readonly Dictionary GlobalHeaderInjection = new Dictionary(); + + private static IPlayFabLogger _logger; +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + private static IScreenTimeTracker screenTimeTracker = new ScreenTimeTracker(); + private const float delayBetweenBatches = 5.0f; +#endif + +#if PLAYFAB_REQUEST_TIMING + public struct RequestTiming + { + public DateTime StartTimeUtc; + public string ApiEndpoint; + public int WorkerRequestMs; + public int MainThreadRequestMs; + } + + public delegate void ApiRequestTimingEvent(RequestTiming time); + public static event ApiRequestTimingEvent ApiRequestTimingEventHandler; +#endif + + /// + /// Return the number of api calls that are waiting for results from the server + /// + /// + public static int GetPendingMessages() + { + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + return transport.IsInitialized ? transport.GetPendingMessages() : 0; + } + + /// + /// This initializes the GameObject and ensures it is in the scene. + /// + public static void InitializeHttp() + { + if (string.IsNullOrEmpty(PlayFabSettings.TitleId)) + throw new PlayFabException(PlayFabExceptionCode.TitleNotSet, "You must set PlayFabSettings.TitleId before making API Calls."); + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + if (transport.IsInitialized) + return; + + transport.Initialize(); + CreateInstance(); // Invoke the SingletonMonoBehaviour + } + + /// + /// This initializes the GameObject and ensures it is in the scene. + /// + public static void InitializeLogger(IPlayFabLogger setLogger = null) + { + if (_logger != null) + throw new InvalidOperationException("Once initialized, the logger cannot be reset."); + if (setLogger == null) + setLogger = new PlayFabLogger(); + _logger = setLogger; + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + /// + /// This initializes ScreenTimeTracker object and notifying it to start sending info. + /// + /// Result of the user's login, represent user ID + public static void InitializeScreenTimeTracker(string entityId, string entityType, string playFabUserId) + { + screenTimeTracker.ClientSessionStart(entityId, entityType, playFabUserId); + instance.StartCoroutine(SendScreenTimeEvents(delayBetweenBatches)); + } + + /// + /// This function will send Screen Time events on a periodic basis. + /// + /// Delay between batches, in seconds + private static IEnumerator SendScreenTimeEvents(float secondsBetweenBatches) + { + WaitForSeconds delay = new WaitForSeconds(secondsBetweenBatches); + + while (!PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.Send(); + yield return delay; + } + } +#endif + + public static void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + InitializeHttp(); + PluginManager.GetPlugin(PluginContract.PlayFab_Transport).SimpleGetCall(fullUrl, successCallback, errorCallback); + } + + + public static void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + InitializeHttp(); + PluginManager.GetPlugin(PluginContract.PlayFab_Transport).SimplePutCall(fullUrl, payload, successCallback, errorCallback); + } + + public static void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + InitializeHttp(); + PluginManager.GetPlugin(PluginContract.PlayFab_Transport).SimplePostCall(fullUrl, payload, successCallback, errorCallback); + } + + protected internal static void MakeApiCall(string apiEndpoint, + PlayFabRequestCommon request, AuthType authType, Action resultCallback, + Action errorCallback, object customData = null, Dictionary extraHeaders = null, PlayFabAuthenticationContext authenticationContext = null, PlayFabApiSettings apiSettings = null, IPlayFabInstanceApi instanceApi = null) + where TResult : PlayFabResultCommon + { + apiSettings = apiSettings ?? PlayFabSettings.staticSettings; + var fullUrl = apiSettings.GetFullUrl(apiEndpoint, apiSettings.RequestGetParams); + _MakeApiCall(apiEndpoint, fullUrl, request, authType, resultCallback, errorCallback, customData, extraHeaders, false, authenticationContext, apiSettings, instanceApi); + } + + protected internal static void MakeApiCallWithFullUri(string fullUri, + PlayFabRequestCommon request, AuthType authType, Action resultCallback, + Action errorCallback, object customData = null, Dictionary extraHeaders = null, PlayFabAuthenticationContext authenticationContext = null, PlayFabApiSettings apiSettings = null, IPlayFabInstanceApi instanceApi = null) + where TResult : PlayFabResultCommon + { + apiSettings = apiSettings ?? PlayFabSettings.staticSettings; + // This will not be called if environment file does not exist or does not contain property the debugging URI + _MakeApiCall(null, fullUri, request, authType, resultCallback, errorCallback, customData, extraHeaders, false, authenticationContext, apiSettings, instanceApi); + } + + /// + /// Internal method for Make API Calls + /// + private static void _MakeApiCall(string apiEndpoint, string fullUrl, + PlayFabRequestCommon request, AuthType authType, Action resultCallback, + Action errorCallback, object customData, Dictionary extraHeaders, bool allowQueueing, PlayFabAuthenticationContext authenticationContext, PlayFabApiSettings apiSettings, IPlayFabInstanceApi instanceApi) + where TResult : PlayFabResultCommon + { + InitializeHttp(); + SendEvent(apiEndpoint, request, null, ApiProcessingEventType.Pre); + + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var reqContainer = new CallRequestContainer + { + ApiEndpoint = apiEndpoint, + FullUrl = fullUrl, + settings = apiSettings, + context = authenticationContext, + CustomData = customData, + Payload = Encoding.UTF8.GetBytes(serializer.SerializeObject(request)), + ApiRequest = request, + ErrorCallback = errorCallback, + RequestHeaders = extraHeaders ?? new Dictionary(), // Use any headers provided by the customer + instanceApi = instanceApi + }; + // Append any additional headers + foreach (var pair in GlobalHeaderInjection) + if (!reqContainer.RequestHeaders.ContainsKey(pair.Key)) + reqContainer.RequestHeaders[pair.Key] = pair.Value; + +#if PLAYFAB_REQUEST_TIMING + reqContainer.Timing.StartTimeUtc = DateTime.UtcNow; + reqContainer.Timing.ApiEndpoint = apiEndpoint; +#endif + + // Add PlayFab Headers + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + reqContainer.RequestHeaders["X-ReportErrorAsSuccess"] = "true"; // Makes processing PlayFab errors a little easier + reqContainer.RequestHeaders["X-PlayFabSDK"] = PlayFabSettings.VersionString; // Tell PlayFab which SDK this is + switch (authType) + { +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + case AuthType.DevSecretKey: + if (apiSettings.DeveloperSecretKey == null) throw new PlayFabException(PlayFabExceptionCode.DeveloperKeyNotSet, "DeveloperSecretKey is not found in Request, Server Instance or PlayFabSettings"); + reqContainer.RequestHeaders["X-SecretKey"] = apiSettings.DeveloperSecretKey; break; +#endif +#if !DISABLE_PLAYFABCLIENT_API + case AuthType.LoginSession: + if (authenticationContext != null) + reqContainer.RequestHeaders["X-Authorization"] = authenticationContext.ClientSessionTicket; + break; +#endif +#if !DISABLE_PLAYFABENTITY_API + case AuthType.EntityToken: + if (authenticationContext != null) + reqContainer.RequestHeaders["X-EntityToken"] = authenticationContext.EntityToken; + break; +#endif + } + + // These closures preserve the TResult generic information in a way that's safe for all the devices + reqContainer.DeserializeResultJson = () => + { + reqContainer.ApiResult = serializer.DeserializeObject(reqContainer.JsonResponse); + }; + reqContainer.InvokeSuccessCallback = () => + { + if (resultCallback != null) + { + resultCallback((TResult)reqContainer.ApiResult); + } + }; + + if (allowQueueing && _apiCallQueue != null) + { + for (var i = _apiCallQueue.Count - 1; i >= 0; i--) + if (_apiCallQueue[i].ApiEndpoint == apiEndpoint) + _apiCallQueue.RemoveAt(i); + _apiCallQueue.Add(reqContainer); + } + else + { + transport.MakeApiCall(reqContainer); + } + } + + /// + /// Internal code shared by IPlayFabHTTP implementations + /// + internal void OnPlayFabApiResult(CallRequestContainer reqContainer) + { + var result = reqContainer.ApiResult; + +#if !DISABLE_PLAYFABENTITY_API + + var entRes = result as AuthenticationModels.GetEntityTokenResponse; + if (entRes != null) + { + PlayFabSettings.staticPlayer.EntityToken = entRes.EntityToken; + } + +#endif +#if !DISABLE_PLAYFABCLIENT_API + var logRes = result as ClientModels.LoginResult; + var regRes = result as ClientModels.RegisterPlayFabUserResult; + if (logRes != null) + { + logRes.AuthenticationContext = new PlayFabAuthenticationContext(logRes.SessionTicket, logRes.EntityToken.EntityToken, logRes.PlayFabId, logRes.EntityToken.Entity.Id, logRes.EntityToken.Entity.Type); + if (reqContainer.context != null) + reqContainer.context.CopyFrom(logRes.AuthenticationContext); + } + else if (regRes != null) + { + regRes.AuthenticationContext = new PlayFabAuthenticationContext(regRes.SessionTicket, regRes.EntityToken.EntityToken, regRes.PlayFabId, regRes.EntityToken.Entity.Id, regRes.EntityToken.Entity.Type); + if (reqContainer.context != null) + reqContainer.context.CopyFrom(regRes.AuthenticationContext); + } +#endif + } + + /// + /// MonoBehaviour OnEnable Method + /// + private void OnEnable() + { + if (_logger != null) + { + _logger.OnEnable(); + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnEnable(); + } +#endif + } + + /// + /// MonoBehaviour OnDisable + /// + private void OnDisable() + { + if (_logger != null) + { + _logger.OnDisable(); + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnDisable(); + } +#endif + } + + /// + /// MonoBehaviour OnDestroy + /// + private void OnDestroy() + { + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + if (transport.IsInitialized) + { + transport.OnDestroy(); + } + + if (_logger != null) + { + _logger.OnDestroy(); + } + +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnDestroy(); + } +#endif + } + + /// + /// MonoBehaviour OnApplicationFocus + /// + public void OnApplicationFocus(bool isFocused) + { +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnApplicationFocus(isFocused); + } +#endif + } + + /// + /// MonoBehaviour OnApplicationQuit + /// + public void OnApplicationQuit() + { +#if !DISABLE_PLAYFABENTITY_API && !DISABLE_PLAYFABCLIENT_API + if ((screenTimeTracker != null) && !PlayFabSettings.DisableFocusTimeCollection) + { + screenTimeTracker.OnApplicationQuit(); + } +#endif + } + + /// + /// MonoBehaviour Update + /// + private void Update() + { + var transport = PluginManager.GetPlugin(PluginContract.PlayFab_Transport); + if (transport.IsInitialized) + { + if (_apiCallQueue != null) + { + foreach (var eachRequest in _apiCallQueue) + transport.MakeApiCall(eachRequest); // Flush the queue + _apiCallQueue = null; // null this after it's flushed + } + transport.Update(); + } + + while (_injectedCoroutines.Count > 0) + StartCoroutine(_injectedCoroutines.Dequeue()); + + while (_injectedAction.Count > 0) + { + var action = _injectedAction.Dequeue(); + if (action != null) + { + action.Invoke(); + } + } + } + + #region Helpers + protected internal static PlayFabError GeneratePlayFabError(string apiEndpoint, string json, object customData) + { + Dictionary errorDict = null; + Dictionary> errorDetails = null; + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + try + { + // Deserialize the error + errorDict = serializer.DeserializeObject>(json); + } + catch (Exception) { /* Unusual, but shouldn't actually matter */ } + try + { + object errorDetailsString; + if (errorDict != null && errorDict.TryGetValue("errorDetails", out errorDetailsString)) + errorDetails = serializer.DeserializeObject>>(errorDetailsString.ToString()); + } + catch (Exception) { /* Unusual, but shouldn't actually matter */ } + + return new PlayFabError + { + ApiEndpoint = apiEndpoint, + HttpCode = errorDict != null && errorDict.ContainsKey("code") ? Convert.ToInt32(errorDict["code"]) : 400, + HttpStatus = errorDict != null && errorDict.ContainsKey("status") ? (string)errorDict["status"] : "BadRequest", + Error = errorDict != null && errorDict.ContainsKey("errorCode") ? (PlayFabErrorCode)Convert.ToInt32(errorDict["errorCode"]) : PlayFabErrorCode.ServiceUnavailable, + ErrorMessage = errorDict != null && errorDict.ContainsKey("errorMessage") ? (string)errorDict["errorMessage"] : json, + ErrorDetails = errorDetails, + CustomData = customData, + RetryAfterSeconds = errorDict != null && errorDict.ContainsKey("retryAfterSeconds") ? Convert.ToUInt32(errorDict["retryAfterSeconds"]) : (uint?)null, + }; + } + + protected internal static void SendErrorEvent(PlayFabRequestCommon request, PlayFabError error) + { + if (ApiProcessingErrorEventHandler == null) + return; + + try + { + ApiProcessingErrorEventHandler(request, error); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + protected internal static void SendEvent(string apiEndpoint, PlayFabRequestCommon request, PlayFabResultCommon result, ApiProcessingEventType eventType) + { + if (ApiProcessingEventHandler == null) + return; + try + { + ApiProcessingEventHandler(new ApiProcessingEventArgs + { + ApiEndpoint = apiEndpoint, + EventType = eventType, + Request = request, + Result = result + }); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + public static void ClearAllEvents() + { + ApiProcessingEventHandler = null; + ApiProcessingErrorEventHandler = null; + } + +#if PLAYFAB_REQUEST_TIMING + protected internal static void SendRequestTiming(RequestTiming rt) + { + if (ApiRequestTimingEventHandler != null) + { + ApiRequestTimingEventHandler(rt); + } + } +#endif + #endregion + private readonly Queue _injectedCoroutines = new Queue(); + private readonly Queue _injectedAction = new Queue(); + + public void InjectInUnityThread(IEnumerator x) + { + _injectedCoroutines.Enqueue(x); + } + + public void InjectInUnityThread(Action action) + { + _injectedAction.Enqueue(action); + } + } + + #region Event Classes + public enum ApiProcessingEventType + { + Pre, + Post + } + + public class ApiProcessingEventArgs + { + public string ApiEndpoint; + public ApiProcessingEventType EventType; + public PlayFabRequestCommon Request; + public PlayFabResultCommon Result; + + public TRequest GetRequest() where TRequest : PlayFabRequestCommon + { + return Request as TRequest; + } + } + #endregion +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta new file mode 100644 index 00000000..646a626b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabHTTP.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 97a8a3caac8b73541aa8a9a1e330f479 +timeCreated: 1462575707 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs new file mode 100644 index 00000000..ff24ef96 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs @@ -0,0 +1,243 @@ +#if UNITY_2017_2_OR_NEWER + +using PlayFab.SharedModels; +using System; +using System.Collections; +using System.IO; +using UnityEngine; +using UnityEngine.Networking; + +namespace PlayFab.Internal +{ + public class PlayFabUnityHttp : ITransportPlugin + { + private bool _isInitialized = false; + private readonly int _pendingWwwMessages = 0; + + public bool IsInitialized { get { return _isInitialized; } } + + public void Initialize() { _isInitialized = true; } + + public void Update() { } + + public void OnDestroy() { } + + public void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("get", fullUrl, null, successCallback, errorCallback)); + } + + public void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("put", fullUrl, payload, successCallback, errorCallback)); + } + + public void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("post", fullUrl, payload, successCallback, errorCallback)); + } + + private static IEnumerator SimpleCallCoroutine(string method, string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + if (payload == null) + { + using (UnityWebRequest www = UnityWebRequest.Get(fullUrl)) + { +#if UNITY_2017_2_OR_NEWER + yield return www.SendWebRequest(); +#else + yield return www.Send(); +#endif + + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + successCallback(www.downloadHandler.data); + }; + } + else + { + + UnityWebRequest request; + if (method == "put") + { + request = UnityWebRequest.Put(fullUrl, payload); + } + else + { + request = new UnityWebRequest(fullUrl, "POST"); + request.uploadHandler = (UploadHandler)new UploadHandlerRaw(payload); + request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer(); + request.SetRequestHeader("Content-Type", "application/json"); + } + + +#if UNITY_2017_2_OR_NEWER +#if !UNITY_2019_1_OR_NEWER + request.chunkedTransfer = false; // can be removed after Unity's PUT will be more stable +#endif + yield return request.SendWebRequest(); +#else + yield return request.Send(); +#endif + +#if UNITY_2020_1_OR_NEWER + if (request.result == UnityWebRequest.Result.ConnectionError || request.result == UnityWebRequest.Result.ProtocolError) +#else + if (request.isNetworkError || request.isHttpError) +#endif + { + errorCallback(request.error); + } + else + { + successCallback(request.downloadHandler.data); + } + + request.Dispose(); + } + } + + public void MakeApiCall(object reqContainerObj) + { + CallRequestContainer reqContainer = (CallRequestContainer)reqContainerObj; + reqContainer.RequestHeaders["Content-Type"] = "application/json"; + + // Start the www corouting to Post, and get a response or error which is then passed to the callbacks. + PlayFabHttp.instance.StartCoroutine(Post(reqContainer)); + } + + private IEnumerator Post(CallRequestContainer reqContainer) + { +#if PLAYFAB_REQUEST_TIMING + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); + var startTime = DateTime.UtcNow; +#endif + + using var www = new UnityWebRequest(reqContainer.FullUrl) + { + uploadHandler = new UploadHandlerRaw(reqContainer.Payload), + downloadHandler = new DownloadHandlerBuffer(), + method = "POST" + }; + + foreach (var headerPair in reqContainer.RequestHeaders) + { + if (!string.IsNullOrEmpty(headerPair.Key) && !string.IsNullOrEmpty(headerPair.Value)) + www.SetRequestHeader(headerPair.Key, headerPair.Value); + else + Debug.LogWarning("Null header: " + headerPair.Key + " = " + headerPair.Value); + } + +#if UNITY_2017_2_OR_NEWER + yield return www.SendWebRequest(); +#else + yield return www.Send(); +#endif + +#if PLAYFAB_REQUEST_TIMING + stopwatch.Stop(); + var timing = new PlayFabHttp.RequestTiming { + StartTimeUtc = startTime, + ApiEndpoint = reqContainer.ApiEndpoint, + WorkerRequestMs = (int)stopwatch.ElapsedMilliseconds, + MainThreadRequestMs = (int)stopwatch.ElapsedMilliseconds + }; + PlayFabHttp.SendRequestTiming(timing); +#endif + + if (!string.IsNullOrEmpty(www.error)) + { + OnError(www.error, reqContainer); + } + else + { + try + { + byte[] responseBytes = www.downloadHandler.data; + string responseText = System.Text.Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length); + OnResponse(responseText, reqContainer); + } + catch (Exception e) + { + OnError("Unhandled error in PlayFabUnityHttp: " + e, reqContainer); + } + } + www.Dispose(); + } + + public int GetPendingMessages() + { + return _pendingWwwMessages; + } + + public void OnResponse(string response, CallRequestContainer reqContainer) + { + try + { +#if PLAYFAB_REQUEST_TIMING + var startTime = DateTime.UtcNow; +#endif + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var httpResult = serializer.DeserializeObject(response); + + if (httpResult.code == 200) + { + // We have a good response from the server + reqContainer.JsonResponse = serializer.SerializeObject(httpResult.data); + reqContainer.DeserializeResultJson(); + reqContainer.ApiResult.Request = reqContainer.ApiRequest; + reqContainer.ApiResult.CustomData = reqContainer.CustomData; + + PlayFabHttp.instance.OnPlayFabApiResult(reqContainer); +#if !DISABLE_PLAYFABCLIENT_API + PlayFabDeviceUtil.OnPlayFabLogin(reqContainer.ApiResult, reqContainer.settings, reqContainer.instanceApi); +#endif + try + { + PlayFabHttp.SendEvent(reqContainer.ApiEndpoint, reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); + } + catch (Exception e) + { + Debug.LogException(e); + } + + try + { + reqContainer.InvokeSuccessCallback(); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + else + { + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, response, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + public void OnError(string error, CallRequestContainer reqContainer) + { + reqContainer.JsonResponse = error; + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, reqContainer.JsonResponse, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + } + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta new file mode 100644 index 00000000..9d9a8f47 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabUnityHttp.cs.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: fdda21a9c6bb5c74d85422afab113b0f +timeCreated: 1512617003 +licenseType: Pro +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs new file mode 100644 index 00000000..42e37818 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs @@ -0,0 +1,219 @@ +#if !UNITY_2018_2_OR_NEWER // Unity has deprecated Www +using System; +using System.Collections; +using System.IO; +using PlayFab.Json; +using PlayFab.SharedModels; +using UnityEngine; +#if UNITY_5_4_OR_NEWER +using UnityEngine.Networking; +#else +using UnityEngine.Experimental.Networking; +#endif + +namespace PlayFab.Internal +{ + public class PlayFabWww : ITransportPlugin + { + private bool _isInitialized = false; + private int _pendingWwwMessages = 0; + + public bool IsInitialized { get { return _isInitialized; } } + + public void Initialize() + { + _isInitialized = true; + } + + public void Update() { } + public void OnDestroy() { } + + public void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("get", fullUrl, null, successCallback, errorCallback)); + } + + public void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("put", fullUrl, payload, successCallback, errorCallback)); + } + + public void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + PlayFabHttp.instance.StartCoroutine(SimpleCallCoroutine("post", fullUrl, payload, successCallback, errorCallback)); + } + + private static IEnumerator SimpleCallCoroutine(string method, string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + if (payload == null) + { + var www = new WWW(fullUrl); + yield return www; + if (!string.IsNullOrEmpty(www.error)) + errorCallback(www.error); + else + successCallback(www.bytes); + } + else + { + UnityWebRequest request; + if (method == "put") + { + request = UnityWebRequest.Put(fullUrl, payload); + } + else + { + var strPayload = System.Text.Encoding.UTF8.GetString(payload, 0, payload.Length); + request = UnityWebRequest.Post(fullUrl, strPayload); + } + +#if UNITY_2017_2_OR_NEWER + request.chunkedTransfer = false; // can be removed after Unity's PUT will be more stable + request.SendWebRequest(); +#else + request.Send(); +#endif + +#if !UNITY_WEBGL + while (request.uploadProgress < 1 || request.downloadProgress < 1) + { + yield return 1; + } +#else + while (!request.isDone) + { + yield return 1; + } +#endif + + if (!string.IsNullOrEmpty(request.error)) + errorCallback(request.error); + else + successCallback(request.downloadHandler.data); + } + } + + public void MakeApiCall(object reqContainerObj) + { + CallRequestContainer reqContainer = (CallRequestContainer)reqContainerObj; + reqContainer.RequestHeaders["Content-Type"] = "application/json"; + + //Debug.LogFormat("Posting {0} to Url: {1}", req.Trim(), url); + var www = new WWW(reqContainer.FullUrl, reqContainer.Payload, reqContainer.RequestHeaders); + +#if PLAYFAB_REQUEST_TIMING + var stopwatch = System.Diagnostics.Stopwatch.StartNew(); +#endif + + // Start the www corouting to Post, and get a response or error which is then passed to the callbacks. + Action wwwSuccessCallback = (response) => + { + try + { +#if PLAYFAB_REQUEST_TIMING + var startTime = DateTime.UtcNow; +#endif + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var httpResult = serializer.DeserializeObject(response); + + if (httpResult.code == 200) + { + // We have a good response from the server + reqContainer.JsonResponse = serializer.SerializeObject(httpResult.data); + reqContainer.DeserializeResultJson(); + reqContainer.ApiResult.Request = reqContainer.ApiRequest; + reqContainer.ApiResult.CustomData = reqContainer.CustomData; + + PlayFabHttp.instance.OnPlayFabApiResult(reqContainer); +#if !DISABLE_PLAYFABCLIENT_API + PlayFabDeviceUtil.OnPlayFabLogin(reqContainer.ApiResult, reqContainer.settings, reqContainer.instanceApi); +#endif + + try + { + PlayFabHttp.SendEvent(reqContainer.ApiEndpoint, reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); + } + catch (Exception e) + { + Debug.LogException(e); + } + +#if PLAYFAB_REQUEST_TIMING + stopwatch.Stop(); + var timing = new PlayFabHttp.RequestTiming { + StartTimeUtc = startTime, + ApiEndpoint = reqContainer.ApiEndpoint, + WorkerRequestMs = (int)stopwatch.ElapsedMilliseconds, + MainThreadRequestMs = (int)stopwatch.ElapsedMilliseconds + }; + PlayFabHttp.SendRequestTiming(timing); +#endif + try + { + reqContainer.InvokeSuccessCallback(); + } + catch (Exception e) + { + Debug.LogException(e); + } + } + else + { + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, response, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + } + }; + + Action wwwErrorCallback = (errorCb) => + { + reqContainer.JsonResponse = errorCb; + if (reqContainer.ErrorCallback != null) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, reqContainer.JsonResponse, reqContainer.CustomData); + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + reqContainer.ErrorCallback(reqContainer.Error); + } + }; + + PlayFabHttp.instance.StartCoroutine(PostPlayFabApiCall(www, wwwSuccessCallback, wwwErrorCallback)); + } + + private IEnumerator PostPlayFabApiCall(WWW www, Action wwwSuccessCallback, Action wwwErrorCallback) + { + yield return www; + if (!string.IsNullOrEmpty(www.error)) + { + wwwErrorCallback(www.error); + } + else + { + try + { + byte[] responseBytes = www.bytes; + string responseText = System.Text.Encoding.UTF8.GetString(responseBytes, 0, responseBytes.Length); + wwwSuccessCallback(responseText); + } + catch (Exception e) + { + wwwErrorCallback("Unhandled error in PlayFabWWW: " + e); + } + } + www.Dispose(); + } + + public int GetPendingMessages() + { + return _pendingWwwMessages; + } + } +} +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta new file mode 100644 index 00000000..6159d82f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWWW.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 71ae810a641b9644187c8824db5ff1fe +timeCreated: 1462745593 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs new file mode 100644 index 00000000..014774ce --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs @@ -0,0 +1,544 @@ +#if !UNITY_WSA && !UNITY_WP8 + +using System; +using UnityEngine; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Threading; +using PlayFab.SharedModels; +#if !DISABLE_PLAYFABCLIENT_API +using PlayFab.ClientModels; +#endif + +namespace PlayFab.Internal +{ + public class PlayFabWebRequest : ITransportPlugin + { + /// + /// Disable encryption certificate validation within PlayFabWebRequest using this request. + /// This is not generally recommended. + /// As of early 2018: + /// None of the built-in Unity mechanisms validate the certificate, using .Net 3.5 equivalent runtime + /// It is also not currently feasible to provide a single cross platform solution that will correctly validate a certificate. + /// The Risk: + /// All Unity HTTPS mechanisms are vulnerable to Man-In-The-Middle attacks. + /// The only more-secure option is to define a custom CustomCertValidationHook, specifically tailored to the platforms you support, + /// which validate the cert based on a list of trusted certificate providers. This list of providers must be able to update itself, as the + /// base certificates for those providers will also expire and need updating on a regular basis. + /// + public static void SkipCertificateValidation() + { + var rcvc = new System.Net.Security.RemoteCertificateValidationCallback(AcceptAllCertifications); //(sender, cert, chain, ssl) => true + ServicePointManager.ServerCertificateValidationCallback = rcvc; + certValidationSet = true; + } + + /// + /// Provide PlayFabWebRequest with a custom ServerCertificateValidationCallback which can be used to validate the PlayFab encryption certificate. + /// Please do not: + /// - Hard code the current PlayFab certificate information - The PlayFab certificate updates itself on a regular schedule, and your game will fail and require a republish to fix + /// - Hard code a list of static certificate authorities - Any single exported list of certificate authorities will become out of date, and have the same problem when the CA cert expires + /// Real solution: + /// - A mechanism where a valid certificate authority list can be securely downloaded and updated without republishing the client when existing certificates expire. + /// + public static System.Net.Security.RemoteCertificateValidationCallback CustomCertValidationHook + { + set + { + ServicePointManager.ServerCertificateValidationCallback = value; + certValidationSet = true; + } + } + + private static readonly Queue ResultQueueTransferThread = new Queue(); + private static readonly Queue ResultQueueMainThread = new Queue(); + private static readonly List ActiveRequests = new List(); + + private static bool certValidationSet = false; + private static Thread _requestQueueThread; + private static readonly object _ThreadLock = new object(); + private static readonly TimeSpan ThreadKillTimeout = TimeSpan.FromSeconds(60); + private static DateTime _threadKillTime = DateTime.UtcNow + ThreadKillTimeout; // Kill the thread after 1 minute of inactivity + private static bool _isApplicationPlaying; + private static int _activeCallCount; + + private static string _unityVersion; + + private bool _isInitialized = false; + + public bool IsInitialized { get { return _isInitialized; } } + + public void Initialize() + { + SetupCertificates(); + _isApplicationPlaying = true; + _unityVersion = Application.unityVersion; + _isInitialized = true; + } + + public void OnDestroy() + { + _isApplicationPlaying = false; + lock (ResultQueueTransferThread) + { + ResultQueueTransferThread.Clear(); + } + lock (ActiveRequests) + { + ActiveRequests.Clear(); + } + lock (_ThreadLock) + { + _requestQueueThread = null; + } + } + + private void SetupCertificates() + { + // These are performance Optimizations for HttpWebRequests. + ServicePointManager.DefaultConnectionLimit = 10; + ServicePointManager.Expect100Continue = false; + + if (!certValidationSet) + { + Debug.LogWarning("PlayFab API calls will likely fail because you have not set up a HttpWebRequest certificate validation mechanism"); + Debug.LogWarning("Please set a validation callback into PlayFab.Internal.PlayFabWebRequest.CustomCertValidationHook, or set PlayFab.Internal.PlayFabWebRequest.SkipCertificateValidation()"); + } + } + + /// + /// This disables certificate validation, if it's been activated by a customer via SkipCertificateValidation() + /// + private static bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certificate, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors) + { + return true; + } + + public void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback) + { + // This needs to be improved to use a decent thread-pool, but it can be improved invisibly later + var newThread = new Thread(() => SimpleHttpsWorker("GET", fullUrl, null, successCallback, errorCallback)); + newThread.Start(); + } + + public void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + // This needs to be improved to use a decent thread-pool, but it can be improved invisibly later + var newThread = new Thread(() => SimpleHttpsWorker("PUT", fullUrl, payload, successCallback, errorCallback)); + newThread.Start(); + } + + public void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + // This needs to be improved to use a decent thread-pool, but it can be improved invisibly later + var newThread = new Thread(() => SimpleHttpsWorker("POST", fullUrl, payload, successCallback, errorCallback)); + newThread.Start(); + } + + + private void SimpleHttpsWorker(string httpMethod, string fullUrl, byte[] payload, Action successCallback, Action errorCallback) + { + // This should also use a pooled HttpWebRequest object, but that too can be improved invisibly later + var httpRequest = (HttpWebRequest)WebRequest.Create(fullUrl); + httpRequest.UserAgent = "UnityEngine-Unity; Version: " + _unityVersion; + httpRequest.Method = httpMethod; + httpRequest.KeepAlive = PlayFabSettings.RequestKeepAlive; + httpRequest.Timeout = PlayFabSettings.RequestTimeout; + httpRequest.AllowWriteStreamBuffering = false; + httpRequest.ReadWriteTimeout = PlayFabSettings.RequestTimeout; + + if (payload != null) + { + httpRequest.ContentLength = payload.LongLength; + using (var stream = httpRequest.GetRequestStream()) + { + stream.Write(payload, 0, payload.Length); + } + } + + try + { + var response = httpRequest.GetResponse(); + byte[] output = null; + using (var responseStream = response.GetResponseStream()) + { + if (responseStream != null) + { + output = new byte[response.ContentLength]; + responseStream.Read(output, 0, output.Length); + } + } + successCallback(output); + } + catch (WebException webException) + { + try + { + using (var responseStream = webException.Response.GetResponseStream()) + { + if (responseStream != null) + using (var stream = new StreamReader(responseStream)) + errorCallback(stream.ReadToEnd()); + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + catch (Exception e) + { + Debug.LogException(e); + } + } + + public void MakeApiCall(object reqContainerObj) + { + CallRequestContainer reqContainer = (CallRequestContainer)reqContainerObj; + reqContainer.HttpState = HttpRequestState.Idle; + + lock (ActiveRequests) + { + ActiveRequests.Insert(0, reqContainer); + } + + ActivateThreadWorker(); + } + + private static void ActivateThreadWorker() + { + lock (_ThreadLock) + { + if (_requestQueueThread != null) + { + return; + } + _requestQueueThread = new Thread(WorkerThreadMainLoop); + _requestQueueThread.Start(); + } + } + + private static void WorkerThreadMainLoop() + { + try + { + bool active; + lock (_ThreadLock) + { + // Kill the thread after 1 minute of inactivity + _threadKillTime = DateTime.UtcNow + ThreadKillTimeout; + } + + List localActiveRequests = new List(); + do + { + //process active requests + lock (ActiveRequests) + { + localActiveRequests.AddRange(ActiveRequests); + ActiveRequests.Clear(); + _activeCallCount = localActiveRequests.Count; + } + + var activeCalls = localActiveRequests.Count; + for (var i = activeCalls - 1; i >= 0; i--) // We must iterate backwards, because we remove at index i in some cases + { + switch (localActiveRequests[i].HttpState) + { + case HttpRequestState.Error: + localActiveRequests.RemoveAt(i); break; + case HttpRequestState.Idle: + Post(localActiveRequests[i]); break; + case HttpRequestState.Sent: + if (!localActiveRequests[i].CalledGetResponse) { // Else we'll GetResponse try again next tick + localActiveRequests[i].HttpRequest.GetResponseAsync(); + localActiveRequests[i].CalledGetResponse = true; + } + else if (localActiveRequests[i].HttpRequest.HaveResponse) + ProcessHttpResponse(localActiveRequests[i]); + break; + case HttpRequestState.Received: + ProcessJsonResponse(localActiveRequests[i]); + localActiveRequests.RemoveAt(i); + break; + } + } + + #region Expire Thread. + // Check if we've been inactive + lock (_ThreadLock) + { + var now = DateTime.UtcNow; + if (activeCalls > 0 && _isApplicationPlaying) + { + // Still active, reset the _threadKillTime + _threadKillTime = now + ThreadKillTimeout; + } + // Kill the thread after 1 minute of inactivity + active = now <= _threadKillTime; + if (!active) + { + _requestQueueThread = null; + } + // This thread will be stopped, so null this now, inside lock (_threadLock) + } + #endregion + + Thread.Sleep(1); + } while (active); + + } + catch (Exception e) + { + Debug.LogException(e); + _requestQueueThread = null; + } + } + + private static void Post(CallRequestContainer reqContainer) + { + try + { + reqContainer.HttpRequest = (HttpWebRequest)WebRequest.Create(reqContainer.FullUrl); + reqContainer.HttpRequest.UserAgent = "UnityEngine-Unity; Version: " + _unityVersion; + reqContainer.HttpRequest.SendChunked = false; + // Prevents hitting a proxy if no proxy is available. TODO: Add support for proxy's. + reqContainer.HttpRequest.Proxy = null; + + foreach (var pair in reqContainer.RequestHeaders) + reqContainer.HttpRequest.Headers.Add(pair.Key, pair.Value); + + reqContainer.HttpRequest.ContentType = "application/json"; + reqContainer.HttpRequest.Method = "POST"; + reqContainer.HttpRequest.KeepAlive = PlayFabSettings.RequestKeepAlive; + reqContainer.HttpRequest.Timeout = PlayFabSettings.RequestTimeout; + reqContainer.HttpRequest.AllowWriteStreamBuffering = false; + reqContainer.HttpRequest.Proxy = null; + reqContainer.HttpRequest.ContentLength = reqContainer.Payload.LongLength; + reqContainer.HttpRequest.ReadWriteTimeout = PlayFabSettings.RequestTimeout; + + //Debug.Log("Get Stream"); + // Get Request Stream and send data in the body. + using (var stream = reqContainer.HttpRequest.GetRequestStream()) + { + //Debug.Log("Post Stream"); + stream.Write(reqContainer.Payload, 0, reqContainer.Payload.Length); + //Debug.Log("After Post stream"); + } + + reqContainer.HttpState = HttpRequestState.Sent; + } + catch (WebException e) + { + reqContainer.JsonResponse = ResponseToString(e.Response) ?? e.Status + ": WebException making http request to: " + reqContainer.FullUrl; + var enhancedError = new WebException(reqContainer.JsonResponse, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + catch (Exception e) + { + reqContainer.JsonResponse = "Unhandled exception in Post : " + reqContainer.FullUrl; + var enhancedError = new Exception(reqContainer.JsonResponse, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + } + + private static void ProcessHttpResponse(CallRequestContainer reqContainer) + { + try + { +#if PLAYFAB_REQUEST_TIMING + reqContainer.Timing.WorkerRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; +#endif + // Get and check the response + var httpResponse = (HttpWebResponse)reqContainer.HttpRequest.GetResponse(); + if (httpResponse.StatusCode == HttpStatusCode.OK) + { + reqContainer.JsonResponse = ResponseToString(httpResponse); + } + + if (httpResponse.StatusCode != HttpStatusCode.OK || string.IsNullOrEmpty(reqContainer.JsonResponse)) + { + reqContainer.JsonResponse = reqContainer.JsonResponse ?? "No response from server"; + QueueRequestError(reqContainer); + return; + } + else + { + // Response Recieved Successfully, now process. + } + + reqContainer.HttpState = HttpRequestState.Received; + } + catch (Exception e) + { + var msg = "Unhandled exception in ProcessHttpResponse : " + reqContainer.FullUrl; + reqContainer.JsonResponse = reqContainer.JsonResponse ?? msg; + var enhancedError = new Exception(msg, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + } + + /// + /// Set the reqContainer into an error state, and queue it to invoke the ErrorCallback for that request + /// + private static void QueueRequestError(CallRequestContainer reqContainer) + { + reqContainer.Error = PlayFabHttp.GeneratePlayFabError(reqContainer.ApiEndpoint, reqContainer.JsonResponse, reqContainer.CustomData); // Decode the server-json error + reqContainer.HttpState = HttpRequestState.Error; + lock (ResultQueueTransferThread) + { + //Queue The result callbacks to run on the main thread. + ResultQueueTransferThread.Enqueue(() => + { + PlayFabHttp.SendErrorEvent(reqContainer.ApiRequest, reqContainer.Error); + if (reqContainer.ErrorCallback != null) + reqContainer.ErrorCallback(reqContainer.Error); + }); + } + } + + private static void ProcessJsonResponse(CallRequestContainer reqContainer) + { + try + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var httpResult = serializer.DeserializeObject(reqContainer.JsonResponse); + +#if PLAYFAB_REQUEST_TIMING + reqContainer.Timing.WorkerRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; +#endif + + //This would happen if playfab returned a 500 internal server error or a bad json response. + if (httpResult == null || httpResult.code != 200) + { + QueueRequestError(reqContainer); + return; + } + + reqContainer.JsonResponse = serializer.SerializeObject(httpResult.data); + reqContainer.DeserializeResultJson(); // Assigns Result with a properly typed object + reqContainer.ApiResult.Request = reqContainer.ApiRequest; + reqContainer.ApiResult.CustomData = reqContainer.CustomData; + + if(_isApplicationPlaying) + { + PlayFabHttp.instance.OnPlayFabApiResult(reqContainer); + } + +#if !DISABLE_PLAYFABCLIENT_API + lock (ResultQueueTransferThread) + { + ResultQueueTransferThread.Enqueue(() => { PlayFabDeviceUtil.OnPlayFabLogin(reqContainer.ApiResult, reqContainer.settings, reqContainer.instanceApi); }); + } +#endif + lock (ResultQueueTransferThread) + { + //Queue The result callbacks to run on the main thread. + ResultQueueTransferThread.Enqueue(() => + { +#if PLAYFAB_REQUEST_TIMING + reqContainer.Stopwatch.Stop(); + reqContainer.Timing.MainThreadRequestMs = (int)reqContainer.Stopwatch.ElapsedMilliseconds; + PlayFabHttp.SendRequestTiming(reqContainer.Timing); +#endif + try + { + PlayFabHttp.SendEvent(reqContainer.ApiEndpoint, reqContainer.ApiRequest, reqContainer.ApiResult, ApiProcessingEventType.Post); + reqContainer.InvokeSuccessCallback(); + } + catch (Exception e) + { + Debug.LogException(e); // Log the user's callback exception back to them without halting PlayFabHttp + } + }); + } + } + catch (Exception e) + { + var msg = "Unhandled exception in ProcessJsonResponse : " + reqContainer.FullUrl; + reqContainer.JsonResponse = reqContainer.JsonResponse ?? msg; + var enhancedError = new Exception(msg, e); + Debug.LogException(enhancedError); + QueueRequestError(reqContainer); + } + } + + public void Update() + { + lock (ResultQueueTransferThread) + { + while (ResultQueueTransferThread.Count > 0) + { + var actionToQueue = ResultQueueTransferThread.Dequeue(); + ResultQueueMainThread.Enqueue(actionToQueue); + } + } + + while (ResultQueueMainThread.Count > 0) + { + var finishedRequest = ResultQueueMainThread.Dequeue(); + finishedRequest(); + } + } + + private static string ResponseToString(WebResponse webResponse) + { + if (webResponse == null) + return null; + + try + { + using (var responseStream = webResponse.GetResponseStream()) + { + if (responseStream == null) + return null; + using (var stream = new StreamReader(responseStream)) + { + return stream.ReadToEnd(); + } + } + } + catch (WebException webException) + { + try + { + using (var responseStream = webException.Response.GetResponseStream()) + { + if (responseStream == null) + return null; + using (var stream = new StreamReader(responseStream)) + { + return stream.ReadToEnd(); + } + } + } + catch (Exception e) + { + Debug.LogException(e); + return null; + } + } + catch (Exception e) + { + Debug.LogException(e); + return null; + } + } + + public int GetPendingMessages() + { + var count = 0; + lock (ActiveRequests) + count += ActiveRequests.Count + _activeCallCount; + lock (ResultQueueTransferThread) + count += ResultQueueTransferThread.Count; + return count; + } + } +} + +#endif diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta new file mode 100644 index 00000000..3ebab9de --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/PlayFabHttp/PlayFabWebRequest.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 18fd1a0daadd68d45aebf8c19cac2bda +timeCreated: 1466016486 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs new file mode 100644 index 00000000..52486e69 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs @@ -0,0 +1,2081 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) 2011, The Outercurve Foundation. +// +// Licensed under the MIT License (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.opensource.org/licenses/mit-license.php +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// Nathan Totten (ntotten.com), Jim Zimmerman (jimzimmerman.com) and Prabir Shrestha (prabir.me) +// https://github.com/facebook-csharp-sdk/simple-json +//----------------------------------------------------------------------- + +// VERSION: + +// NOTE: uncomment the following line to make SimpleJson class internal. +//#define SIMPLE_JSON_INTERNAL + +// NOTE: uncomment the following line to make JsonArray and JsonObject class internal. +//#define SIMPLE_JSON_OBJARRAYINTERNAL + +// NOTE: uncomment the following line to enable dynamic support. +//#define SIMPLE_JSON_DYNAMIC + +// NOTE: uncomment the following line to enable DataContract support. +//#define SIMPLE_JSON_DATACONTRACT + +// NOTE: uncomment the following line to enable IReadOnlyCollection and IReadOnlyList support. +//#define SIMPLE_JSON_READONLY_COLLECTIONS + +// NOTE: uncomment the following line if you are compiling under Windows Store app/library. +// usually already defined in properties +#if UNITY_WSA && UNITY_WP8 +#define NETFX_CORE +#endif + +// If you are targetting WinStore, WP8 and NET4.5+ PCL make sure to +#if UNITY_WP8 || UNITY_WP8_1 || UNITY_WSA +// #define SIMPLE_JSON_TYPEINFO +#endif + +// original json parsing code from http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + +#if NETFX_CORE +#define SIMPLE_JSON_TYPEINFO +#endif + +using System; +using System.CodeDom.Compiler; +using System.Collections; +using System.Collections.Generic; +using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; +#if SIMPLE_JSON_DYNAMIC +using System.Dynamic; +#endif +using System.Globalization; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; +using System.Text; + +// ReSharper disable LoopCanBeConvertedToQuery +// ReSharper disable RedundantExplicitArrayCreation +// ReSharper disable SuggestUseVarKeywordEvident +namespace PlayFab.Json +{ + public enum NullValueHandling + { + Include, // Include null values when serializing and deserializing objects + Ignore // Ignore null values when serializing and deserializing objects + } + + /// + /// Customize the json output of a field or property + /// + [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] + public class JsonProperty : Attribute + { + public string PropertyName = null; + public NullValueHandling NullValueHandling = NullValueHandling.Include; + } + + /// + /// Represents the json array. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonArray : List + { + /// + /// Initializes a new instance of the class. + /// + public JsonArray() { } + + /// + /// Initializes a new instance of the class. + /// + /// The capacity of the json array. + public JsonArray(int capacity) : base(capacity) { } + + /// + /// The json representation of the array. + /// + /// The json representation of the array. + public override string ToString() + { + return PlayFabSimpleJson.SerializeObject(this) ?? string.Empty; + } + } + + /// + /// Represents the json object. + /// + [GeneratedCode("simple-json", "1.0.0")] + [EditorBrowsable(EditorBrowsableState.Never)] + [SuppressMessage("Microsoft.Naming", "CA1710:IdentifiersShouldHaveCorrectSuffix")] +#if SIMPLE_JSON_OBJARRAYINTERNAL + internal +#else + public +#endif + class JsonObject : +#if SIMPLE_JSON_DYNAMIC + DynamicObject, +#endif + IDictionary + { + private const int DICTIONARY_DEFAULT_SIZE = 16; + /// + /// The internal member dictionary. + /// + private readonly Dictionary _members; + + /// + /// Initializes a new instance of . + /// + public JsonObject() + { + _members = new Dictionary(DICTIONARY_DEFAULT_SIZE); + } + + /// + /// Initializes a new instance of . + /// + /// The implementation to use when comparing keys, or null to use the default for the type of the key. + public JsonObject(IEqualityComparer comparer) + { + _members = new Dictionary(comparer); + } + + /// + /// Gets the at the specified index. + /// + /// + public object this[int index] + { + get { return GetAtIndex(_members, index); } + } + + internal static object GetAtIndex(IDictionary obj, int index) + { + if (obj == null) + throw new ArgumentNullException("obj"); + if (index >= obj.Count) + throw new ArgumentOutOfRangeException("index"); + int i = 0; + foreach (KeyValuePair o in obj) + if (i++ == index) return o.Value; + return null; + } + + /// + /// Adds the specified key. + /// + /// The key. + /// The value. + public void Add(string key, object value) + { + _members.Add(key, value); + } + + /// + /// Determines whether the specified key contains key. + /// + /// The key. + /// + /// true if the specified key contains key; otherwise, false. + /// + public bool ContainsKey(string key) + { + return _members.ContainsKey(key); + } + + /// + /// Gets the keys. + /// + /// The keys. + public ICollection Keys + { + get { return _members.Keys; } + } + + /// + /// Removes the specified key. + /// + /// The key. + /// + public bool Remove(string key) + { + return _members.Remove(key); + } + + /// + /// Tries the get value. + /// + /// The key. + /// The value. + /// + public bool TryGetValue(string key, out object value) + { + return _members.TryGetValue(key, out value); + } + + /// + /// Gets the values. + /// + /// The values. + public ICollection Values + { + get { return _members.Values; } + } + + /// + /// Gets or sets the with the specified key. + /// + /// + public object this[string key] + { + get { return _members[key]; } + set { _members[key] = value; } + } + + /// + /// Adds the specified item. + /// + /// The item. + public void Add(KeyValuePair item) + { + _members.Add(item.Key, item.Value); + } + + /// + /// Clears this instance. + /// + public void Clear() + { + _members.Clear(); + } + + /// + /// Determines whether [contains] [the specified item]. + /// + /// The item. + /// + /// true if [contains] [the specified item]; otherwise, false. + /// + public bool Contains(KeyValuePair item) + { + object value; + return _members.TryGetValue(item.Key, out value) && value == item.Value; + } + + /// + /// Copies to. + /// + /// The array. + /// Index of the array. + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (array == null) throw new ArgumentNullException("array"); + int num = Count; + foreach (KeyValuePair kvp in _members) + { + array[arrayIndex++] = kvp; + if (--num <= 0) + return; + } + } + + /// + /// Gets the count. + /// + /// The count. + public int Count + { + get { return _members.Count; } + } + + /// + /// Gets a value indicating whether this instance is read only. + /// + /// + /// true if this instance is read only; otherwise, false. + /// + public bool IsReadOnly + { + get { return false; } + } + + /// + /// Removes the specified item. + /// + /// The item. + /// + public bool Remove(KeyValuePair item) + { + return _members.Remove(item.Key); + } + + /// + /// Gets the enumerator. + /// + /// + public IEnumerator> GetEnumerator() + { + return _members.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + return _members.GetEnumerator(); + } + + /// + /// Returns a json that represents the current . + /// + /// + /// A json that represents the current . + /// + public override string ToString() + { + return PlayFabSimpleJson.SerializeObject(_members); + } + +#if SIMPLE_JSON_DYNAMIC + /// + /// Provides implementation for type conversion operations. Classes derived from the class can override this method to specify dynamic behavior for operations that convert an object from one type to another. + /// + /// Provides information about the conversion operation. The binder.Type property provides the type to which the object must be converted. For example, for the statement (String)sampleObject in C# (CType(sampleObject, Type) in Visual Basic), where sampleObject is an instance of the class derived from the class, binder.Type returns the type. The binder.Explicit property provides information about the kind of conversion that occurs. It returns true for explicit conversion and false for implicit conversion. + /// The result of the type conversion operation. + /// + /// Alwasy returns true. + /// + public override bool TryConvert(ConvertBinder binder, out object result) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + Type targetType = binder.Type; + + if ((targetType == typeof(IEnumerable)) || + (targetType == typeof(IEnumerable>)) || + (targetType == typeof(IDictionary)) || + (targetType == typeof(IDictionary))) + { + result = this; + return true; + } + + return base.TryConvert(binder, out result); + } + + /// + /// Provides the implementation for operations that delete an object member. This method is not intended for use in C# or Visual Basic. + /// + /// Provides information about the deletion. + /// + /// Alwasy returns true. + /// + public override bool TryDeleteMember(DeleteMemberBinder binder) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + return _members.Remove(binder.Name); + } + + /// + /// Provides the implementation for operations that get a value by index. Classes derived from the class can override this method to specify dynamic behavior for indexing operations. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] operation in C# (sampleObject(3) in Visual Basic), where sampleObject is derived from the DynamicObject class, is equal to 3. + /// The result of the index operation. + /// + /// Alwasy returns true. + /// + public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + result = ((IDictionary)this)[(string)indexes[0]]; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that get member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as getting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member on which the dynamic operation is performed. For example, for the Console.WriteLine(sampleObject.SampleProperty) statement, where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The result of the get operation. For example, if the method is called for a property, you can assign the property value to . + /// + /// Alwasy returns true. + /// + public override bool TryGetMember(GetMemberBinder binder, out object result) + { + object value; + if (_members.TryGetValue(binder.Name, out value)) + { + result = value; + return true; + } + result = null; + return true; + } + + /// + /// Provides the implementation for operations that set a value by index. Classes derived from the class can override this method to specify dynamic behavior for operations that access objects by a specified index. + /// + /// Provides information about the operation. + /// The indexes that are used in the operation. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 3. + /// The value to set to the object that has the specified index. For example, for the sampleObject[3] = 10 operation in C# (sampleObject(3) = 10 in Visual Basic), where sampleObject is derived from the class, is equal to 10. + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown. + /// + public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value) + { + if (indexes == null) throw new ArgumentNullException("indexes"); + if (indexes.Length == 1) + { + ((IDictionary)this)[(string)indexes[0]] = value; + return true; + } + return base.TrySetIndex(binder, indexes, value); + } + + /// + /// Provides the implementation for operations that set member values. Classes derived from the class can override this method to specify dynamic behavior for operations such as setting a value for a property. + /// + /// Provides information about the object that called the dynamic operation. The binder.Name property provides the name of the member to which the value is being assigned. For example, for the statement sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, binder.Name returns "SampleProperty". The binder.IgnoreCase property specifies whether the member name is case-sensitive. + /// The value to set to the member. For example, for sampleObject.SampleProperty = "Test", where sampleObject is an instance of the class derived from the class, the is "Test". + /// + /// true if the operation is successful; otherwise, false. If this method returns false, the run-time binder of the language determines the behavior. (In most cases, a language-specific run-time exception is thrown.) + /// + public override bool TrySetMember(SetMemberBinder binder, object value) + { + // + if (binder == null) + throw new ArgumentNullException("binder"); + // + _members[binder.Name] = value; + return true; + } + + /// + /// Returns the enumeration of all dynamic member names. + /// + /// + /// A sequence that contains dynamic member names. + /// + public override IEnumerable GetDynamicMemberNames() + { + foreach (var key in Keys) + yield return key; + } +#endif + } + + /// + /// Private. Do not call from client code. + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes JsonArray(IList<object>) and JsonObject(IDictionary<string,object>). + /// All numbers are parsed to doubles. + /// + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + static class PlayFabSimpleJson + { + private enum TokenType : byte + { + NONE = 0, + CURLY_OPEN = 1, + CURLY_CLOSE = 2, + SQUARED_OPEN = 3, + SQUARED_CLOSE = 4, + COLON = 5, + COMMA = 6, + STRING = 7, + NUMBER = 8, + TRUE = 9, + FALSE = 10, + NULL = 11, + } + private const int BUILDER_INIT = 2000; + + private static readonly char[] EscapeTable; + private static readonly char[] EscapeCharacters = new char[] { '"', '\\', '\b', '\f', '\n', '\r', '\t' }; + // private static readonly string EscapeCharactersString = new string(EscapeCharacters); + internal static readonly List NumberTypes = new List { + typeof(bool), typeof(byte), typeof(ushort), typeof(uint), typeof(ulong), typeof(sbyte), typeof(short), typeof(int), typeof(long), typeof(double), typeof(float), typeof(decimal) + }; + + // Performance stuff + [ThreadStatic] + private static StringBuilder _serializeObjectBuilder; + [ThreadStatic] + private static StringBuilder _parseStringBuilder; + + static PlayFabSimpleJson() + { + EscapeTable = new char[93]; + EscapeTable['"'] = '"'; + EscapeTable['\\'] = '\\'; + EscapeTable['\b'] = 'b'; + EscapeTable['\f'] = 'f'; + EscapeTable['\n'] = 'n'; + EscapeTable['\r'] = 'r'; + EscapeTable['\t'] = 't'; + } + + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An IList<object>, a IDictionary<string,object>, a double, a string, null, true, or false + public static object DeserializeObject(string json) + { + object obj; + if (TryDeserializeObject(json, out obj)) + return obj; + throw new SerializationException("Invalid JSON string"); + } + + /// + /// Try parsing the json string into a value. + /// + /// + /// A JSON string. + /// + /// + /// The object. + /// + /// + /// Returns true if successfull otherwise false. + /// + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + public static bool TryDeserializeObject(string json, out object obj) + { + bool success = true; + if (json != null) + { + int index = 0; + obj = ParseValue(json, ref index, ref success); + } + else + obj = null; + + return success; + } + + public static object DeserializeObject(string json, Type type, IJsonSerializerStrategy jsonSerializerStrategy = null) + { + object jsonObject = DeserializeObject(json); + if (type == null || jsonObject != null && ReflectionUtils.IsAssignableFrom(jsonObject.GetType(), type)) + return jsonObject; + return (jsonSerializerStrategy ?? CurrentJsonSerializerStrategy).DeserializeObject(jsonObject, type); + } + + public static T DeserializeObject(string json, IJsonSerializerStrategy jsonSerializerStrategy = null) + { + return (T)DeserializeObject(json, typeof(T), jsonSerializerStrategy); + } + + /// + /// Converts a IDictionary<string,object> / IList<object> object into a JSON string + /// + /// A IDictionary<string,object> / IList<object> + /// Serializer strategy to use + /// A JSON encoded string, or null if object 'json' is not serializable + public static string SerializeObject(object json, IJsonSerializerStrategy jsonSerializerStrategy = null) + { + if (_serializeObjectBuilder == null) + _serializeObjectBuilder = new StringBuilder(BUILDER_INIT); + _serializeObjectBuilder.Length = 0; + + if (jsonSerializerStrategy == null) + jsonSerializerStrategy = CurrentJsonSerializerStrategy; + + bool success = SerializeValue(jsonSerializerStrategy, json, _serializeObjectBuilder); + return (success ? _serializeObjectBuilder.ToString() : null); + } + + public static string EscapeToJavascriptString(string jsonString) + { + if (string.IsNullOrEmpty(jsonString)) + return jsonString; + + StringBuilder sb = new StringBuilder(); + char c; + + for (int i = 0; i < jsonString.Length;) + { + c = jsonString[i++]; + + if (c == '\\') + { + int remainingLength = jsonString.Length - i; + if (remainingLength >= 2) + { + char lookahead = jsonString[i]; + if (lookahead == '\\') + { + sb.Append('\\'); + ++i; + } + else if (lookahead == '"') + { + sb.Append("\""); + ++i; + } + else if (lookahead == 't') + { + sb.Append('\t'); + ++i; + } + else if (lookahead == 'b') + { + sb.Append('\b'); + ++i; + } + else if (lookahead == 'n') + { + sb.Append('\n'); + ++i; + } + else if (lookahead == 'r') + { + sb.Append('\r'); + ++i; + } + } + } + else + { + sb.Append(c); + } + } + return sb.ToString(); + } + + static IDictionary ParseObject(string json, ref int index, ref bool success) + { + IDictionary table = new JsonObject(); + TokenType token; + + // { + NextToken(json, ref index); + + bool done = false; + while (!done) + { + token = LookAhead(json, index); + if (token == TokenType.NONE) + { + success = false; + return null; + } + else if (token == TokenType.COMMA) + NextToken(json, ref index); + else if (token == TokenType.CURLY_CLOSE) + { + NextToken(json, ref index); + return table; + } + else + { + // name + string name = ParseString(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + // : + token = NextToken(json, ref index); + if (token != TokenType.COLON) + { + success = false; + return null; + } + // value + object value = ParseValue(json, ref index, ref success); + if (!success) + { + success = false; + return null; + } + table[name] = value; + } + } + return table; + } + + static JsonArray ParseArray(string json, ref int index, ref bool success) + { + JsonArray array = new JsonArray(); + + // [ + NextToken(json, ref index); + + bool done = false; + while (!done) + { + TokenType token = LookAhead(json, index); + if (token == TokenType.NONE) + { + success = false; + return null; + } + else if (token == TokenType.COMMA) + NextToken(json, ref index); + else if (token == TokenType.SQUARED_CLOSE) + { + NextToken(json, ref index); + break; + } + else + { + object value = ParseValue(json, ref index, ref success); + if (!success) + return null; + array.Add(value); + } + } + return array; + } + + static object ParseValue(string json, ref int index, ref bool success) + { + switch (LookAhead(json, index)) + { + case TokenType.STRING: + return ParseString(json, ref index, ref success); + case TokenType.NUMBER: + return ParseNumber(json, ref index, ref success); + case TokenType.CURLY_OPEN: + return ParseObject(json, ref index, ref success); + case TokenType.SQUARED_OPEN: + return ParseArray(json, ref index, ref success); + case TokenType.TRUE: + NextToken(json, ref index); + return true; + case TokenType.FALSE: + NextToken(json, ref index); + return false; + case TokenType.NULL: + NextToken(json, ref index); + return null; + case TokenType.NONE: + break; + } + success = false; + return null; + } + + static string ParseString(string json, ref int index, ref bool success) + { + if (_parseStringBuilder == null) + _parseStringBuilder = new StringBuilder(BUILDER_INIT); + _parseStringBuilder.Length = 0; + + EatWhitespace(json, ref index); + + // " + char c = json[index++]; + bool complete = false; + while (!complete) + { + if (index == json.Length) + break; + + c = json[index++]; + if (c == '"') + { + complete = true; + break; + } + else if (c == '\\') + { + if (index == json.Length) + break; + c = json[index++]; + if (c == '"') + _parseStringBuilder.Append('"'); + else if (c == '\\') + _parseStringBuilder.Append('\\'); + else if (c == '/') + _parseStringBuilder.Append('/'); + else if (c == 'b') + _parseStringBuilder.Append('\b'); + else if (c == 'f') + _parseStringBuilder.Append('\f'); + else if (c == 'n') + _parseStringBuilder.Append('\n'); + else if (c == 'r') + _parseStringBuilder.Append('\r'); + else if (c == 't') + _parseStringBuilder.Append('\t'); + else if (c == 'u') + { + int remainingLength = json.Length - index; + if (remainingLength >= 4) + { + // parse the 32 bit hex into an integer codepoint + uint codePoint; + if (!(success = UInt32.TryParse(json.Substring(index, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out codePoint))) + return ""; + + // convert the integer codepoint to a unicode char and add to string + if (0xD800 <= codePoint && codePoint <= 0xDBFF) // if high surrogate + { + index += 4; // skip 4 chars + remainingLength = json.Length - index; + if (remainingLength >= 6) + { + uint lowCodePoint; + if (json.Substring(index, 2) == "\\u" && UInt32.TryParse(json.Substring(index + 2, 4), NumberStyles.HexNumber, CultureInfo.InvariantCulture, out lowCodePoint)) + { + if (0xDC00 <= lowCodePoint && lowCodePoint <= 0xDFFF) // if low surrogate + { + _parseStringBuilder.Append((char)codePoint); + _parseStringBuilder.Append((char)lowCodePoint); + index += 6; // skip 6 chars + continue; + } + } + } + success = false; // invalid surrogate pair + return ""; + } + _parseStringBuilder.Append(ConvertFromUtf32((int)codePoint)); + // skip 4 chars + index += 4; + } + else + break; + } + } + else + _parseStringBuilder.Append(c); + } + if (!complete) + { + success = false; + return null; + } + return _parseStringBuilder.ToString(); + } + + private static string ConvertFromUtf32(int utf32) + { + // http://www.java2s.com/Open-Source/CSharp/2.6.4-mono-.net-core/System/System/Char.cs.htm + if (utf32 < 0 || utf32 > 0x10FFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must be from 0 to 0x10FFFF."); + if (0xD800 <= utf32 && utf32 <= 0xDFFF) + throw new ArgumentOutOfRangeException("utf32", "The argument must not be in surrogate pair range."); + if (utf32 < 0x10000) + return new string((char)utf32, 1); + utf32 -= 0x10000; + return new string(new char[] { (char)((utf32 >> 10) + 0xD800), (char)(utf32 % 0x0400 + 0xDC00) }); + } + + static object ParseNumber(string json, ref int index, ref bool success) + { + EatWhitespace(json, ref index); + int lastIndex = GetLastIndexOfNumber(json, index); + int charLength = (lastIndex - index) + 1; + object returnNumber; + string str = json.Substring(index, charLength); + if (str.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || str.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1) + { + double number; + success = double.TryParse(json.Substring(index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else if (str.IndexOf("-", StringComparison.OrdinalIgnoreCase) == -1) + { + ulong number; + success = ulong.TryParse(json.Substring(index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + else + { + long number; + success = long.TryParse(json.Substring(index, charLength), NumberStyles.Any, CultureInfo.InvariantCulture, out number); + returnNumber = number; + } + index = lastIndex + 1; + return returnNumber; + } + + static int GetLastIndexOfNumber(string json, int index) + { + int lastIndex; + for (lastIndex = index; lastIndex < json.Length; lastIndex++) + if ("0123456789+-.eE".IndexOf(json[lastIndex]) == -1) break; + return lastIndex - 1; + } + + static void EatWhitespace(string json, ref int index) + { + for (; index < json.Length; index++) + if (" \t\n\r\b\f".IndexOf(json[index]) == -1) break; + } + + static TokenType LookAhead(string json, int index) + { + int saveIndex = index; + return NextToken(json, ref saveIndex); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + static TokenType NextToken(string json, ref int index) + { + EatWhitespace(json, ref index); + if (index == json.Length) + return TokenType.NONE; + char c = json[index]; + index++; + switch (c) + { + case '{': + return TokenType.CURLY_OPEN; + case '}': + return TokenType.CURLY_CLOSE; + case '[': + return TokenType.SQUARED_OPEN; + case ']': + return TokenType.SQUARED_CLOSE; + case ',': + return TokenType.COMMA; + case '"': + return TokenType.STRING; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TokenType.NUMBER; + case ':': + return TokenType.COLON; + } + index--; + int remainingLength = json.Length - index; + // false + if (remainingLength >= 5) + { + if (json[index] == 'f' && json[index + 1] == 'a' && json[index + 2] == 'l' && json[index + 3] == 's' && json[index + 4] == 'e') + { + index += 5; + return TokenType.FALSE; + } + } + // true + if (remainingLength >= 4) + { + if (json[index] == 't' && json[index + 1] == 'r' && json[index + 2] == 'u' && json[index + 3] == 'e') + { + index += 4; + return TokenType.TRUE; + } + } + // null + if (remainingLength >= 4) + { + if (json[index] == 'n' && json[index + 1] == 'u' && json[index + 2] == 'l' && json[index + 3] == 'l') + { + index += 4; + return TokenType.NULL; + } + } + return TokenType.NONE; + } + + static bool SerializeValue(IJsonSerializerStrategy jsonSerializerStrategy, object value, StringBuilder builder) + { + bool success = true; + string stringValue = value as string; + if (value == null) + builder.Append("null"); + else if (stringValue != null) + success = SerializeString(stringValue, builder); + else + { + IDictionary dict = value as IDictionary; + Type type = value.GetType(); + Type[] genArgs = ReflectionUtils.GetGenericTypeArguments(type); + var isStringKeyDictionary = type.GetTypeInfo().IsGenericType && type.GetGenericTypeDefinition() == typeof(Dictionary<,>) && genArgs[0] == typeof(string); + if (isStringKeyDictionary) + { + var strDictValue = value as IDictionary; + success = SerializeObject(jsonSerializerStrategy, strDictValue.Keys, strDictValue.Values, builder); + } + else if (dict != null) + { + success = SerializeObject(jsonSerializerStrategy, dict.Keys, dict.Values, builder); + } + else + { + IDictionary stringDictionary = value as IDictionary; + if (stringDictionary != null) + { + success = SerializeObject(jsonSerializerStrategy, stringDictionary.Keys, stringDictionary.Values, builder); + } + else + { + IEnumerable enumerableValue = value as IEnumerable; + if (enumerableValue != null) + success = SerializeArray(jsonSerializerStrategy, enumerableValue, builder); + else if (IsNumeric(value)) + success = SerializeNumber(value, builder); + else if (value is bool) + builder.Append((bool)value ? "true" : "false"); + else + { + object serializedObject; + success = jsonSerializerStrategy.TrySerializeNonPrimitiveObject(value, out serializedObject); + if (success) + SerializeValue(jsonSerializerStrategy, serializedObject, builder); + } + } + } + } + return success; + } + + static bool SerializeObject(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable keys, IEnumerable values, StringBuilder builder) + { + builder.Append("{"); + IEnumerator ke = keys.GetEnumerator(); + IEnumerator ve = values.GetEnumerator(); + bool first = true; + while (ke.MoveNext() && ve.MoveNext()) + { + object key = ke.Current; + object value = ve.Current; + if (!first) + builder.Append(","); + string stringKey = key as string; + if (stringKey != null) + SerializeString(stringKey, builder); + else + if (!SerializeValue(jsonSerializerStrategy, value, builder)) return false; + builder.Append(":"); + if (!SerializeValue(jsonSerializerStrategy, value, builder)) + return false; + first = false; + } + builder.Append("}"); + return true; + } + + static bool SerializeArray(IJsonSerializerStrategy jsonSerializerStrategy, IEnumerable anArray, StringBuilder builder) + { + builder.Append("["); + bool first = true; + foreach (object value in anArray) + { + if (!first) + builder.Append(","); + if (!SerializeValue(jsonSerializerStrategy, value, builder)) + return false; + first = false; + } + builder.Append("]"); + return true; + } + + static bool SerializeString(string aString, StringBuilder builder) + { + // Happy path if there's nothing to be escaped. IndexOfAny is highly optimized (and unmanaged) + if (aString.IndexOfAny(EscapeCharacters) == -1) + { + builder.Append('"'); + builder.Append(aString); + builder.Append('"'); + + return true; + } + + builder.Append('"'); + int safeCharacterCount = 0; + char[] charArray = aString.ToCharArray(); + + for (int i = 0; i < charArray.Length; i++) + { + char c = charArray[i]; + + // Non ascii characters are fine, buffer them up and send them to the builder + // in larger chunks if possible. The escape table is a 1:1 translation table + // with \0 [default(char)] denoting a safe character. + if (c >= EscapeTable.Length || EscapeTable[c] == default(char)) + { + safeCharacterCount++; + } + else + { + if (safeCharacterCount > 0) + { + builder.Append(charArray, i - safeCharacterCount, safeCharacterCount); + safeCharacterCount = 0; + } + + builder.Append('\\'); + builder.Append(EscapeTable[c]); + } + } + + if (safeCharacterCount > 0) + { + builder.Append(charArray, charArray.Length - safeCharacterCount, safeCharacterCount); + } + + builder.Append('"'); + return true; + } + + static bool SerializeNumber(object number, StringBuilder builder) + { + if (number is decimal) + builder.Append(((decimal)number).ToString("R", CultureInfo.InvariantCulture)); + else if (number is double) + builder.Append(((double)number).ToString("R", CultureInfo.InvariantCulture)); + else if (number is float) + builder.Append(((float)number).ToString("R", CultureInfo.InvariantCulture)); + else if (NumberTypes.IndexOf(number.GetType()) != -1) + builder.Append(number); + return true; + } + + /// + /// Determines if a given object is numeric in any way + /// (can be integer, double, null, etc). + /// + static bool IsNumeric(object value) + { + if (value is sbyte) return true; + if (value is byte) return true; + if (value is short) return true; + if (value is ushort) return true; + if (value is int) return true; + if (value is uint) return true; + if (value is long) return true; + if (value is ulong) return true; + if (value is float) return true; + if (value is double) return true; + if (value is decimal) return true; + return false; + } + + private static IJsonSerializerStrategy _currentJsonSerializerStrategy; + public static IJsonSerializerStrategy CurrentJsonSerializerStrategy + { + get + { + return _currentJsonSerializerStrategy ?? + (_currentJsonSerializerStrategy = +#if SIMPLE_JSON_DATACONTRACT + DataContractJsonSerializerStrategy +#else + PocoJsonSerializerStrategy +#endif +); + } + set + { + _currentJsonSerializerStrategy = value; + } + } + + private static PocoJsonSerializerStrategy _pocoJsonSerializerStrategy; + [EditorBrowsable(EditorBrowsableState.Advanced)] + public static PocoJsonSerializerStrategy PocoJsonSerializerStrategy + { + get + { + return _pocoJsonSerializerStrategy ?? (_pocoJsonSerializerStrategy = new PocoJsonSerializerStrategy()); + } + } + +#if SIMPLE_JSON_DATACONTRACT + + private static DataContractJsonSerializerStrategy _dataContractJsonSerializerStrategy; + [System.ComponentModel.EditorBrowsable(EditorBrowsableState.Advanced)] + public static DataContractJsonSerializerStrategy DataContractJsonSerializerStrategy + { + get + { + return _dataContractJsonSerializerStrategy ?? (_dataContractJsonSerializerStrategy = new DataContractJsonSerializerStrategy()); + } + } + +#endif + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + interface IJsonSerializerStrategy + { + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + bool TrySerializeNonPrimitiveObject(object input, out object output); + object DeserializeObject(object value, Type type); + } + + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class PocoJsonSerializerStrategy : IJsonSerializerStrategy + { + internal IDictionary ConstructorCache; + internal IDictionary> GetCache; + internal IDictionary>> SetCache; + + internal static readonly Type[] EmptyTypes = new Type[0]; + internal static readonly Type[] ArrayConstructorParameterTypes = new Type[] { typeof(int) }; + + private static readonly string[] Iso8601Format = new string[] + { + @"yyyy-MM-dd\THH:mm:ss.FFFFFFF\Z", + @"yyyy-MM-dd\THH:mm:ss\Z", + @"yyyy-MM-dd\THH:mm:ssK" + }; + + public PocoJsonSerializerStrategy() + { + ConstructorCache = new ReflectionUtils.ThreadSafeDictionary(ContructorDelegateFactory); + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + protected virtual string MapClrMemberNameToJsonFieldName(MemberInfo memberInfo) + { + // TODO: Optimize and/or cache + foreach (JsonProperty eachAttr in memberInfo.GetCustomAttributes(typeof(JsonProperty), true)) + if (!string.IsNullOrEmpty(eachAttr.PropertyName)) + return eachAttr.PropertyName; + return memberInfo.Name; + } + + protected virtual void MapClrMemberNameToJsonFieldName(MemberInfo memberInfo, out string jsonName, out JsonProperty jsonProp) + { + jsonName = memberInfo.Name; + jsonProp = null; + // TODO: Optimize and/or cache + foreach (JsonProperty eachAttr in memberInfo.GetCustomAttributes(typeof(JsonProperty), true)) + { + jsonProp = eachAttr; + if (!string.IsNullOrEmpty(eachAttr.PropertyName)) + jsonName = eachAttr.PropertyName; + } + } + + internal virtual ReflectionUtils.ConstructorDelegate ContructorDelegateFactory(Type key) + { + return ReflectionUtils.GetContructor(key, key.IsArray ? ArrayConstructorParameterTypes : EmptyTypes); + } + + internal virtual IDictionary GetterValueFactory(Type type) + { + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (getMethod.IsStatic || !getMethod.IsPublic) + continue; + result[propertyInfo] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[fieldInfo] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal virtual IDictionary> SetterValueFactory(Type type) + { + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (setMethod.IsStatic || !setMethod.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(propertyInfo)] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (fieldInfo.IsInitOnly || fieldInfo.IsStatic || !fieldInfo.IsPublic) + continue; + result[MapClrMemberNameToJsonFieldName(fieldInfo)] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + return result; + } + + public virtual bool TrySerializeNonPrimitiveObject(object input, out object output) + { + return TrySerializeKnownTypes(input, out output) || TrySerializeUnknownTypes(input, out output); + } + + [SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + public virtual object DeserializeObject(object value, Type type) + { + if (type == null) throw new ArgumentNullException("type"); + if (value != null && type.IsInstanceOfType(value)) return value; + + string str = value as string; + if (type == typeof(Guid) && string.IsNullOrEmpty(str)) + return default(Guid); + + if (value == null) + return null; + + object obj = null; + + if (str != null) + { + if (str.Length != 0) // We know it can't be null now. + { + if (type == typeof(DateTime) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTime))) + return DateTime.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(DateTimeOffset) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(DateTimeOffset))) + return DateTimeOffset.ParseExact(str, Iso8601Format, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal); + if (type == typeof(Guid) || (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid))) + return new Guid(str); + if (type == typeof(Uri)) + { + bool isValid = Uri.IsWellFormedUriString(str, UriKind.RelativeOrAbsolute); + + Uri result; + if (isValid && Uri.TryCreate(str, UriKind.RelativeOrAbsolute, out result)) + return result; + + return null; + } + + if (type == typeof(string)) + return str; + + return Convert.ChangeType(str, type, CultureInfo.InvariantCulture); + } + else + { + if (type == typeof(Guid)) + obj = default(Guid); + else if (ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + obj = null; + else + obj = str; + } + // Empty string case + if (!ReflectionUtils.IsNullableType(type) && Nullable.GetUnderlyingType(type) == typeof(Guid)) + return str; + } + else if (value is bool) + return value; + + bool valueIsLong = value is long; + bool valueIsUlong = value is ulong; + bool valueIsDouble = value is double; + Type nullableType = Nullable.GetUnderlyingType(type); + if (nullableType != null && PlayFabSimpleJson.NumberTypes.IndexOf(nullableType) != -1) + type = nullableType; // Just use the regular type for the conversion + bool isNumberType = PlayFabSimpleJson.NumberTypes.IndexOf(type) != -1; + bool isEnumType = type.GetTypeInfo().IsEnum; + if ((valueIsLong && type == typeof(long)) || (valueIsUlong && type == typeof(ulong)) || (valueIsDouble && type == typeof(double))) + return value; + if ((valueIsLong || valueIsUlong || valueIsDouble) && isEnumType) + return Enum.ToObject(type, Convert.ChangeType(value, Enum.GetUnderlyingType(type), CultureInfo.InvariantCulture)); + if ((valueIsLong || valueIsUlong || valueIsDouble) && isNumberType) + return Convert.ChangeType(value, type, CultureInfo.InvariantCulture); + + IDictionary objects = value as IDictionary; + if (objects != null) + { + IDictionary jsonObject = objects; + + if (ReflectionUtils.IsTypeDictionary(type)) + { + // if dictionary then + Type[] types = ReflectionUtils.GetGenericTypeArguments(type); + Type keyType = types[0]; + Type valueType = types[1]; + + Type genericType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType); + + IDictionary dict = (IDictionary)ConstructorCache[genericType](); + + foreach (KeyValuePair kvp in jsonObject) + dict.Add(kvp.Key, DeserializeObject(kvp.Value, valueType)); + + obj = dict; + } + else + { + if (type == typeof(object)) + obj = value; + else + { + obj = ConstructorCache[type](); + foreach (KeyValuePair> setter in SetCache[type]) + { + object jsonValue; + if (jsonObject.TryGetValue(setter.Key, out jsonValue)) + { + jsonValue = DeserializeObject(jsonValue, setter.Value.Key); + setter.Value.Value(obj, jsonValue); + } + } + } + } + } + else + { + IList valueAsList = value as IList; + if (valueAsList != null) + { + IList jsonObject = valueAsList; + IList list = null; + + if (type.IsArray) + { + list = (IList)ConstructorCache[type](jsonObject.Count); + int i = 0; + foreach (object o in jsonObject) + list[i++] = DeserializeObject(o, type.GetElementType()); + } + else if (ReflectionUtils.IsTypeGenericeCollectionInterface(type) || ReflectionUtils.IsAssignableFrom(typeof(IList), type) || type == typeof(object)) + { + Type innerType = ReflectionUtils.GetGenericListElementType(type); + ReflectionUtils.ConstructorDelegate ctrDelegate = null; + if (type != typeof(object)) + ctrDelegate = ConstructorCache[type]; + if (ctrDelegate == null) + ctrDelegate = ConstructorCache[typeof(List<>).MakeGenericType(innerType)]; + list = (IList)ctrDelegate(); + foreach (object o in jsonObject) + list.Add(DeserializeObject(o, innerType)); + } + obj = list; + } + return obj; + } + if (ReflectionUtils.IsNullableType(type)) + return ReflectionUtils.ToNullableType(obj, type); + return obj; + } + + protected virtual object SerializeEnum(Enum p) + { + return Convert.ToDouble(p, CultureInfo.InvariantCulture); + } + + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeKnownTypes(object input, out object output) + { + bool returnValue = true; + if (input is DateTime) + output = ((DateTime)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is DateTimeOffset) + output = ((DateTimeOffset)input).ToUniversalTime().ToString(Iso8601Format[0], CultureInfo.InvariantCulture); + else if (input is Guid) + output = ((Guid)input).ToString("D"); + else if (input is Uri) + output = input.ToString(); + else + { + Enum inputEnum = input as Enum; + if (inputEnum != null) + output = SerializeEnum(inputEnum); + else + { + returnValue = false; + output = null; + } + } + return returnValue; + } + [SuppressMessage("Microsoft.Design", "CA1007:UseGenericsWhereAppropriate", Justification = "Need to support .NET 2")] + protected virtual bool TrySerializeUnknownTypes(object input, out object output) + { + if (input == null) throw new ArgumentNullException("input"); + output = null; + Type type = input.GetType(); + if (type.FullName == null) + return false; + IDictionary obj = new JsonObject(); + IDictionary getters = GetCache[type]; + foreach (KeyValuePair getter in getters) + { + if (getter.Value == null) + continue; + string jsonKey; + JsonProperty jsonProp; + MapClrMemberNameToJsonFieldName(getter.Key, out jsonKey, out jsonProp); + if (obj.ContainsKey(jsonKey)) + throw new Exception("The given key is defined multiple times in the same type: " + input.GetType().Name + "." + jsonKey); + object value = getter.Value(input); + if (jsonProp == null || jsonProp.NullValueHandling == NullValueHandling.Include || value != null) + obj.Add(jsonKey, value); + } + output = obj; + return true; + } + } + +#if SIMPLE_JSON_DATACONTRACT + [GeneratedCode("simple-json", "1.0.0")] +#if SIMPLE_JSON_INTERNAL + internal +#else + public +#endif + class DataContractJsonSerializerStrategy : PocoJsonSerializerStrategy + { + public DataContractJsonSerializerStrategy() + { + GetCache = new ReflectionUtils.ThreadSafeDictionary>(GetterValueFactory); + SetCache = new ReflectionUtils.ThreadSafeDictionary>>(SetterValueFactory); + } + + internal override IDictionary GetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.GetterValueFactory(type); + string jsonKey; + IDictionary result = new Dictionary(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanRead) + { + MethodInfo getMethod = ReflectionUtils.GetGetterMethodInfo(propertyInfo); + if (!getMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(propertyInfo); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = ReflectionUtils.GetGetMethod(fieldInfo); + } + return result; + } + + internal override IDictionary> SetterValueFactory(Type type) + { + bool hasDataContract = ReflectionUtils.GetAttribute(type, typeof(DataContractAttribute)) != null; + if (!hasDataContract) + return base.SetterValueFactory(type); + string jsonKey; + IDictionary> result = new Dictionary>(); + foreach (PropertyInfo propertyInfo in ReflectionUtils.GetProperties(type)) + { + if (propertyInfo.CanWrite) + { + MethodInfo setMethod = ReflectionUtils.GetSetterMethodInfo(propertyInfo); + if (!setMethod.IsStatic && CanAdd(propertyInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(propertyInfo.PropertyType, ReflectionUtils.GetSetMethod(propertyInfo)); + } + } + foreach (FieldInfo fieldInfo in ReflectionUtils.GetFields(type)) + { + if (!fieldInfo.IsInitOnly && !fieldInfo.IsStatic && CanAdd(fieldInfo, out jsonKey)) + result[jsonKey] = new KeyValuePair(fieldInfo.FieldType, ReflectionUtils.GetSetMethod(fieldInfo)); + } + // todo implement sorting for DATACONTRACT. + return result; + } + + private static bool CanAdd(MemberInfo info, out string jsonKey) + { + jsonKey = null; + if (ReflectionUtils.GetAttribute(info, typeof(IgnoreDataMemberAttribute)) != null) + return false; + DataMemberAttribute dataMemberAttribute = (DataMemberAttribute)ReflectionUtils.GetAttribute(info, typeof(DataMemberAttribute)); + if (dataMemberAttribute == null) + return false; + jsonKey = string.IsNullOrEmpty(dataMemberAttribute.Name) ? info.Name : dataMemberAttribute.Name; + return true; + } + } + +#endif + + // This class is meant to be copied into other libraries. So we want to exclude it from Code Analysis rules + // that might be in place in the target project. + [GeneratedCode("reflection-utils", "1.0.0")] +#if SIMPLE_JSON_REFLECTION_UTILS_PUBLIC + public +#else + internal +#endif + class ReflectionUtils + { + private static readonly object[] EmptyObjects = new object[0]; + + public delegate object GetDelegate(object source); + public delegate void SetDelegate(object source, object value); + public delegate object ConstructorDelegate(params object[] args); + + public delegate TValue ThreadSafeDictionaryValueFactory(TKey key); + + [ThreadStatic] + private static object[] _1ObjArray; + +#if SIMPLE_JSON_TYPEINFO + public static TypeInfo GetTypeInfo(Type type) + { + return type.GetTypeInfo(); + } +#else + public static Type GetTypeInfo(Type type) + { + return type; + } +#endif + + public static Attribute GetAttribute(MemberInfo info, Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (info == null || type == null || !info.IsDefined(type)) + return null; + return info.GetCustomAttribute(type); +#else + if (info == null || type == null || !Attribute.IsDefined(info, type)) + return null; + return Attribute.GetCustomAttribute(info, type); +#endif + } + + public static Type GetGenericListElementType(Type type) + { + if (type == typeof(object)) + return type; + + IEnumerable interfaces; +#if SIMPLE_JSON_TYPEINFO + interfaces = type.GetTypeInfo().ImplementedInterfaces; +#else + interfaces = type.GetInterfaces(); +#endif + foreach (Type implementedInterface in interfaces) + { + if (IsTypeGeneric(implementedInterface) && + implementedInterface.GetGenericTypeDefinition() == typeof(IList<>)) + { + return GetGenericTypeArguments(implementedInterface)[0]; + } + } + return GetGenericTypeArguments(type)[0]; + } + + public static Attribute GetAttribute(Type objectType, Type attributeType) + { + +#if SIMPLE_JSON_TYPEINFO + if (objectType == null || attributeType == null || !objectType.GetTypeInfo().IsDefined(attributeType)) + return null; + return objectType.GetTypeInfo().GetCustomAttribute(attributeType); +#else + if (objectType == null || attributeType == null || !Attribute.IsDefined(objectType, attributeType)) + return null; + return Attribute.GetCustomAttribute(objectType, attributeType); +#endif + } + + public static Type[] GetGenericTypeArguments(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().GenericTypeArguments; +#else + return type.GetGenericArguments(); +#endif + } + + public static bool IsTypeGeneric(Type type) + { + return GetTypeInfo(type).IsGenericType; + } + + public static bool IsTypeGenericeCollectionInterface(Type type) + { + if (!IsTypeGeneric(type)) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + + return (genericDefinition == typeof(IList<>) + || genericDefinition == typeof(ICollection<>) + || genericDefinition == typeof(IEnumerable<>) +#if SIMPLE_JSON_READONLY_COLLECTIONS + || genericDefinition == typeof(IReadOnlyCollection<>) + || genericDefinition == typeof(IReadOnlyList<>) +#endif +); + } + + public static bool IsAssignableFrom(Type type1, Type type2) + { + return GetTypeInfo(type1).IsAssignableFrom(GetTypeInfo(type2)); + } + + public static bool IsTypeDictionary(Type type) + { +#if SIMPLE_JSON_TYPEINFO + if (typeof(IDictionary<,>).GetTypeInfo().IsAssignableFrom(type.GetTypeInfo())) + return true; +#else + if (typeof(System.Collections.IDictionary).IsAssignableFrom(type)) + return true; +#endif + if (!GetTypeInfo(type).IsGenericType) + return false; + + Type genericDefinition = type.GetGenericTypeDefinition(); + return genericDefinition == typeof(IDictionary<,>) || genericDefinition == typeof(Dictionary<,>); + } + + public static bool IsNullableType(Type type) + { + return GetTypeInfo(type).IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>); + } + + public static object ToNullableType(object obj, Type nullableType) + { + return obj == null ? null : Convert.ChangeType(obj, Nullable.GetUnderlyingType(nullableType), CultureInfo.InvariantCulture); + } + + public static bool IsValueType(Type type) + { + return GetTypeInfo(type).IsValueType; + } + + public static IEnumerable GetConstructors(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetTypeInfo().DeclaredConstructors; +#else + return type.GetConstructors(); +#endif + } + + public static ConstructorInfo GetConstructorInfo(Type type, params Type[] argsType) + { + IEnumerable constructorInfos = GetConstructors(type); + int i; + bool matches; + foreach (ConstructorInfo constructorInfo in constructorInfos) + { + ParameterInfo[] parameters = constructorInfo.GetParameters(); + if (argsType.Length != parameters.Length) + continue; + + i = 0; + matches = true; + foreach (ParameterInfo parameterInfo in constructorInfo.GetParameters()) + { + if (parameterInfo.ParameterType != argsType[i]) + { + matches = false; + break; + } + } + + if (matches) + return constructorInfo; + } + + return null; + } + + public static IEnumerable GetProperties(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeProperties(); +#else + return type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static IEnumerable GetFields(Type type) + { +#if SIMPLE_JSON_TYPEINFO + return type.GetRuntimeFields(); +#else + return type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); +#endif + } + + public static MethodInfo GetGetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.GetMethod; +#else + return propertyInfo.GetGetMethod(true); +#endif + } + + public static MethodInfo GetSetterMethodInfo(PropertyInfo propertyInfo) + { +#if SIMPLE_JSON_TYPEINFO + return propertyInfo.SetMethod; +#else + return propertyInfo.GetSetMethod(true); +#endif + } + + public static ConstructorDelegate GetContructor(ConstructorInfo constructorInfo) + { + return GetConstructorByReflection(constructorInfo); + } + + public static ConstructorDelegate GetContructor(Type type, params Type[] argsType) + { + return GetConstructorByReflection(type, argsType); + } + + public static ConstructorDelegate GetConstructorByReflection(ConstructorInfo constructorInfo) + { + return delegate (object[] args) + { + var x = constructorInfo; + return x.Invoke(args); + }; + } + + public static ConstructorDelegate GetConstructorByReflection(Type type, params Type[] argsType) + { + ConstructorInfo constructorInfo = GetConstructorInfo(type, argsType); + return constructorInfo == null ? null : GetConstructorByReflection(constructorInfo); + } + + public static GetDelegate GetGetMethod(PropertyInfo propertyInfo) + { + return GetGetMethodByReflection(propertyInfo); + } + + public static GetDelegate GetGetMethod(FieldInfo fieldInfo) + { + return GetGetMethodByReflection(fieldInfo); + } + + public static GetDelegate GetGetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetGetterMethodInfo(propertyInfo); + return delegate (object source) { return methodInfo.Invoke(source, EmptyObjects); }; + } + + public static GetDelegate GetGetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source) { return fieldInfo.GetValue(source); }; + } + + public static SetDelegate GetSetMethod(PropertyInfo propertyInfo) + { + return GetSetMethodByReflection(propertyInfo); + } + + public static SetDelegate GetSetMethod(FieldInfo fieldInfo) + { + return GetSetMethodByReflection(fieldInfo); + } + + public static SetDelegate GetSetMethodByReflection(PropertyInfo propertyInfo) + { + MethodInfo methodInfo = GetSetterMethodInfo(propertyInfo); + return delegate (object source, object value) + { + if (_1ObjArray == null) + _1ObjArray = new object[1]; + _1ObjArray[0] = value; + methodInfo.Invoke(source, _1ObjArray); + }; + } + + public static SetDelegate GetSetMethodByReflection(FieldInfo fieldInfo) + { + return delegate (object source, object value) { fieldInfo.SetValue(source, value); }; + } + + public sealed class ThreadSafeDictionary : IDictionary + { + private readonly object _lock = new object(); + private readonly ThreadSafeDictionaryValueFactory _valueFactory; + private Dictionary _dictionary; + + public ThreadSafeDictionary(ThreadSafeDictionaryValueFactory valueFactory) + { + _valueFactory = valueFactory; + } + + private TValue Get(TKey key) + { + if (_dictionary == null) + return AddValue(key); + TValue value; + if (!_dictionary.TryGetValue(key, out value)) + return AddValue(key); + return value; + } + + private TValue AddValue(TKey key) + { + TValue value = _valueFactory(key); + lock (_lock) + { + if (_dictionary == null) + { + _dictionary = new Dictionary(); + _dictionary[key] = value; + } + else + { + TValue val; + if (_dictionary.TryGetValue(key, out val)) + return val; + Dictionary dict = new Dictionary(_dictionary); + dict[key] = value; + _dictionary = dict; + } + } + return value; + } + + public void Add(TKey key, TValue value) + { + throw new NotImplementedException(); + } + + public bool ContainsKey(TKey key) + { + return _dictionary.ContainsKey(key); + } + + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + public bool Remove(TKey key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(TKey key, out TValue value) + { + value = this[key]; + return true; + } + + public ICollection Values + { + get { return _dictionary.Values; } + } + + public TValue this[TKey key] + { + get { return Get(key); } + set { throw new NotImplementedException(); } + } + + public void Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return _dictionary.Count; } + } + + public bool IsReadOnly + { + get { throw new NotImplementedException(); } + } + + public bool Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public IEnumerator> GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return _dictionary.GetEnumerator(); + } + } + } +} + +// ReSharper restore LoopCanBeConvertedToQuery +// ReSharper restore RedundantExplicitArrayCreation +// ReSharper restore SuggestUseVarKeywordEvident diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta new file mode 100644 index 00000000..38d3b82f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SimpleJson.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: bce6184794650f24fa8ac244b25edc17 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs new file mode 100644 index 00000000..4abc8b34 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs @@ -0,0 +1,58 @@ +using UnityEngine; + +namespace PlayFab.Internal +{ + //public to be accessible by Unity engine + public class SingletonMonoBehaviour : MonoBehaviour where T : SingletonMonoBehaviour + { + private static T _instance; + + public static T instance + { + get + { + CreateInstance(); + return _instance; + } + } + + public static void CreateInstance() + { + if (_instance == null) + { + //find existing instance + _instance = FindObjectOfType(); + if (_instance == null) + { + //create new instance + var go = new GameObject(typeof(T).Name); + _instance = go.AddComponent(); + } + //initialize instance if necessary + if (!_instance.initialized) + { + _instance.Initialize(); + _instance.initialized = true; + } + } + } + + public virtual void Awake () + { + if (Application.isPlaying) + { + DontDestroyOnLoad(this); + } + + //check if instance already exists when reloading original scene + if (_instance != null) + { + DestroyImmediate (gameObject); + } + } + + protected bool initialized; + + protected virtual void Initialize() { } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta new file mode 100644 index 00000000..4a1f14a2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/SingletonMonoBehaviour.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: f6a51fa1ed684497db153f40961979c4 +timeCreated: 1462682373 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs new file mode 100644 index 00000000..6c5e4650 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs @@ -0,0 +1,157 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; + +#if NETFX_CORE +using System.Reflection; +#endif + +namespace PlayFab.Internal +{ + public static class PlayFabUtil + { + static PlayFabUtil() { } + + private static string _localSettingsFileName = "playfab.local.settings.json"; + public static readonly string[] _defaultDateTimeFormats = new string[]{ // All parseable ISO 8601 formats for DateTime.[Try]ParseExact - Lets us deserialize any legacy timestamps in one of these formats + // These are the standard format with ISO 8601 UTC markers (T/Z) + "yyyy-MM-ddTHH:mm:ss.FFFFFFZ", + "yyyy-MM-ddTHH:mm:ss.FFFFZ", + "yyyy-MM-ddTHH:mm:ss.FFFZ", // DEFAULT_UTC_OUTPUT_INDEX + "yyyy-MM-ddTHH:mm:ss.FFZ", + "yyyy-MM-ddTHH:mm:ssZ", + "yyyy-MM-dd HH:mm:ssZ", // Added for Android Push Plugin + + // These are the standard format without ISO 8601 UTC markers (T/Z) + "yyyy-MM-dd HH:mm:ss.FFFFFF", + "yyyy-MM-dd HH:mm:ss.FFFF", + "yyyy-MM-dd HH:mm:ss.FFF", + "yyyy-MM-dd HH:mm:ss.FF", // DEFAULT_LOCAL_OUTPUT_INDEX + "yyyy-MM-dd HH:mm:ss", + + // These are the result of an input bug, which we now have to support as long as the db has entries formatted like this + "yyyy-MM-dd HH:mm.ss.FFFF", + "yyyy-MM-dd HH:mm.ss.FFF", + "yyyy-MM-dd HH:mm.ss.FF", + "yyyy-MM-dd HH:mm.ss", + }; + public const int DEFAULT_UTC_OUTPUT_INDEX = 2; // The default format everybody should use + public const int DEFAULT_LOCAL_OUTPUT_INDEX = 9; // The default format if you want to use local time (This doesn't have universal support in all PlayFab code) + public static DateTimeStyles DateTimeStyles = DateTimeStyles.RoundtripKind; + + public static string timeStamp + { + get { return DateTime.Now.ToString(_defaultDateTimeFormats[DEFAULT_LOCAL_OUTPUT_INDEX]); } + } + + public static string utcTimeStamp + { + get { return DateTime.UtcNow.ToString(_defaultDateTimeFormats[DEFAULT_UTC_OUTPUT_INDEX]); } + } + + public static string Format(string text, params object[] args) + { + return args.Length > 0 ? string.Format(text, args) : text; + } + + [ThreadStatic] + private static StringBuilder _sb; + /// + /// A threadsafe way to block and load a text file + /// + /// Load a text file, and return the file as text. + /// Used for small (usually json) files. + /// + public static string ReadAllFileText(string filename) + { + if (!File.Exists(filename)) + { + return string.Empty; + } + + if (_sb == null) + { + _sb = new StringBuilder(); + } + _sb.Length = 0; + + using (var fs = new FileStream(filename, FileMode.Open)) + { + using (var br = new BinaryReader(fs)) + { + while (br.BaseStream.Position != br.BaseStream.Length) + { + _sb.Append(br.ReadChar()); + } + } + } + + return _sb.ToString(); + } + + public static T TryEnumParse(string value, T defaultValue) + { + try + { + return (T)Enum.Parse(typeof(T), value); + } + catch (InvalidCastException) + { + return defaultValue; + } + catch (Exception e) + { + UnityEngine.Debug.LogError("Enum cast failed with unknown error: " + e.Message); + return defaultValue; + } + } + +#if UNITY_2017_1_OR_NEWER + internal static string GetLocalSettingsFileProperty(string propertyKey) + { + string envFileContent = null; + + string currDir = Directory.GetCurrentDirectory(); + string currDirEnvFile = Path.Combine(currDir, _localSettingsFileName); + + if (File.Exists(currDirEnvFile)) + { + envFileContent = ReadAllFileText(currDirEnvFile); + } + else + { + string tempDir = Path.GetTempPath(); + string tempDirEnvFile = Path.Combine(tempDir, _localSettingsFileName); + + if (File.Exists(tempDirEnvFile)) + { + envFileContent = ReadAllFileText(tempDirEnvFile); + } + } + + if (!string.IsNullOrEmpty(envFileContent)) + { + var serializer = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + var envJson = serializer.DeserializeObject>(envFileContent); + try + { + object result; + if (envJson.TryGetValue(propertyKey, out result)) + { + return result == null ? null : result.ToString(); + } + + return null; + } + catch (KeyNotFoundException) + { + return string.Empty; + } + } + return string.Empty; + } +#endif + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs.meta new file mode 100644 index 00000000..199e91ed --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/Util.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b3bfc0fbdbe1a36429699dfc30c9e488 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs new file mode 100644 index 00000000..db85a94e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs @@ -0,0 +1,66 @@ +#if UNITY_WSA && UNITY_WP8 +#define NETFX_CORE +#endif + +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Text; + +namespace PlayFab +{ + public static class WsaReflectionExtensions + { +#if !NETFX_CORE + public static Delegate CreateDelegate(this MethodInfo methodInfo, Type delegateType, object instance) + { + return Delegate.CreateDelegate(delegateType, instance, methodInfo); + } + public static Type GetTypeInfo(this Type type) + { + return type; + } + public static Type AsType(this Type type) + { + return type; + } + public static string GetDelegateName(this Delegate delegateInstance) + { + return delegateInstance.Method.Name; + } +#else + public static bool IsInstanceOfType(this Type type, object obj) + { + return obj != null && type.GetTypeInfo().IsAssignableFrom(obj.GetType().GetTypeInfo()); + } + public static string GetDelegateName(this Delegate delegateInstance) + { + return delegateInstance.ToString(); + } + public static MethodInfo GetMethod(this Type type, string methodName) + { + return type.GetTypeInfo().GetDeclaredMethod(methodName); + } + public static IEnumerable GetFields(this TypeInfo typeInfo) + { + return typeInfo.DeclaredFields; + } + public static TypeInfo GetTypeInfo(this TypeInfo typeInfo) + { + return typeInfo; + } + public static IEnumerable GetConstructors(this TypeInfo typeInfo) + { + return typeInfo.DeclaredConstructors; + } + public static IEnumerable GetMethods(this TypeInfo typeInfo, BindingFlags ignored) + { + return typeInfo.DeclaredMethods; + } + public static IEnumerable GetTypes(this Assembly assembly) + { + return assembly.DefinedTypes; + } +#endif + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta new file mode 100644 index 00000000..aa63e032 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Internal/wsaReflectionExtensions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1b20d57e2279b3a408268b20c2be2208 +timeCreated: 1468890373 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models.meta new file mode 100644 index 00000000..ab8f60da --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 34c5d2725a89d1c40af9b10a9b9dcbc5 +folderAsset: yes +timeCreated: 1467491757 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs new file mode 100644 index 00000000..c185e10e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs @@ -0,0 +1,34 @@ +using UnityEngine; +using PlayFab; + +#if UNITY_5_3_OR_NEWER +[CreateAssetMenu(fileName = "PlayFabSharedSettings", menuName = "PlayFab/CreateSharedSettings", order = 1)] +#endif +public class PlayFabSharedSettings : ScriptableObject +{ + public string TitleId; + + internal string VerticalName = null; +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + public string DeveloperSecretKey; +#endif + public string ProductionEnvironmentUrl = ""; + +#if UNITY_2017_2_OR_NEWER + public WebRequestType RequestType = WebRequestType.UnityWebRequest; +#else + public WebRequestType RequestType = WebRequestType.UnityWww; +#endif + + public bool DisableDeviceInfo; + public bool DisableFocusTimeCollection; + + public int RequestTimeout = 2000; + public bool RequestKeepAlive = true; + + public PlayFabLogLevel LogLevel = PlayFabLogLevel.Warning | PlayFabLogLevel.Error; + public string LoggerHost = ""; + public int LoggerPort = 0; + public bool EnableRealTimeLogging = false; + public int LogCapLimit = 30; +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta new file mode 100644 index 00000000..5612c93a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/PlayFabSharedSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 093286084a3d1994a9c28281a1c38b1d +timeCreated: 1467748518 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs new file mode 100644 index 00000000..0d147cb8 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs @@ -0,0 +1,44 @@ +using PlayFab.Internal; + +namespace PlayFab.SharedModels +{ + public class HttpResponseObject + { + public int code; + public string status; + public object data; + } + + public class PlayFabBaseModel + { + public string ToJson() + { + var json = PluginManager.GetPlugin(PluginContract.PlayFab_Serializer); + return json.SerializeObject(this); + } + } + + public interface IPlayFabInstanceApi { } + + public class PlayFabRequestCommon : PlayFabBaseModel + { + public PlayFabAuthenticationContext AuthenticationContext; + } + + public class PlayFabResultCommon : PlayFabBaseModel + { + public PlayFabRequestCommon Request; + public object CustomData; + } + + public class PlayFabLoginResultCommon : PlayFabResultCommon + { + public PlayFabAuthenticationContext AuthenticationContext; + } + + public class PlayFabResult where TResult : PlayFabResultCommon + { + public TResult Result; + public object CustomData; + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta new file mode 100644 index 00000000..ba966239 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Models/SharedModels.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8e2ad5324972b434883785ddddf9c851 +timeCreated: 1467491766 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public.meta new file mode 100644 index 00000000..340516d7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 85636a5aec9f04e91a75e422c19ff5da +folderAsset: yes +timeCreated: 1462682372 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs new file mode 100644 index 00000000..676ca434 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs @@ -0,0 +1,9 @@ +namespace PlayFab +{ + /// + /// Base interface of any PlayFab SDK plugin. + /// + public interface IPlayFabPlugin + { + } +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta new file mode 100644 index 00000000..25d6f1b9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/IPlayFabPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c515d14de9458ef449d382c41e4943b0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs new file mode 100644 index 00000000..d2889c9d --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs @@ -0,0 +1,15 @@ +namespace PlayFab +{ + /// + /// Interface of any data serializer SDK plugin. + /// + public interface ISerializerPlugin : IPlayFabPlugin + { + T DeserializeObject(string serialized); + T DeserializeObject(string serialized, object serializerStrategy); + object DeserializeObject(string serialized); + + string SerializeObject(object obj); + string SerializeObject(object obj, object serializerStrategy); + } +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta new file mode 100644 index 00000000..1a0051ce --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ISerializerPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d33ec65e8a628fe44a4aa5c55289a16d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs new file mode 100644 index 00000000..0206bb72 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace PlayFab +{ + /// + /// Interface of any transport SDK plugin. + /// + public interface ITransportPlugin: IPlayFabPlugin + { + bool IsInitialized { get; } + void Initialize(); + + // Mirroring MonoBehaviour - Relayed from PlayFabHTTP + void Update(); + void OnDestroy(); + + void SimpleGetCall(string fullUrl, Action successCallback, Action errorCallback); + void SimplePutCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback); + + void SimplePostCall(string fullUrl, byte[] payload, Action successCallback, Action errorCallback); + + void MakeApiCall(object reqContainer); + + int GetPendingMessages(); + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta new file mode 100644 index 00000000..ebf43af4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/ITransportPlugin.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b97cd56b9c312144bb35f37b431aa18f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs new file mode 100644 index 00000000..3c64af37 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs @@ -0,0 +1,84 @@ +using System.Collections.Generic; +using System; + +namespace PlayFab +{ + public class PlayFabApiSettings + { + private string _ProductionEnvironmentUrl = PlayFabSettings.DefaultPlayFabApiUrl; + public readonly Dictionary _requestGetParams = new Dictionary { + { "sdk", PlayFabSettings.VersionString } + }; + + public virtual Dictionary RequestGetParams { get { return _requestGetParams; } } + + /// This is only for customers running a private cluster. Generally you shouldn't touch this + public virtual string ProductionEnvironmentUrl { get { return _ProductionEnvironmentUrl; } set { _ProductionEnvironmentUrl = value; } } + /// You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + public virtual string TitleId { get; set; } + + /// The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + internal virtual string VerticalName { get; set; } +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + /// You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + public virtual string DeveloperSecretKey { get; set; } +#endif + /// Set this to true to prevent hardware information from leaving the device + public virtual bool DisableDeviceInfo { get; set; } + /// Set this to true to prevent focus change information from leaving the device + public virtual bool DisableFocusTimeCollection { get; set; } + + + public virtual string GetFullUrl(string apiCall, Dictionary getParams) + { + return PlayFabSettings.GetFullUrl(apiCall, getParams, this); + } + } + + /// + /// This is only meant for PlayFabSettings to use as a redirect to store values on PlayFabSharedSettings instead of locally + /// + internal class PlayFabSettingsRedirect : PlayFabApiSettings + { + private readonly Func GetSO; + public PlayFabSettingsRedirect(Func getSO) { GetSO = getSO; } + + public override string ProductionEnvironmentUrl + { + get { var so = GetSO(); return so == null ? base.ProductionEnvironmentUrl : so.ProductionEnvironmentUrl; } + set { var so = GetSO(); if (so != null) so.ProductionEnvironmentUrl = value; base.ProductionEnvironmentUrl = value; } + } + + internal override string VerticalName + { + get { var so = GetSO(); return so == null ? base.VerticalName : so.VerticalName; } + set { var so = GetSO(); if (so != null) so.VerticalName = value; base.VerticalName = value; } + } + +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + public override string DeveloperSecretKey + { + get { var so = GetSO(); return so == null ? base.DeveloperSecretKey : so.DeveloperSecretKey; } + set { var so = GetSO(); if (so != null) so.DeveloperSecretKey = value; base.DeveloperSecretKey = value; } + } +#endif + + public override string TitleId + { + get { var so = GetSO(); return so == null ? base.TitleId : so.TitleId; } + set { var so = GetSO(); if (so != null) so.TitleId = value; base.TitleId = value; } + } + + public override bool DisableDeviceInfo + { + get { var so = GetSO(); return so == null ? base.DisableDeviceInfo : so.DisableDeviceInfo; } + set { var so = GetSO(); if (so != null) so.DisableDeviceInfo = value; base.DisableDeviceInfo = value; } + } + + public override bool DisableFocusTimeCollection + { + get { var so = GetSO(); return so == null ? base.DisableFocusTimeCollection : so.DisableFocusTimeCollection; } + set { var so = GetSO(); if (so != null) so.DisableFocusTimeCollection = value; base.DisableFocusTimeCollection = value; } + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta new file mode 100644 index 00000000..de68200a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabApiSettings.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 66cd997c6a8b2ed4d8d2b5c2a97b6e22 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs new file mode 100644 index 00000000..cd9066d8 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs @@ -0,0 +1,77 @@ +namespace PlayFab +{ + public sealed class PlayFabAuthenticationContext + { + public PlayFabAuthenticationContext() + { + } + + public PlayFabAuthenticationContext(string clientSessionTicket, string entityToken, string playFabId, string entityId, string entityType) : this() + { +#if !DISABLE_PLAYFABCLIENT_API + ClientSessionTicket = clientSessionTicket; + PlayFabId = playFabId; +#endif +#if !DISABLE_PLAYFABENTITY_API + EntityToken = entityToken; + EntityId = entityId; + EntityType = entityType; +#endif + } + + public void CopyFrom(PlayFabAuthenticationContext other) + { +#if !DISABLE_PLAYFABCLIENT_API + ClientSessionTicket = other.ClientSessionTicket; + PlayFabId = other.PlayFabId; +#endif +#if !DISABLE_PLAYFABENTITY_API + EntityToken = other.EntityToken; + EntityId = other.EntityId; + EntityType = other.EntityType; +#endif + } + +#if !DISABLE_PLAYFABCLIENT_API + /// Allows access to the ClientAPI + public string ClientSessionTicket; + /// The master player entity Id + public string PlayFabId; + public bool IsClientLoggedIn() + { + return !string.IsNullOrEmpty(ClientSessionTicket); + } +#endif + +#if !DISABLE_PLAYFABENTITY_API + /// Allows access to most Entity APIs + public string EntityToken; + /// + /// Clients: The title player entity Id (unless replaced with a related entity) + /// Servers: The title id (unless replaced with a related entity) + /// + public string EntityId; + /// + /// Describes the type of entity identified by EntityId + /// + public string EntityType; + public bool IsEntityLoggedIn() + { + return !string.IsNullOrEmpty(EntityToken); + } +#endif + + public void ForgetAllCredentials() + { +#if !DISABLE_PLAYFABCLIENT_API + PlayFabId = null; + ClientSessionTicket = null; +#endif +#if !DISABLE_PLAYFABENTITY_API + EntityToken = null; + EntityId = null; + EntityType = null; +#endif + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta new file mode 100644 index 00000000..54e8f4f4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabAuthenticationContext.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5e4df1f8e07aee2409343554f628ce8b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs new file mode 100644 index 00000000..1ac5d571 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs @@ -0,0 +1,138 @@ +using UnityEngine; +using System.Text; +using PlayFab.SharedModels; +using UnityEngine.Rendering; +#if NETFX_CORE +using System.Reflection; +#endif + +namespace PlayFab +{ + public class PlayFabDataGatherer + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + // UNITY_5 Application info + public string ProductName; + public string ProductBundle; + public string Version; + public string Company; + public RuntimePlatform Platform; + // UNITY_5 Graphics Abilities + public bool GraphicsMultiThreaded; +#else + public enum GraphicsDeviceType + { + OpenGL2 = 0, Direct3D9 = 1, Direct3D11 = 2, PlayStation3 = 3, Null = 4, Xbox360 = 6, OpenGLES2 = 8, OpenGLES3 = 11, PlayStationVita = 12, + PlayStation4 = 13, XboxOne = 14, PlayStationMobile = 15, Metal = 16, OpenGLCore = 17, Direct3D12 = 18, Nintendo3DS = 19 + } + + // RuntimePlatform Enum info: + // OSXEditor = 0, OSXPlayer = 1, WindowsPlayer = 2, OSXWebPlayer = 3, OSXDashboardPlayer = 4, WindowsWebPlayer = 5, WindowsEditor = 7, + // IPhonePlayer = 8, PS3 = 9, XBOX360 = 10, Android = 11, LinuxPlayer = 13, FlashPlayer = 15, WebGLPlayer = 17, MetroPlayerX86 = 18, + // WSAPlayerX86 = 18, MetroPlayerX64 = 19,WSAPlayerX64 = 19, MetroPlayerARM = 20, WSAPlayerARM = 20, WP8Player = 21, + // EditorBrowsable(EditorBrowsableState.Never)] BB10Player = 22, BlackBerryPlayer = 22, TizenPlayer = 23, PSP2 = 24, PS4 = 25, + // PSM = 26, XboxOne = 27, SamsungTVPlayer = 28, WiiU = 30, tvOS = 31 +#endif +#if !UNITY_5_0 && (UNITY_5 || UNITY_5_3_OR_NEWER) + public GraphicsDeviceType GraphicsType; +#endif + + // Application info + public string DataPath; + public string PersistentDataPath; + public string StreamingAssetsPath; + public int TargetFrameRate; + public string UnityVersion; + public bool RunInBackground; + + //DEVICE & OS + public string DeviceModel; + //public enum DeviceType { Unknown, Handheld, Console, Desktop } + public DeviceType DeviceType; + public string DeviceUniqueId; + public string OperatingSystem; + + //GRAPHICS ABILITIES + public int GraphicsDeviceId; + public string GraphicsDeviceName; + public int GraphicsMemorySize; + public int GraphicsShaderLevel; + + //SYSTEM INFO + public int SystemMemorySize; + public int ProcessorCount; + public int ProcessorFrequency; + public string ProcessorType; + public bool SupportsAccelerometer; + public bool SupportsGyroscope; + public bool SupportsLocationService; + + public PlayFabDataGatherer() + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + // UNITY_5 Application info + ProductName = Application.productName; + Version = Application.version; + Company = Application.companyName; + Platform = Application.platform; + // UNITY_5 Graphics Abilities + GraphicsMultiThreaded = SystemInfo.graphicsMultiThreaded; +#endif +#if !UNITY_5_0 && (UNITY_5 || UNITY_5_3_OR_NEWER) + GraphicsType = SystemInfo.graphicsDeviceType; +#endif + + //Only Used on iOS & Android +#if UNITY_5_6_OR_NEWER && (UNITY_ANDROID || UNITY_IOS || UNITY_IPHONE) + ProductBundle = Application.identifier; +#elif UNITY_ANDROID || UNITY_IOS || UNITY_IPHONE + ProductBundle = Application.bundleIdentifier; +#endif + + // Application info + DataPath = Application.dataPath; +#if !UNITY_SWITCH + PersistentDataPath = Application.persistentDataPath; +#endif + StreamingAssetsPath = Application.streamingAssetsPath; + TargetFrameRate = Application.targetFrameRate; + UnityVersion = Application.unityVersion; + + //DEVICE & OS + DeviceModel = SystemInfo.deviceModel; + DeviceType = SystemInfo.deviceType; + + DeviceUniqueId = PlayFabSettings.DeviceUniqueIdentifier; + OperatingSystem = SystemInfo.operatingSystem; + + //GRAPHICS ABILITIES + GraphicsDeviceId = SystemInfo.graphicsDeviceID; + GraphicsDeviceName = SystemInfo.graphicsDeviceName; + GraphicsMemorySize = SystemInfo.graphicsMemorySize; + GraphicsShaderLevel = SystemInfo.graphicsShaderLevel; + + //SYSTEM INFO + SystemMemorySize = SystemInfo.systemMemorySize; + ProcessorCount = SystemInfo.processorCount; +#if UNITY_5_3_OR_NEWER + ProcessorFrequency = SystemInfo.processorFrequency; // Not Supported in PRE Unity 5_2 +#endif + ProcessorType = SystemInfo.processorType; + SupportsAccelerometer = SystemInfo.supportsAccelerometer; + SupportsGyroscope = SystemInfo.supportsGyroscope; + SupportsLocationService = SystemInfo.supportsLocationService; + } + + public string GenerateReport() + { + var sb = new StringBuilder(); + sb.Append("Logging System Info: ========================================\n"); + foreach (var field in GetType().GetTypeInfo().GetFields()) + { + var fld = field.GetValue(this).ToString(); + sb.AppendFormat("System Info - {0}: {1}\n", field.Name, fld); + } + return sb.ToString(); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta new file mode 100644 index 00000000..8998e9aa --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabDataGatherer.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9021fc3e0230b9a4db0f0e1b104b764b +timeCreated: 1464569227 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs new file mode 100644 index 00000000..302c3ff0 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs @@ -0,0 +1,3275 @@ +using PlayFab.SharedModels; +using PlayFab.Internal; + +namespace PlayFab.Events +{ + public partial class PlayFabEvents + { + public delegate void PlayFabErrorEvent(PlayFabRequestCommon request, PlayFabError error); + public delegate void PlayFabResultEvent(TResult result) where TResult : PlayFabResultCommon; + public delegate void PlayFabRequestEvent(TRequest request) where TRequest : PlayFabRequestCommon; + public event PlayFabErrorEvent OnGlobalErrorEvent; + + private static PlayFabEvents _instance; + /// + /// Private constructor because we call PlayFabEvents.init(); + /// + private PlayFabEvents() { } + + public static PlayFabEvents Init() + { + if (_instance == null) + { + _instance = new PlayFabEvents(); + } + PlayFabHttp.ApiProcessingEventHandler += _instance.OnProcessingEvent; + PlayFabHttp.ApiProcessingErrorEventHandler += _instance.OnProcessingErrorEvent; + return _instance; + } + + public void UnregisterInstance(object instance) + { +#if !DISABLE_PLAYFABCLIENT_API + if (OnLoginResultEvent != null) { foreach (var each in OnLoginResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginResultEvent -= (PlayFabResultEvent)each; } } } +#endif +#if ENABLE_PLAYFABADMIN_API + if (OnAdminAbortTaskInstanceRequestEvent != null) { foreach (var each in OnAdminAbortTaskInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAbortTaskInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAbortTaskInstanceResultEvent != null) { foreach (var each in OnAdminAbortTaskInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAbortTaskInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddLocalizedNewsRequestEvent != null) { foreach (var each in OnAdminAddLocalizedNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddLocalizedNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddLocalizedNewsResultEvent != null) { foreach (var each in OnAdminAddLocalizedNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddLocalizedNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddNewsRequestEvent != null) { foreach (var each in OnAdminAddNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddNewsResultEvent != null) { foreach (var each in OnAdminAddNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddPlayerTagRequestEvent != null) { foreach (var each in OnAdminAddPlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddPlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddPlayerTagResultEvent != null) { foreach (var each in OnAdminAddPlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddPlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnAdminAddUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddUserVirtualCurrencyResultEvent != null) { foreach (var each in OnAdminAddUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminAddVirtualCurrencyTypesRequestEvent != null) { foreach (var each in OnAdminAddVirtualCurrencyTypesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddVirtualCurrencyTypesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminAddVirtualCurrencyTypesResultEvent != null) { foreach (var each in OnAdminAddVirtualCurrencyTypesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminAddVirtualCurrencyTypesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminBanUsersRequestEvent != null) { foreach (var each in OnAdminBanUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminBanUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminBanUsersResultEvent != null) { foreach (var each in OnAdminBanUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminBanUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCheckLimitedEditionItemAvailabilityRequestEvent != null) { foreach (var each in OnAdminCheckLimitedEditionItemAvailabilityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCheckLimitedEditionItemAvailabilityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCheckLimitedEditionItemAvailabilityResultEvent != null) { foreach (var each in OnAdminCheckLimitedEditionItemAvailabilityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCheckLimitedEditionItemAvailabilityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent != null) { foreach (var each in OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent != null) { foreach (var each in OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateCloudScriptTaskRequestEvent != null) { foreach (var each in OnAdminCreateCloudScriptTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateCloudScriptTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateCloudScriptTaskResultEvent != null) { foreach (var each in OnAdminCreateCloudScriptTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateCloudScriptTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateInsightsScheduledScalingTaskRequestEvent != null) { foreach (var each in OnAdminCreateInsightsScheduledScalingTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateInsightsScheduledScalingTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateInsightsScheduledScalingTaskResultEvent != null) { foreach (var each in OnAdminCreateInsightsScheduledScalingTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateInsightsScheduledScalingTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminCreateOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminCreateOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreatePlayerSharedSecretRequestEvent != null) { foreach (var each in OnAdminCreatePlayerSharedSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerSharedSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreatePlayerSharedSecretResultEvent != null) { foreach (var each in OnAdminCreatePlayerSharedSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerSharedSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreatePlayerStatisticDefinitionRequestEvent != null) { foreach (var each in OnAdminCreatePlayerStatisticDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerStatisticDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreatePlayerStatisticDefinitionResultEvent != null) { foreach (var each in OnAdminCreatePlayerStatisticDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreatePlayerStatisticDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminCreateSegmentRequestEvent != null) { foreach (var each in OnAdminCreateSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminCreateSegmentResultEvent != null) { foreach (var each in OnAdminCreateSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminCreateSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteContentRequestEvent != null) { foreach (var each in OnAdminDeleteContentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteContentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteContentResultEvent != null) { foreach (var each in OnAdminDeleteContentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteContentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteMasterPlayerAccountRequestEvent != null) { foreach (var each in OnAdminDeleteMasterPlayerAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMasterPlayerAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteMasterPlayerAccountResultEvent != null) { foreach (var each in OnAdminDeleteMasterPlayerAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMasterPlayerAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteMembershipSubscriptionRequestEvent != null) { foreach (var each in OnAdminDeleteMembershipSubscriptionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMembershipSubscriptionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteMembershipSubscriptionResultEvent != null) { foreach (var each in OnAdminDeleteMembershipSubscriptionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteMembershipSubscriptionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminDeleteOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminDeleteOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeletePlayerRequestEvent != null) { foreach (var each in OnAdminDeletePlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeletePlayerResultEvent != null) { foreach (var each in OnAdminDeletePlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeletePlayerSharedSecretRequestEvent != null) { foreach (var each in OnAdminDeletePlayerSharedSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerSharedSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeletePlayerSharedSecretResultEvent != null) { foreach (var each in OnAdminDeletePlayerSharedSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeletePlayerSharedSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteSegmentRequestEvent != null) { foreach (var each in OnAdminDeleteSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteSegmentResultEvent != null) { foreach (var each in OnAdminDeleteSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteStoreRequestEvent != null) { foreach (var each in OnAdminDeleteStoreRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteStoreRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteStoreResultEvent != null) { foreach (var each in OnAdminDeleteStoreResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteStoreResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteTaskRequestEvent != null) { foreach (var each in OnAdminDeleteTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteTaskResultEvent != null) { foreach (var each in OnAdminDeleteTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteTitleRequestEvent != null) { foreach (var each in OnAdminDeleteTitleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteTitleResultEvent != null) { foreach (var each in OnAdminDeleteTitleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminDeleteTitleDataOverrideRequestEvent != null) { foreach (var each in OnAdminDeleteTitleDataOverrideRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleDataOverrideRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminDeleteTitleDataOverrideResultEvent != null) { foreach (var each in OnAdminDeleteTitleDataOverrideResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminDeleteTitleDataOverrideResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminExportMasterPlayerDataRequestEvent != null) { foreach (var each in OnAdminExportMasterPlayerDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportMasterPlayerDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminExportMasterPlayerDataResultEvent != null) { foreach (var each in OnAdminExportMasterPlayerDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportMasterPlayerDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminExportPlayersInSegmentRequestEvent != null) { foreach (var each in OnAdminExportPlayersInSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportPlayersInSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminExportPlayersInSegmentResultEvent != null) { foreach (var each in OnAdminExportPlayersInSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminExportPlayersInSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent != null) { foreach (var each in OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent != null) { foreach (var each in OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetAllSegmentsRequestEvent != null) { foreach (var each in OnAdminGetAllSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetAllSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetAllSegmentsResultEvent != null) { foreach (var each in OnAdminGetAllSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetAllSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCatalogItemsRequestEvent != null) { foreach (var each in OnAdminGetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCatalogItemsResultEvent != null) { foreach (var each in OnAdminGetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCloudScriptRevisionRequestEvent != null) { foreach (var each in OnAdminGetCloudScriptRevisionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptRevisionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCloudScriptRevisionResultEvent != null) { foreach (var each in OnAdminGetCloudScriptRevisionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptRevisionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCloudScriptTaskInstanceRequestEvent != null) { foreach (var each in OnAdminGetCloudScriptTaskInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptTaskInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCloudScriptTaskInstanceResultEvent != null) { foreach (var each in OnAdminGetCloudScriptTaskInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptTaskInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetCloudScriptVersionsRequestEvent != null) { foreach (var each in OnAdminGetCloudScriptVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetCloudScriptVersionsResultEvent != null) { foreach (var each in OnAdminGetCloudScriptVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetCloudScriptVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetContentListRequestEvent != null) { foreach (var each in OnAdminGetContentListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetContentListResultEvent != null) { foreach (var each in OnAdminGetContentListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetContentUploadUrlRequestEvent != null) { foreach (var each in OnAdminGetContentUploadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentUploadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetContentUploadUrlResultEvent != null) { foreach (var each in OnAdminGetContentUploadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetContentUploadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetDataReportRequestEvent != null) { foreach (var each in OnAdminGetDataReportRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetDataReportRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetDataReportResultEvent != null) { foreach (var each in OnAdminGetDataReportResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetDataReportResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetMatchmakerGameInfoRequestEvent != null) { foreach (var each in OnAdminGetMatchmakerGameInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetMatchmakerGameInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetMatchmakerGameInfoResultEvent != null) { foreach (var each in OnAdminGetMatchmakerGameInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetMatchmakerGameInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetMatchmakerGameModesRequestEvent != null) { foreach (var each in OnAdminGetMatchmakerGameModesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetMatchmakerGameModesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetMatchmakerGameModesResultEvent != null) { foreach (var each in OnAdminGetMatchmakerGameModesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetMatchmakerGameModesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayedTitleListRequestEvent != null) { foreach (var each in OnAdminGetPlayedTitleListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayedTitleListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayedTitleListResultEvent != null) { foreach (var each in OnAdminGetPlayedTitleListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayedTitleListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerIdFromAuthTokenRequestEvent != null) { foreach (var each in OnAdminGetPlayerIdFromAuthTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerIdFromAuthTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerIdFromAuthTokenResultEvent != null) { foreach (var each in OnAdminGetPlayerIdFromAuthTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerIdFromAuthTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerProfileRequestEvent != null) { foreach (var each in OnAdminGetPlayerProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerProfileResultEvent != null) { foreach (var each in OnAdminGetPlayerProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerSegmentsRequestEvent != null) { foreach (var each in OnAdminGetPlayerSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerSegmentsResultEvent != null) { foreach (var each in OnAdminGetPlayerSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerSharedSecretsRequestEvent != null) { foreach (var each in OnAdminGetPlayerSharedSecretsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSharedSecretsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerSharedSecretsResultEvent != null) { foreach (var each in OnAdminGetPlayerSharedSecretsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerSharedSecretsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayersInSegmentRequestEvent != null) { foreach (var each in OnAdminGetPlayersInSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayersInSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayersInSegmentResultEvent != null) { foreach (var each in OnAdminGetPlayersInSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayersInSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerStatisticDefinitionsRequestEvent != null) { foreach (var each in OnAdminGetPlayerStatisticDefinitionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticDefinitionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerStatisticDefinitionsResultEvent != null) { foreach (var each in OnAdminGetPlayerStatisticDefinitionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticDefinitionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerStatisticVersionsRequestEvent != null) { foreach (var each in OnAdminGetPlayerStatisticVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerStatisticVersionsResultEvent != null) { foreach (var each in OnAdminGetPlayerStatisticVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerStatisticVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPlayerTagsRequestEvent != null) { foreach (var each in OnAdminGetPlayerTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPlayerTagsResultEvent != null) { foreach (var each in OnAdminGetPlayerTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPlayerTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPolicyRequestEvent != null) { foreach (var each in OnAdminGetPolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPolicyResultEvent != null) { foreach (var each in OnAdminGetPolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetPublisherDataRequestEvent != null) { foreach (var each in OnAdminGetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetPublisherDataResultEvent != null) { foreach (var each in OnAdminGetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetRandomResultTablesRequestEvent != null) { foreach (var each in OnAdminGetRandomResultTablesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetRandomResultTablesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetRandomResultTablesResultEvent != null) { foreach (var each in OnAdminGetRandomResultTablesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetRandomResultTablesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetSegmentExportRequestEvent != null) { foreach (var each in OnAdminGetSegmentExportRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentExportRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetSegmentExportResultEvent != null) { foreach (var each in OnAdminGetSegmentExportResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentExportResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetSegmentsRequestEvent != null) { foreach (var each in OnAdminGetSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetSegmentsResultEvent != null) { foreach (var each in OnAdminGetSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetStoreItemsRequestEvent != null) { foreach (var each in OnAdminGetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetStoreItemsResultEvent != null) { foreach (var each in OnAdminGetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTaskInstancesRequestEvent != null) { foreach (var each in OnAdminGetTaskInstancesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTaskInstancesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTaskInstancesResultEvent != null) { foreach (var each in OnAdminGetTaskInstancesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTaskInstancesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTasksRequestEvent != null) { foreach (var each in OnAdminGetTasksRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTasksRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTasksResultEvent != null) { foreach (var each in OnAdminGetTasksResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTasksResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTitleDataRequestEvent != null) { foreach (var each in OnAdminGetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTitleDataResultEvent != null) { foreach (var each in OnAdminGetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetTitleInternalDataRequestEvent != null) { foreach (var each in OnAdminGetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetTitleInternalDataResultEvent != null) { foreach (var each in OnAdminGetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserAccountInfoRequestEvent != null) { foreach (var each in OnAdminGetUserAccountInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserAccountInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserAccountInfoResultEvent != null) { foreach (var each in OnAdminGetUserAccountInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserAccountInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserBansRequestEvent != null) { foreach (var each in OnAdminGetUserBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserBansResultEvent != null) { foreach (var each in OnAdminGetUserBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserDataRequestEvent != null) { foreach (var each in OnAdminGetUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserDataResultEvent != null) { foreach (var each in OnAdminGetUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserInternalDataRequestEvent != null) { foreach (var each in OnAdminGetUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserInternalDataResultEvent != null) { foreach (var each in OnAdminGetUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserInventoryRequestEvent != null) { foreach (var each in OnAdminGetUserInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserInventoryResultEvent != null) { foreach (var each in OnAdminGetUserInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserPublisherDataRequestEvent != null) { foreach (var each in OnAdminGetUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserPublisherDataResultEvent != null) { foreach (var each in OnAdminGetUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnAdminGetUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserPublisherInternalDataResultEvent != null) { foreach (var each in OnAdminGetUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminGetUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnAdminGetUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGetUserReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminGetUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGetUserReadOnlyDataResultEvent != null) { foreach (var each in OnAdminGetUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGetUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminGrantItemsToUsersRequestEvent != null) { foreach (var each in OnAdminGrantItemsToUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGrantItemsToUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminGrantItemsToUsersResultEvent != null) { foreach (var each in OnAdminGrantItemsToUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminGrantItemsToUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent != null) { foreach (var each in OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminIncrementLimitedEditionItemAvailabilityResultEvent != null) { foreach (var each in OnAdminIncrementLimitedEditionItemAvailabilityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementLimitedEditionItemAvailabilityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminIncrementPlayerStatisticVersionRequestEvent != null) { foreach (var each in OnAdminIncrementPlayerStatisticVersionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementPlayerStatisticVersionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminIncrementPlayerStatisticVersionResultEvent != null) { foreach (var each in OnAdminIncrementPlayerStatisticVersionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminIncrementPlayerStatisticVersionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminListOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminListOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminListOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminListOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminListVirtualCurrencyTypesRequestEvent != null) { foreach (var each in OnAdminListVirtualCurrencyTypesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListVirtualCurrencyTypesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminListVirtualCurrencyTypesResultEvent != null) { foreach (var each in OnAdminListVirtualCurrencyTypesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminListVirtualCurrencyTypesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminModifyServerBuildRequestEvent != null) { foreach (var each in OnAdminModifyServerBuildRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminModifyServerBuildRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminModifyServerBuildResultEvent != null) { foreach (var each in OnAdminModifyServerBuildResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminModifyServerBuildResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRefundPurchaseRequestEvent != null) { foreach (var each in OnAdminRefundPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRefundPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRefundPurchaseResultEvent != null) { foreach (var each in OnAdminRefundPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRefundPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRemovePlayerTagRequestEvent != null) { foreach (var each in OnAdminRemovePlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemovePlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRemovePlayerTagResultEvent != null) { foreach (var each in OnAdminRemovePlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemovePlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRemoveVirtualCurrencyTypesRequestEvent != null) { foreach (var each in OnAdminRemoveVirtualCurrencyTypesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemoveVirtualCurrencyTypesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRemoveVirtualCurrencyTypesResultEvent != null) { foreach (var each in OnAdminRemoveVirtualCurrencyTypesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRemoveVirtualCurrencyTypesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResetCharacterStatisticsRequestEvent != null) { foreach (var each in OnAdminResetCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResetCharacterStatisticsResultEvent != null) { foreach (var each in OnAdminResetCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResetPasswordRequestEvent != null) { foreach (var each in OnAdminResetPasswordRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetPasswordRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResetPasswordResultEvent != null) { foreach (var each in OnAdminResetPasswordResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetPasswordResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResetUserStatisticsRequestEvent != null) { foreach (var each in OnAdminResetUserStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetUserStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResetUserStatisticsResultEvent != null) { foreach (var each in OnAdminResetUserStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResetUserStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminResolvePurchaseDisputeRequestEvent != null) { foreach (var each in OnAdminResolvePurchaseDisputeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResolvePurchaseDisputeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminResolvePurchaseDisputeResultEvent != null) { foreach (var each in OnAdminResolvePurchaseDisputeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminResolvePurchaseDisputeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeAllBansForUserRequestEvent != null) { foreach (var each in OnAdminRevokeAllBansForUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeAllBansForUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeAllBansForUserResultEvent != null) { foreach (var each in OnAdminRevokeAllBansForUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeAllBansForUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeBansRequestEvent != null) { foreach (var each in OnAdminRevokeBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeBansResultEvent != null) { foreach (var each in OnAdminRevokeBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeInventoryItemRequestEvent != null) { foreach (var each in OnAdminRevokeInventoryItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeInventoryItemResultEvent != null) { foreach (var each in OnAdminRevokeInventoryItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRevokeInventoryItemsRequestEvent != null) { foreach (var each in OnAdminRevokeInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRevokeInventoryItemsResultEvent != null) { foreach (var each in OnAdminRevokeInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRevokeInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminRunTaskRequestEvent != null) { foreach (var each in OnAdminRunTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRunTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminRunTaskResultEvent != null) { foreach (var each in OnAdminRunTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminRunTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSendAccountRecoveryEmailRequestEvent != null) { foreach (var each in OnAdminSendAccountRecoveryEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSendAccountRecoveryEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSendAccountRecoveryEmailResultEvent != null) { foreach (var each in OnAdminSendAccountRecoveryEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSendAccountRecoveryEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetCatalogItemsRequestEvent != null) { foreach (var each in OnAdminSetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetCatalogItemsResultEvent != null) { foreach (var each in OnAdminSetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetMembershipOverrideRequestEvent != null) { foreach (var each in OnAdminSetMembershipOverrideRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetMembershipOverrideRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetMembershipOverrideResultEvent != null) { foreach (var each in OnAdminSetMembershipOverrideResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetMembershipOverrideResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetPlayerSecretRequestEvent != null) { foreach (var each in OnAdminSetPlayerSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPlayerSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetPlayerSecretResultEvent != null) { foreach (var each in OnAdminSetPlayerSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPlayerSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetPublishedRevisionRequestEvent != null) { foreach (var each in OnAdminSetPublishedRevisionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublishedRevisionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetPublishedRevisionResultEvent != null) { foreach (var each in OnAdminSetPublishedRevisionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublishedRevisionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetPublisherDataRequestEvent != null) { foreach (var each in OnAdminSetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetPublisherDataResultEvent != null) { foreach (var each in OnAdminSetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetStoreItemsRequestEvent != null) { foreach (var each in OnAdminSetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetStoreItemsResultEvent != null) { foreach (var each in OnAdminSetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetTitleDataRequestEvent != null) { foreach (var each in OnAdminSetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetTitleDataResultEvent != null) { foreach (var each in OnAdminSetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetTitleDataAndOverridesRequestEvent != null) { foreach (var each in OnAdminSetTitleDataAndOverridesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataAndOverridesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetTitleDataAndOverridesResultEvent != null) { foreach (var each in OnAdminSetTitleDataAndOverridesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleDataAndOverridesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetTitleInternalDataRequestEvent != null) { foreach (var each in OnAdminSetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetTitleInternalDataResultEvent != null) { foreach (var each in OnAdminSetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSetupPushNotificationRequestEvent != null) { foreach (var each in OnAdminSetupPushNotificationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetupPushNotificationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSetupPushNotificationResultEvent != null) { foreach (var each in OnAdminSetupPushNotificationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSetupPushNotificationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminSubtractUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnAdminSubtractUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSubtractUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminSubtractUserVirtualCurrencyResultEvent != null) { foreach (var each in OnAdminSubtractUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminSubtractUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateBansRequestEvent != null) { foreach (var each in OnAdminUpdateBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateBansResultEvent != null) { foreach (var each in OnAdminUpdateBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateCatalogItemsRequestEvent != null) { foreach (var each in OnAdminUpdateCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateCatalogItemsResultEvent != null) { foreach (var each in OnAdminUpdateCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateCloudScriptRequestEvent != null) { foreach (var each in OnAdminUpdateCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateCloudScriptResultEvent != null) { foreach (var each in OnAdminUpdateCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateOpenIdConnectionRequestEvent != null) { foreach (var each in OnAdminUpdateOpenIdConnectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateOpenIdConnectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateOpenIdConnectionResultEvent != null) { foreach (var each in OnAdminUpdateOpenIdConnectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateOpenIdConnectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdatePlayerSharedSecretRequestEvent != null) { foreach (var each in OnAdminUpdatePlayerSharedSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerSharedSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdatePlayerSharedSecretResultEvent != null) { foreach (var each in OnAdminUpdatePlayerSharedSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerSharedSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdatePlayerStatisticDefinitionRequestEvent != null) { foreach (var each in OnAdminUpdatePlayerStatisticDefinitionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerStatisticDefinitionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdatePlayerStatisticDefinitionResultEvent != null) { foreach (var each in OnAdminUpdatePlayerStatisticDefinitionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePlayerStatisticDefinitionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdatePolicyRequestEvent != null) { foreach (var each in OnAdminUpdatePolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdatePolicyResultEvent != null) { foreach (var each in OnAdminUpdatePolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdatePolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateRandomResultTablesRequestEvent != null) { foreach (var each in OnAdminUpdateRandomResultTablesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateRandomResultTablesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateRandomResultTablesResultEvent != null) { foreach (var each in OnAdminUpdateRandomResultTablesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateRandomResultTablesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateSegmentRequestEvent != null) { foreach (var each in OnAdminUpdateSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateSegmentResultEvent != null) { foreach (var each in OnAdminUpdateSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateStoreItemsRequestEvent != null) { foreach (var each in OnAdminUpdateStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateStoreItemsResultEvent != null) { foreach (var each in OnAdminUpdateStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateTaskRequestEvent != null) { foreach (var each in OnAdminUpdateTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateTaskResultEvent != null) { foreach (var each in OnAdminUpdateTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserDataResultEvent != null) { foreach (var each in OnAdminUpdateUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserInternalDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserInternalDataResultEvent != null) { foreach (var each in OnAdminUpdateUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserPublisherDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserPublisherDataResultEvent != null) { foreach (var each in OnAdminUpdateUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserPublisherInternalDataResultEvent != null) { foreach (var each in OnAdminUpdateUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnAdminUpdateUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserReadOnlyDataRequestEvent != null) { foreach (var each in OnAdminUpdateUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserReadOnlyDataResultEvent != null) { foreach (var each in OnAdminUpdateUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAdminUpdateUserTitleDisplayNameRequestEvent != null) { foreach (var each in OnAdminUpdateUserTitleDisplayNameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserTitleDisplayNameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAdminUpdateUserTitleDisplayNameResultEvent != null) { foreach (var each in OnAdminUpdateUserTitleDisplayNameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAdminUpdateUserTitleDisplayNameResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABCLIENT_API + if (OnAcceptTradeRequestEvent != null) { foreach (var each in OnAcceptTradeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAcceptTradeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAcceptTradeResultEvent != null) { foreach (var each in OnAcceptTradeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAcceptTradeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddFriendRequestEvent != null) { foreach (var each in OnAddFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddFriendResultEvent != null) { foreach (var each in OnAddFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddGenericIDRequestEvent != null) { foreach (var each in OnAddGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddGenericIDResultEvent != null) { foreach (var each in OnAddGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddOrUpdateContactEmailRequestEvent != null) { foreach (var each in OnAddOrUpdateContactEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddOrUpdateContactEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddOrUpdateContactEmailResultEvent != null) { foreach (var each in OnAddOrUpdateContactEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddOrUpdateContactEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddSharedGroupMembersRequestEvent != null) { foreach (var each in OnAddSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddSharedGroupMembersResultEvent != null) { foreach (var each in OnAddSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddUsernamePasswordRequestEvent != null) { foreach (var each in OnAddUsernamePasswordRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUsernamePasswordRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddUsernamePasswordResultEvent != null) { foreach (var each in OnAddUsernamePasswordResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUsernamePasswordResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAddUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnAddUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAddUserVirtualCurrencyResultEvent != null) { foreach (var each in OnAddUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAddUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAndroidDevicePushNotificationRegistrationRequestEvent != null) { foreach (var each in OnAndroidDevicePushNotificationRegistrationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAndroidDevicePushNotificationRegistrationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAndroidDevicePushNotificationRegistrationResultEvent != null) { foreach (var each in OnAndroidDevicePushNotificationRegistrationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAndroidDevicePushNotificationRegistrationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAttributeInstallRequestEvent != null) { foreach (var each in OnAttributeInstallRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAttributeInstallRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAttributeInstallResultEvent != null) { foreach (var each in OnAttributeInstallResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAttributeInstallResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCancelTradeRequestEvent != null) { foreach (var each in OnCancelTradeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCancelTradeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCancelTradeResultEvent != null) { foreach (var each in OnCancelTradeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCancelTradeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConfirmPurchaseRequestEvent != null) { foreach (var each in OnConfirmPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConfirmPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConfirmPurchaseResultEvent != null) { foreach (var each in OnConfirmPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConfirmPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumeItemRequestEvent != null) { foreach (var each in OnConsumeItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumeItemResultEvent != null) { foreach (var each in OnConsumeItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumeMicrosoftStoreEntitlementsRequestEvent != null) { foreach (var each in OnConsumeMicrosoftStoreEntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeMicrosoftStoreEntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumeMicrosoftStoreEntitlementsResultEvent != null) { foreach (var each in OnConsumeMicrosoftStoreEntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeMicrosoftStoreEntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumePS5EntitlementsRequestEvent != null) { foreach (var each in OnConsumePS5EntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePS5EntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumePS5EntitlementsResultEvent != null) { foreach (var each in OnConsumePS5EntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePS5EntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumePSNEntitlementsRequestEvent != null) { foreach (var each in OnConsumePSNEntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePSNEntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumePSNEntitlementsResultEvent != null) { foreach (var each in OnConsumePSNEntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumePSNEntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnConsumeXboxEntitlementsRequestEvent != null) { foreach (var each in OnConsumeXboxEntitlementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeXboxEntitlementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnConsumeXboxEntitlementsResultEvent != null) { foreach (var each in OnConsumeXboxEntitlementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnConsumeXboxEntitlementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCreateSharedGroupRequestEvent != null) { foreach (var each in OnCreateSharedGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCreateSharedGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCreateSharedGroupResultEvent != null) { foreach (var each in OnCreateSharedGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCreateSharedGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExecuteCloudScriptRequestEvent != null) { foreach (var each in OnExecuteCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExecuteCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExecuteCloudScriptResultEvent != null) { foreach (var each in OnExecuteCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExecuteCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetAccountInfoRequestEvent != null) { foreach (var each in OnGetAccountInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAccountInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetAccountInfoResultEvent != null) { foreach (var each in OnGetAccountInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAccountInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetAdPlacementsRequestEvent != null) { foreach (var each in OnGetAdPlacementsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAdPlacementsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetAdPlacementsResultEvent != null) { foreach (var each in OnGetAdPlacementsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAdPlacementsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetAllUsersCharactersRequestEvent != null) { foreach (var each in OnGetAllUsersCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAllUsersCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetAllUsersCharactersResultEvent != null) { foreach (var each in OnGetAllUsersCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetAllUsersCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCatalogItemsRequestEvent != null) { foreach (var each in OnGetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCatalogItemsResultEvent != null) { foreach (var each in OnGetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterDataRequestEvent != null) { foreach (var each in OnGetCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterDataResultEvent != null) { foreach (var each in OnGetCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterInventoryRequestEvent != null) { foreach (var each in OnGetCharacterInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterInventoryResultEvent != null) { foreach (var each in OnGetCharacterInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterLeaderboardRequestEvent != null) { foreach (var each in OnGetCharacterLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterLeaderboardResultEvent != null) { foreach (var each in OnGetCharacterLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterReadOnlyDataRequestEvent != null) { foreach (var each in OnGetCharacterReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterReadOnlyDataResultEvent != null) { foreach (var each in OnGetCharacterReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCharacterStatisticsRequestEvent != null) { foreach (var each in OnGetCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCharacterStatisticsResultEvent != null) { foreach (var each in OnGetCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetContentDownloadUrlRequestEvent != null) { foreach (var each in OnGetContentDownloadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetContentDownloadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetContentDownloadUrlResultEvent != null) { foreach (var each in OnGetContentDownloadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetContentDownloadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetCurrentGamesRequestEvent != null) { foreach (var each in OnGetCurrentGamesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCurrentGamesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetCurrentGamesResultEvent != null) { foreach (var each in OnGetCurrentGamesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetCurrentGamesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetFriendLeaderboardRequestEvent != null) { foreach (var each in OnGetFriendLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetFriendLeaderboardResultEvent != null) { foreach (var each in OnGetFriendLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetFriendLeaderboardAroundPlayerRequestEvent != null) { foreach (var each in OnGetFriendLeaderboardAroundPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardAroundPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetFriendLeaderboardAroundPlayerResultEvent != null) { foreach (var each in OnGetFriendLeaderboardAroundPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendLeaderboardAroundPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetFriendsListRequestEvent != null) { foreach (var each in OnGetFriendsListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendsListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetFriendsListResultEvent != null) { foreach (var each in OnGetFriendsListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetFriendsListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetGameServerRegionsRequestEvent != null) { foreach (var each in OnGetGameServerRegionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetGameServerRegionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetGameServerRegionsResultEvent != null) { foreach (var each in OnGetGameServerRegionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetGameServerRegionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardRequestEvent != null) { foreach (var each in OnGetLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardResultEvent != null) { foreach (var each in OnGetLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardAroundCharacterRequestEvent != null) { foreach (var each in OnGetLeaderboardAroundCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardAroundCharacterResultEvent != null) { foreach (var each in OnGetLeaderboardAroundCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardAroundPlayerRequestEvent != null) { foreach (var each in OnGetLeaderboardAroundPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardAroundPlayerResultEvent != null) { foreach (var each in OnGetLeaderboardAroundPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardAroundPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetLeaderboardForUserCharactersRequestEvent != null) { foreach (var each in OnGetLeaderboardForUserCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardForUserCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetLeaderboardForUserCharactersResultEvent != null) { foreach (var each in OnGetLeaderboardForUserCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetLeaderboardForUserCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPaymentTokenRequestEvent != null) { foreach (var each in OnGetPaymentTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPaymentTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPaymentTokenResultEvent != null) { foreach (var each in OnGetPaymentTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPaymentTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPhotonAuthenticationTokenRequestEvent != null) { foreach (var each in OnGetPhotonAuthenticationTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPhotonAuthenticationTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPhotonAuthenticationTokenResultEvent != null) { foreach (var each in OnGetPhotonAuthenticationTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPhotonAuthenticationTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerCombinedInfoRequestEvent != null) { foreach (var each in OnGetPlayerCombinedInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerCombinedInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerCombinedInfoResultEvent != null) { foreach (var each in OnGetPlayerCombinedInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerCombinedInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerProfileRequestEvent != null) { foreach (var each in OnGetPlayerProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerProfileResultEvent != null) { foreach (var each in OnGetPlayerProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerSegmentsRequestEvent != null) { foreach (var each in OnGetPlayerSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerSegmentsResultEvent != null) { foreach (var each in OnGetPlayerSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerStatisticsRequestEvent != null) { foreach (var each in OnGetPlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerStatisticsResultEvent != null) { foreach (var each in OnGetPlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerStatisticVersionsRequestEvent != null) { foreach (var each in OnGetPlayerStatisticVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerStatisticVersionsResultEvent != null) { foreach (var each in OnGetPlayerStatisticVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerStatisticVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerTagsRequestEvent != null) { foreach (var each in OnGetPlayerTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerTagsResultEvent != null) { foreach (var each in OnGetPlayerTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayerTradesRequestEvent != null) { foreach (var each in OnGetPlayerTradesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTradesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayerTradesResultEvent != null) { foreach (var each in OnGetPlayerTradesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayerTradesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromFacebookIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromFacebookIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGameCenterIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGameCenterIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGameCenterIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGameCenterIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGameCenterIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGameCenterIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGenericIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGenericIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGenericIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGenericIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGenericIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGenericIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGoogleIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGoogleIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGoogleIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGoogleIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGoogleIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGoogleIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromKongregateIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromKongregateIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromKongregateIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromKongregateIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromKongregateIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromKongregateIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromPSNAccountIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromPSNAccountIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromPSNAccountIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromPSNAccountIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromSteamIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromSteamIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromSteamIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromSteamIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromSteamIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromSteamIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromTwitchIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromTwitchIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromTwitchIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromTwitchIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromTwitchIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromTwitchIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { foreach (var each in OnGetPlayFabIDsFromXboxLiveIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromXboxLiveIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { foreach (var each in OnGetPlayFabIDsFromXboxLiveIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPlayFabIDsFromXboxLiveIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPublisherDataRequestEvent != null) { foreach (var each in OnGetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPublisherDataResultEvent != null) { foreach (var each in OnGetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetPurchaseRequestEvent != null) { foreach (var each in OnGetPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetPurchaseResultEvent != null) { foreach (var each in OnGetPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetSharedGroupDataRequestEvent != null) { foreach (var each in OnGetSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetSharedGroupDataResultEvent != null) { foreach (var each in OnGetSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetStoreItemsRequestEvent != null) { foreach (var each in OnGetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetStoreItemsResultEvent != null) { foreach (var each in OnGetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTimeRequestEvent != null) { foreach (var each in OnGetTimeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTimeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTimeResultEvent != null) { foreach (var each in OnGetTimeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTimeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTitleDataRequestEvent != null) { foreach (var each in OnGetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTitleDataResultEvent != null) { foreach (var each in OnGetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTitleNewsRequestEvent != null) { foreach (var each in OnGetTitleNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTitleNewsResultEvent != null) { foreach (var each in OnGetTitleNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitleNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTitlePublicKeyRequestEvent != null) { foreach (var each in OnGetTitlePublicKeyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitlePublicKeyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTitlePublicKeyResultEvent != null) { foreach (var each in OnGetTitlePublicKeyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTitlePublicKeyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetTradeStatusRequestEvent != null) { foreach (var each in OnGetTradeStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTradeStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetTradeStatusResultEvent != null) { foreach (var each in OnGetTradeStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetTradeStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserDataRequestEvent != null) { foreach (var each in OnGetUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserDataResultEvent != null) { foreach (var each in OnGetUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserInventoryRequestEvent != null) { foreach (var each in OnGetUserInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserInventoryResultEvent != null) { foreach (var each in OnGetUserInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserPublisherDataRequestEvent != null) { foreach (var each in OnGetUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserPublisherDataResultEvent != null) { foreach (var each in OnGetUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnGetUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnGetUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGetUserReadOnlyDataRequestEvent != null) { foreach (var each in OnGetUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGetUserReadOnlyDataResultEvent != null) { foreach (var each in OnGetUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGetUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGrantCharacterToUserRequestEvent != null) { foreach (var each in OnGrantCharacterToUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGrantCharacterToUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGrantCharacterToUserResultEvent != null) { foreach (var each in OnGrantCharacterToUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGrantCharacterToUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkAndroidDeviceIDRequestEvent != null) { foreach (var each in OnLinkAndroidDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAndroidDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkAndroidDeviceIDResultEvent != null) { foreach (var each in OnLinkAndroidDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAndroidDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkAppleRequestEvent != null) { foreach (var each in OnLinkAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkAppleResultEvent != null) { foreach (var each in OnLinkAppleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkAppleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkCustomIDRequestEvent != null) { foreach (var each in OnLinkCustomIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkCustomIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkCustomIDResultEvent != null) { foreach (var each in OnLinkCustomIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkCustomIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkFacebookAccountRequestEvent != null) { foreach (var each in OnLinkFacebookAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkFacebookAccountResultEvent != null) { foreach (var each in OnLinkFacebookAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkFacebookInstantGamesIdRequestEvent != null) { foreach (var each in OnLinkFacebookInstantGamesIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookInstantGamesIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkFacebookInstantGamesIdResultEvent != null) { foreach (var each in OnLinkFacebookInstantGamesIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkFacebookInstantGamesIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkGameCenterAccountRequestEvent != null) { foreach (var each in OnLinkGameCenterAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGameCenterAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkGameCenterAccountResultEvent != null) { foreach (var each in OnLinkGameCenterAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGameCenterAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkGoogleAccountRequestEvent != null) { foreach (var each in OnLinkGoogleAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGoogleAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkGoogleAccountResultEvent != null) { foreach (var each in OnLinkGoogleAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGoogleAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkGooglePlayGamesServicesAccountRequestEvent != null) { foreach (var each in OnLinkGooglePlayGamesServicesAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGooglePlayGamesServicesAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkGooglePlayGamesServicesAccountResultEvent != null) { foreach (var each in OnLinkGooglePlayGamesServicesAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkGooglePlayGamesServicesAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkIOSDeviceIDRequestEvent != null) { foreach (var each in OnLinkIOSDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkIOSDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkIOSDeviceIDResultEvent != null) { foreach (var each in OnLinkIOSDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkIOSDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkKongregateRequestEvent != null) { foreach (var each in OnLinkKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkKongregateResultEvent != null) { foreach (var each in OnLinkKongregateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkKongregateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnLinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnLinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnLinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnLinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkOpenIdConnectRequestEvent != null) { foreach (var each in OnLinkOpenIdConnectRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkOpenIdConnectRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkOpenIdConnectResultEvent != null) { foreach (var each in OnLinkOpenIdConnectResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkOpenIdConnectResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkPSNAccountRequestEvent != null) { foreach (var each in OnLinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkPSNAccountResultEvent != null) { foreach (var each in OnLinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkSteamAccountRequestEvent != null) { foreach (var each in OnLinkSteamAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkSteamAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkSteamAccountResultEvent != null) { foreach (var each in OnLinkSteamAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkSteamAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkTwitchRequestEvent != null) { foreach (var each in OnLinkTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkTwitchResultEvent != null) { foreach (var each in OnLinkTwitchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkTwitchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLinkXboxAccountRequestEvent != null) { foreach (var each in OnLinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLinkXboxAccountResultEvent != null) { foreach (var each in OnLinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnLoginWithAndroidDeviceIDRequestEvent != null) { foreach (var each in OnLoginWithAndroidDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithAndroidDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithAppleRequestEvent != null) { foreach (var each in OnLoginWithAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithCustomIDRequestEvent != null) { foreach (var each in OnLoginWithCustomIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithCustomIDRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithEmailAddressRequestEvent != null) { foreach (var each in OnLoginWithEmailAddressRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithEmailAddressRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithFacebookRequestEvent != null) { foreach (var each in OnLoginWithFacebookRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithFacebookRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithFacebookInstantGamesIdRequestEvent != null) { foreach (var each in OnLoginWithFacebookInstantGamesIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithFacebookInstantGamesIdRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithGameCenterRequestEvent != null) { foreach (var each in OnLoginWithGameCenterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithGameCenterRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithGoogleAccountRequestEvent != null) { foreach (var each in OnLoginWithGoogleAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithGoogleAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithGooglePlayGamesServicesRequestEvent != null) { foreach (var each in OnLoginWithGooglePlayGamesServicesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithGooglePlayGamesServicesRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithIOSDeviceIDRequestEvent != null) { foreach (var each in OnLoginWithIOSDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithIOSDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithKongregateRequestEvent != null) { foreach (var each in OnLoginWithKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithNintendoServiceAccountRequestEvent != null) { foreach (var each in OnLoginWithNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnLoginWithNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithOpenIdConnectRequestEvent != null) { foreach (var each in OnLoginWithOpenIdConnectRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithOpenIdConnectRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithPlayFabRequestEvent != null) { foreach (var each in OnLoginWithPlayFabRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithPlayFabRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithPSNRequestEvent != null) { foreach (var each in OnLoginWithPSNRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithPSNRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithSteamRequestEvent != null) { foreach (var each in OnLoginWithSteamRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithSteamRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithTwitchRequestEvent != null) { foreach (var each in OnLoginWithTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnLoginWithXboxRequestEvent != null) { foreach (var each in OnLoginWithXboxRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLoginWithXboxRequestEvent -= (PlayFabRequestEvent)each; } } } + + if (OnMatchmakeRequestEvent != null) { foreach (var each in OnMatchmakeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMatchmakeResultEvent != null) { foreach (var each in OnMatchmakeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnOpenTradeRequestEvent != null) { foreach (var each in OnOpenTradeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnOpenTradeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnOpenTradeResultEvent != null) { foreach (var each in OnOpenTradeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnOpenTradeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnPayForPurchaseRequestEvent != null) { foreach (var each in OnPayForPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPayForPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnPayForPurchaseResultEvent != null) { foreach (var each in OnPayForPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPayForPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnPurchaseItemRequestEvent != null) { foreach (var each in OnPurchaseItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPurchaseItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnPurchaseItemResultEvent != null) { foreach (var each in OnPurchaseItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnPurchaseItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRedeemCouponRequestEvent != null) { foreach (var each in OnRedeemCouponRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRedeemCouponRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRedeemCouponResultEvent != null) { foreach (var each in OnRedeemCouponResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRedeemCouponResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRefreshPSNAuthTokenRequestEvent != null) { foreach (var each in OnRefreshPSNAuthTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRefreshPSNAuthTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRefreshPSNAuthTokenResultEvent != null) { foreach (var each in OnRefreshPSNAuthTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRefreshPSNAuthTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRegisterForIOSPushNotificationRequestEvent != null) { foreach (var each in OnRegisterForIOSPushNotificationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterForIOSPushNotificationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRegisterForIOSPushNotificationResultEvent != null) { foreach (var each in OnRegisterForIOSPushNotificationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterForIOSPushNotificationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRegisterPlayFabUserRequestEvent != null) { foreach (var each in OnRegisterPlayFabUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterPlayFabUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRegisterPlayFabUserResultEvent != null) { foreach (var each in OnRegisterPlayFabUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRegisterPlayFabUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveContactEmailRequestEvent != null) { foreach (var each in OnRemoveContactEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveContactEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveContactEmailResultEvent != null) { foreach (var each in OnRemoveContactEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveContactEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveFriendRequestEvent != null) { foreach (var each in OnRemoveFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveFriendResultEvent != null) { foreach (var each in OnRemoveFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveGenericIDRequestEvent != null) { foreach (var each in OnRemoveGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveGenericIDResultEvent != null) { foreach (var each in OnRemoveGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRemoveSharedGroupMembersRequestEvent != null) { foreach (var each in OnRemoveSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRemoveSharedGroupMembersResultEvent != null) { foreach (var each in OnRemoveSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRemoveSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnReportAdActivityRequestEvent != null) { foreach (var each in OnReportAdActivityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportAdActivityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnReportAdActivityResultEvent != null) { foreach (var each in OnReportAdActivityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportAdActivityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnReportDeviceInfoRequestEvent != null) { foreach (var each in OnReportDeviceInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportDeviceInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnReportDeviceInfoResultEvent != null) { foreach (var each in OnReportDeviceInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportDeviceInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnReportPlayerRequestEvent != null) { foreach (var each in OnReportPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnReportPlayerResultEvent != null) { foreach (var each in OnReportPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnReportPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRestoreIOSPurchasesRequestEvent != null) { foreach (var each in OnRestoreIOSPurchasesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRestoreIOSPurchasesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRestoreIOSPurchasesResultEvent != null) { foreach (var each in OnRestoreIOSPurchasesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRestoreIOSPurchasesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnRewardAdActivityRequestEvent != null) { foreach (var each in OnRewardAdActivityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRewardAdActivityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnRewardAdActivityResultEvent != null) { foreach (var each in OnRewardAdActivityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnRewardAdActivityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSendAccountRecoveryEmailRequestEvent != null) { foreach (var each in OnSendAccountRecoveryEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSendAccountRecoveryEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSendAccountRecoveryEmailResultEvent != null) { foreach (var each in OnSendAccountRecoveryEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSendAccountRecoveryEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSetFriendTagsRequestEvent != null) { foreach (var each in OnSetFriendTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetFriendTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSetFriendTagsResultEvent != null) { foreach (var each in OnSetFriendTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetFriendTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSetPlayerSecretRequestEvent != null) { foreach (var each in OnSetPlayerSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetPlayerSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSetPlayerSecretResultEvent != null) { foreach (var each in OnSetPlayerSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSetPlayerSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnStartPurchaseRequestEvent != null) { foreach (var each in OnStartPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnStartPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnStartPurchaseResultEvent != null) { foreach (var each in OnStartPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnStartPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnSubtractUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnSubtractUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSubtractUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnSubtractUserVirtualCurrencyResultEvent != null) { foreach (var each in OnSubtractUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnSubtractUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkAndroidDeviceIDRequestEvent != null) { foreach (var each in OnUnlinkAndroidDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAndroidDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkAndroidDeviceIDResultEvent != null) { foreach (var each in OnUnlinkAndroidDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAndroidDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkAppleRequestEvent != null) { foreach (var each in OnUnlinkAppleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAppleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkAppleResultEvent != null) { foreach (var each in OnUnlinkAppleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkAppleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkCustomIDRequestEvent != null) { foreach (var each in OnUnlinkCustomIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkCustomIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkCustomIDResultEvent != null) { foreach (var each in OnUnlinkCustomIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkCustomIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkFacebookAccountRequestEvent != null) { foreach (var each in OnUnlinkFacebookAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkFacebookAccountResultEvent != null) { foreach (var each in OnUnlinkFacebookAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkFacebookInstantGamesIdRequestEvent != null) { foreach (var each in OnUnlinkFacebookInstantGamesIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookInstantGamesIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkFacebookInstantGamesIdResultEvent != null) { foreach (var each in OnUnlinkFacebookInstantGamesIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkFacebookInstantGamesIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkGameCenterAccountRequestEvent != null) { foreach (var each in OnUnlinkGameCenterAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGameCenterAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkGameCenterAccountResultEvent != null) { foreach (var each in OnUnlinkGameCenterAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGameCenterAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkGoogleAccountRequestEvent != null) { foreach (var each in OnUnlinkGoogleAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGoogleAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkGoogleAccountResultEvent != null) { foreach (var each in OnUnlinkGoogleAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGoogleAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkGooglePlayGamesServicesAccountRequestEvent != null) { foreach (var each in OnUnlinkGooglePlayGamesServicesAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGooglePlayGamesServicesAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkGooglePlayGamesServicesAccountResultEvent != null) { foreach (var each in OnUnlinkGooglePlayGamesServicesAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkGooglePlayGamesServicesAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkIOSDeviceIDRequestEvent != null) { foreach (var each in OnUnlinkIOSDeviceIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkIOSDeviceIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkIOSDeviceIDResultEvent != null) { foreach (var each in OnUnlinkIOSDeviceIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkIOSDeviceIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkKongregateRequestEvent != null) { foreach (var each in OnUnlinkKongregateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkKongregateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkKongregateResultEvent != null) { foreach (var each in OnUnlinkKongregateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkKongregateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnUnlinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnUnlinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnUnlinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnUnlinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkOpenIdConnectRequestEvent != null) { foreach (var each in OnUnlinkOpenIdConnectRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkOpenIdConnectRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkOpenIdConnectResultEvent != null) { foreach (var each in OnUnlinkOpenIdConnectResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkOpenIdConnectResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkPSNAccountRequestEvent != null) { foreach (var each in OnUnlinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkPSNAccountResultEvent != null) { foreach (var each in OnUnlinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkSteamAccountRequestEvent != null) { foreach (var each in OnUnlinkSteamAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkSteamAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkSteamAccountResultEvent != null) { foreach (var each in OnUnlinkSteamAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkSteamAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkTwitchRequestEvent != null) { foreach (var each in OnUnlinkTwitchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkTwitchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkTwitchResultEvent != null) { foreach (var each in OnUnlinkTwitchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkTwitchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlinkXboxAccountRequestEvent != null) { foreach (var each in OnUnlinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlinkXboxAccountResultEvent != null) { foreach (var each in OnUnlinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlockContainerInstanceRequestEvent != null) { foreach (var each in OnUnlockContainerInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlockContainerInstanceResultEvent != null) { foreach (var each in OnUnlockContainerInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUnlockContainerItemRequestEvent != null) { foreach (var each in OnUnlockContainerItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUnlockContainerItemResultEvent != null) { foreach (var each in OnUnlockContainerItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUnlockContainerItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateAvatarUrlRequestEvent != null) { foreach (var each in OnUpdateAvatarUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateAvatarUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateAvatarUrlResultEvent != null) { foreach (var each in OnUpdateAvatarUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateAvatarUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateCharacterDataRequestEvent != null) { foreach (var each in OnUpdateCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateCharacterDataResultEvent != null) { foreach (var each in OnUpdateCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateCharacterStatisticsRequestEvent != null) { foreach (var each in OnUpdateCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateCharacterStatisticsResultEvent != null) { foreach (var each in OnUpdateCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdatePlayerStatisticsRequestEvent != null) { foreach (var each in OnUpdatePlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdatePlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdatePlayerStatisticsResultEvent != null) { foreach (var each in OnUpdatePlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdatePlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateSharedGroupDataRequestEvent != null) { foreach (var each in OnUpdateSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateSharedGroupDataResultEvent != null) { foreach (var each in OnUpdateSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateUserDataRequestEvent != null) { foreach (var each in OnUpdateUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateUserDataResultEvent != null) { foreach (var each in OnUpdateUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateUserPublisherDataRequestEvent != null) { foreach (var each in OnUpdateUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateUserPublisherDataResultEvent != null) { foreach (var each in OnUpdateUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnUpdateUserTitleDisplayNameRequestEvent != null) { foreach (var each in OnUpdateUserTitleDisplayNameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserTitleDisplayNameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnUpdateUserTitleDisplayNameResultEvent != null) { foreach (var each in OnUpdateUserTitleDisplayNameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnUpdateUserTitleDisplayNameResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateAmazonIAPReceiptRequestEvent != null) { foreach (var each in OnValidateAmazonIAPReceiptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateAmazonIAPReceiptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateAmazonIAPReceiptResultEvent != null) { foreach (var each in OnValidateAmazonIAPReceiptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateAmazonIAPReceiptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateGooglePlayPurchaseRequestEvent != null) { foreach (var each in OnValidateGooglePlayPurchaseRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateGooglePlayPurchaseRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateGooglePlayPurchaseResultEvent != null) { foreach (var each in OnValidateGooglePlayPurchaseResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateGooglePlayPurchaseResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateIOSReceiptRequestEvent != null) { foreach (var each in OnValidateIOSReceiptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateIOSReceiptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateIOSReceiptResultEvent != null) { foreach (var each in OnValidateIOSReceiptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateIOSReceiptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnValidateWindowsStoreReceiptRequestEvent != null) { foreach (var each in OnValidateWindowsStoreReceiptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateWindowsStoreReceiptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnValidateWindowsStoreReceiptResultEvent != null) { foreach (var each in OnValidateWindowsStoreReceiptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnValidateWindowsStoreReceiptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnWriteCharacterEventRequestEvent != null) { foreach (var each in OnWriteCharacterEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteCharacterEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnWriteCharacterEventResultEvent != null) { foreach (var each in OnWriteCharacterEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteCharacterEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnWritePlayerEventRequestEvent != null) { foreach (var each in OnWritePlayerEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWritePlayerEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnWritePlayerEventResultEvent != null) { foreach (var each in OnWritePlayerEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWritePlayerEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnWriteTitleEventRequestEvent != null) { foreach (var each in OnWriteTitleEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteTitleEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnWriteTitleEventResultEvent != null) { foreach (var each in OnWriteTitleEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnWriteTitleEventResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if ENABLE_PLAYFABSERVER_API + if (OnMatchmakerAuthUserRequestEvent != null) { foreach (var each in OnMatchmakerAuthUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerAuthUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMatchmakerAuthUserResultEvent != null) { foreach (var each in OnMatchmakerAuthUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerAuthUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMatchmakerPlayerJoinedRequestEvent != null) { foreach (var each in OnMatchmakerPlayerJoinedRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerPlayerJoinedRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMatchmakerPlayerJoinedResultEvent != null) { foreach (var each in OnMatchmakerPlayerJoinedResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerPlayerJoinedResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMatchmakerPlayerLeftRequestEvent != null) { foreach (var each in OnMatchmakerPlayerLeftRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerPlayerLeftRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMatchmakerPlayerLeftResultEvent != null) { foreach (var each in OnMatchmakerPlayerLeftResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerPlayerLeftResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMatchmakerUserInfoRequestEvent != null) { foreach (var each in OnMatchmakerUserInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerUserInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMatchmakerUserInfoResultEvent != null) { foreach (var each in OnMatchmakerUserInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMatchmakerUserInfoResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if ENABLE_PLAYFABSERVER_API + if (OnServerAddCharacterVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerAddCharacterVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddCharacterVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddCharacterVirtualCurrencyResultEvent != null) { foreach (var each in OnServerAddCharacterVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddCharacterVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddFriendRequestEvent != null) { foreach (var each in OnServerAddFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddFriendResultEvent != null) { foreach (var each in OnServerAddFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddGenericIDRequestEvent != null) { foreach (var each in OnServerAddGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddGenericIDResultEvent != null) { foreach (var each in OnServerAddGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddPlayerTagRequestEvent != null) { foreach (var each in OnServerAddPlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddPlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddPlayerTagResultEvent != null) { foreach (var each in OnServerAddPlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddPlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddSharedGroupMembersRequestEvent != null) { foreach (var each in OnServerAddSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddSharedGroupMembersResultEvent != null) { foreach (var each in OnServerAddSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAddUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerAddUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAddUserVirtualCurrencyResultEvent != null) { foreach (var each in OnServerAddUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAddUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAuthenticateSessionTicketRequestEvent != null) { foreach (var each in OnServerAuthenticateSessionTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAuthenticateSessionTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAuthenticateSessionTicketResultEvent != null) { foreach (var each in OnServerAuthenticateSessionTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAuthenticateSessionTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerAwardSteamAchievementRequestEvent != null) { foreach (var each in OnServerAwardSteamAchievementRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAwardSteamAchievementRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerAwardSteamAchievementResultEvent != null) { foreach (var each in OnServerAwardSteamAchievementResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerAwardSteamAchievementResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerBanUsersRequestEvent != null) { foreach (var each in OnServerBanUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerBanUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerBanUsersResultEvent != null) { foreach (var each in OnServerBanUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerBanUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerConsumeItemRequestEvent != null) { foreach (var each in OnServerConsumeItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerConsumeItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerConsumeItemResultEvent != null) { foreach (var each in OnServerConsumeItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerConsumeItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerCreateSharedGroupRequestEvent != null) { foreach (var each in OnServerCreateSharedGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerCreateSharedGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerCreateSharedGroupResultEvent != null) { foreach (var each in OnServerCreateSharedGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerCreateSharedGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeleteCharacterFromUserRequestEvent != null) { foreach (var each in OnServerDeleteCharacterFromUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteCharacterFromUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeleteCharacterFromUserResultEvent != null) { foreach (var each in OnServerDeleteCharacterFromUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteCharacterFromUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeletePlayerRequestEvent != null) { foreach (var each in OnServerDeletePlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeletePlayerResultEvent != null) { foreach (var each in OnServerDeletePlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeletePushNotificationTemplateRequestEvent != null) { foreach (var each in OnServerDeletePushNotificationTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePushNotificationTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeletePushNotificationTemplateResultEvent != null) { foreach (var each in OnServerDeletePushNotificationTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeletePushNotificationTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeleteSharedGroupRequestEvent != null) { foreach (var each in OnServerDeleteSharedGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteSharedGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeleteSharedGroupResultEvent != null) { foreach (var each in OnServerDeleteSharedGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeleteSharedGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerDeregisterGameRequestEvent != null) { foreach (var each in OnServerDeregisterGameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeregisterGameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerDeregisterGameResultEvent != null) { foreach (var each in OnServerDeregisterGameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerDeregisterGameResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerEvaluateRandomResultTableRequestEvent != null) { foreach (var each in OnServerEvaluateRandomResultTableRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerEvaluateRandomResultTableRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerEvaluateRandomResultTableResultEvent != null) { foreach (var each in OnServerEvaluateRandomResultTableResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerEvaluateRandomResultTableResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerExecuteCloudScriptRequestEvent != null) { foreach (var each in OnServerExecuteCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerExecuteCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerExecuteCloudScriptResultEvent != null) { foreach (var each in OnServerExecuteCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerExecuteCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetAllSegmentsRequestEvent != null) { foreach (var each in OnServerGetAllSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetAllSegmentsResultEvent != null) { foreach (var each in OnServerGetAllSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetAllUsersCharactersRequestEvent != null) { foreach (var each in OnServerGetAllUsersCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllUsersCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetAllUsersCharactersResultEvent != null) { foreach (var each in OnServerGetAllUsersCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetAllUsersCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCatalogItemsRequestEvent != null) { foreach (var each in OnServerGetCatalogItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCatalogItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCatalogItemsResultEvent != null) { foreach (var each in OnServerGetCatalogItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCatalogItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterDataRequestEvent != null) { foreach (var each in OnServerGetCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterDataResultEvent != null) { foreach (var each in OnServerGetCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterInternalDataRequestEvent != null) { foreach (var each in OnServerGetCharacterInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterInternalDataResultEvent != null) { foreach (var each in OnServerGetCharacterInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterInventoryRequestEvent != null) { foreach (var each in OnServerGetCharacterInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterInventoryResultEvent != null) { foreach (var each in OnServerGetCharacterInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterLeaderboardRequestEvent != null) { foreach (var each in OnServerGetCharacterLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterLeaderboardResultEvent != null) { foreach (var each in OnServerGetCharacterLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterReadOnlyDataRequestEvent != null) { foreach (var each in OnServerGetCharacterReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterReadOnlyDataResultEvent != null) { foreach (var each in OnServerGetCharacterReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetCharacterStatisticsRequestEvent != null) { foreach (var each in OnServerGetCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetCharacterStatisticsResultEvent != null) { foreach (var each in OnServerGetCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetContentDownloadUrlRequestEvent != null) { foreach (var each in OnServerGetContentDownloadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetContentDownloadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetContentDownloadUrlResultEvent != null) { foreach (var each in OnServerGetContentDownloadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetContentDownloadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetFriendLeaderboardRequestEvent != null) { foreach (var each in OnServerGetFriendLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetFriendLeaderboardResultEvent != null) { foreach (var each in OnServerGetFriendLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetFriendsListRequestEvent != null) { foreach (var each in OnServerGetFriendsListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendsListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetFriendsListResultEvent != null) { foreach (var each in OnServerGetFriendsListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetFriendsListResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardRequestEvent != null) { foreach (var each in OnServerGetLeaderboardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardResultEvent != null) { foreach (var each in OnServerGetLeaderboardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardAroundCharacterRequestEvent != null) { foreach (var each in OnServerGetLeaderboardAroundCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardAroundCharacterResultEvent != null) { foreach (var each in OnServerGetLeaderboardAroundCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardAroundUserRequestEvent != null) { foreach (var each in OnServerGetLeaderboardAroundUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardAroundUserResultEvent != null) { foreach (var each in OnServerGetLeaderboardAroundUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardAroundUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetLeaderboardForUserCharactersRequestEvent != null) { foreach (var each in OnServerGetLeaderboardForUserCharactersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardForUserCharactersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetLeaderboardForUserCharactersResultEvent != null) { foreach (var each in OnServerGetLeaderboardForUserCharactersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetLeaderboardForUserCharactersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerCombinedInfoRequestEvent != null) { foreach (var each in OnServerGetPlayerCombinedInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerCombinedInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerCombinedInfoResultEvent != null) { foreach (var each in OnServerGetPlayerCombinedInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerCombinedInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerProfileRequestEvent != null) { foreach (var each in OnServerGetPlayerProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerProfileResultEvent != null) { foreach (var each in OnServerGetPlayerProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerSegmentsRequestEvent != null) { foreach (var each in OnServerGetPlayerSegmentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerSegmentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerSegmentsResultEvent != null) { foreach (var each in OnServerGetPlayerSegmentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerSegmentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayersInSegmentRequestEvent != null) { foreach (var each in OnServerGetPlayersInSegmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayersInSegmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayersInSegmentResultEvent != null) { foreach (var each in OnServerGetPlayersInSegmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayersInSegmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerStatisticsRequestEvent != null) { foreach (var each in OnServerGetPlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerStatisticsResultEvent != null) { foreach (var each in OnServerGetPlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerStatisticVersionsRequestEvent != null) { foreach (var each in OnServerGetPlayerStatisticVersionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticVersionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerStatisticVersionsResultEvent != null) { foreach (var each in OnServerGetPlayerStatisticVersionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerStatisticVersionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayerTagsRequestEvent != null) { foreach (var each in OnServerGetPlayerTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayerTagsResultEvent != null) { foreach (var each in OnServerGetPlayerTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayerTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromFacebookIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromFacebookIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromGenericIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromGenericIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromGenericIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromGenericIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromGenericIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromGenericIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromSteamIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromSteamIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromSteamIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromSteamIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromSteamIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromSteamIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromTwitchIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromTwitchIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromTwitchIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromTwitchIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromTwitchIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromTwitchIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { foreach (var each in OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetPublisherDataRequestEvent != null) { foreach (var each in OnServerGetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetPublisherDataResultEvent != null) { foreach (var each in OnServerGetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetRandomResultTablesRequestEvent != null) { foreach (var each in OnServerGetRandomResultTablesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetRandomResultTablesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetRandomResultTablesResultEvent != null) { foreach (var each in OnServerGetRandomResultTablesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetRandomResultTablesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent != null) { foreach (var each in OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetServerCustomIDsFromPlayFabIDsResultEvent != null) { foreach (var each in OnServerGetServerCustomIDsFromPlayFabIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetServerCustomIDsFromPlayFabIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetSharedGroupDataRequestEvent != null) { foreach (var each in OnServerGetSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetSharedGroupDataResultEvent != null) { foreach (var each in OnServerGetSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetStoreItemsRequestEvent != null) { foreach (var each in OnServerGetStoreItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetStoreItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetStoreItemsResultEvent != null) { foreach (var each in OnServerGetStoreItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetStoreItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTimeRequestEvent != null) { foreach (var each in OnServerGetTimeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTimeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTimeResultEvent != null) { foreach (var each in OnServerGetTimeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTimeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTitleDataRequestEvent != null) { foreach (var each in OnServerGetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTitleDataResultEvent != null) { foreach (var each in OnServerGetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTitleInternalDataRequestEvent != null) { foreach (var each in OnServerGetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTitleInternalDataResultEvent != null) { foreach (var each in OnServerGetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetTitleNewsRequestEvent != null) { foreach (var each in OnServerGetTitleNewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleNewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetTitleNewsResultEvent != null) { foreach (var each in OnServerGetTitleNewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetTitleNewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserAccountInfoRequestEvent != null) { foreach (var each in OnServerGetUserAccountInfoRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserAccountInfoRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserAccountInfoResultEvent != null) { foreach (var each in OnServerGetUserAccountInfoResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserAccountInfoResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserBansRequestEvent != null) { foreach (var each in OnServerGetUserBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserBansResultEvent != null) { foreach (var each in OnServerGetUserBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserDataRequestEvent != null) { foreach (var each in OnServerGetUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserDataResultEvent != null) { foreach (var each in OnServerGetUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserInternalDataRequestEvent != null) { foreach (var each in OnServerGetUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserInternalDataResultEvent != null) { foreach (var each in OnServerGetUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserInventoryRequestEvent != null) { foreach (var each in OnServerGetUserInventoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInventoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserInventoryResultEvent != null) { foreach (var each in OnServerGetUserInventoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserInventoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserPublisherDataRequestEvent != null) { foreach (var each in OnServerGetUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserPublisherDataResultEvent != null) { foreach (var each in OnServerGetUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnServerGetUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserPublisherInternalDataResultEvent != null) { foreach (var each in OnServerGetUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnServerGetUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnServerGetUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGetUserReadOnlyDataRequestEvent != null) { foreach (var each in OnServerGetUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGetUserReadOnlyDataResultEvent != null) { foreach (var each in OnServerGetUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGetUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantCharacterToUserRequestEvent != null) { foreach (var each in OnServerGrantCharacterToUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantCharacterToUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantCharacterToUserResultEvent != null) { foreach (var each in OnServerGrantCharacterToUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantCharacterToUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantItemsToCharacterRequestEvent != null) { foreach (var each in OnServerGrantItemsToCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantItemsToCharacterResultEvent != null) { foreach (var each in OnServerGrantItemsToCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantItemsToUserRequestEvent != null) { foreach (var each in OnServerGrantItemsToUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantItemsToUserResultEvent != null) { foreach (var each in OnServerGrantItemsToUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerGrantItemsToUsersRequestEvent != null) { foreach (var each in OnServerGrantItemsToUsersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUsersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerGrantItemsToUsersResultEvent != null) { foreach (var each in OnServerGrantItemsToUsersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerGrantItemsToUsersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnServerLinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnServerLinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnServerLinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnServerLinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkPSNAccountRequestEvent != null) { foreach (var each in OnServerLinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkPSNAccountResultEvent != null) { foreach (var each in OnServerLinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkServerCustomIdRequestEvent != null) { foreach (var each in OnServerLinkServerCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkServerCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkServerCustomIdResultEvent != null) { foreach (var each in OnServerLinkServerCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkServerCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkSteamIdRequestEvent != null) { foreach (var each in OnServerLinkSteamIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkSteamIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkSteamIdResultEvent != null) { foreach (var each in OnServerLinkSteamIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkSteamIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLinkXboxAccountRequestEvent != null) { foreach (var each in OnServerLinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLinkXboxAccountResultEvent != null) { foreach (var each in OnServerLinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithServerCustomIdRequestEvent != null) { foreach (var each in OnServerLoginWithServerCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithServerCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithServerCustomIdResultEvent != null) { foreach (var each in OnServerLoginWithServerCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithServerCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithSteamIdRequestEvent != null) { foreach (var each in OnServerLoginWithSteamIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithSteamIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithSteamIdResultEvent != null) { foreach (var each in OnServerLoginWithSteamIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithSteamIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithXboxRequestEvent != null) { foreach (var each in OnServerLoginWithXboxRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithXboxResultEvent != null) { foreach (var each in OnServerLoginWithXboxResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerLoginWithXboxIdRequestEvent != null) { foreach (var each in OnServerLoginWithXboxIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerLoginWithXboxIdResultEvent != null) { foreach (var each in OnServerLoginWithXboxIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerLoginWithXboxIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerModifyItemUsesRequestEvent != null) { foreach (var each in OnServerModifyItemUsesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerModifyItemUsesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerModifyItemUsesResultEvent != null) { foreach (var each in OnServerModifyItemUsesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerModifyItemUsesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerMoveItemToCharacterFromCharacterRequestEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerMoveItemToCharacterFromCharacterResultEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerMoveItemToCharacterFromUserRequestEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerMoveItemToCharacterFromUserResultEvent != null) { foreach (var each in OnServerMoveItemToCharacterFromUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToCharacterFromUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerMoveItemToUserFromCharacterRequestEvent != null) { foreach (var each in OnServerMoveItemToUserFromCharacterRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToUserFromCharacterRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerMoveItemToUserFromCharacterResultEvent != null) { foreach (var each in OnServerMoveItemToUserFromCharacterResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerMoveItemToUserFromCharacterResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerNotifyMatchmakerPlayerLeftRequestEvent != null) { foreach (var each in OnServerNotifyMatchmakerPlayerLeftRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerNotifyMatchmakerPlayerLeftRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerNotifyMatchmakerPlayerLeftResultEvent != null) { foreach (var each in OnServerNotifyMatchmakerPlayerLeftResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerNotifyMatchmakerPlayerLeftResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRedeemCouponRequestEvent != null) { foreach (var each in OnServerRedeemCouponRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRedeemCouponRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRedeemCouponResultEvent != null) { foreach (var each in OnServerRedeemCouponResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRedeemCouponResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRedeemMatchmakerTicketRequestEvent != null) { foreach (var each in OnServerRedeemMatchmakerTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRedeemMatchmakerTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRedeemMatchmakerTicketResultEvent != null) { foreach (var each in OnServerRedeemMatchmakerTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRedeemMatchmakerTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRefreshGameServerInstanceHeartbeatRequestEvent != null) { foreach (var each in OnServerRefreshGameServerInstanceHeartbeatRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRefreshGameServerInstanceHeartbeatRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRefreshGameServerInstanceHeartbeatResultEvent != null) { foreach (var each in OnServerRefreshGameServerInstanceHeartbeatResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRefreshGameServerInstanceHeartbeatResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRegisterGameRequestEvent != null) { foreach (var each in OnServerRegisterGameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRegisterGameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRegisterGameResultEvent != null) { foreach (var each in OnServerRegisterGameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRegisterGameResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemoveFriendRequestEvent != null) { foreach (var each in OnServerRemoveFriendRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveFriendRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemoveFriendResultEvent != null) { foreach (var each in OnServerRemoveFriendResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveFriendResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemoveGenericIDRequestEvent != null) { foreach (var each in OnServerRemoveGenericIDRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveGenericIDRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemoveGenericIDResultEvent != null) { foreach (var each in OnServerRemoveGenericIDResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveGenericIDResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemovePlayerTagRequestEvent != null) { foreach (var each in OnServerRemovePlayerTagRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemovePlayerTagRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemovePlayerTagResultEvent != null) { foreach (var each in OnServerRemovePlayerTagResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemovePlayerTagResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRemoveSharedGroupMembersRequestEvent != null) { foreach (var each in OnServerRemoveSharedGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveSharedGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRemoveSharedGroupMembersResultEvent != null) { foreach (var each in OnServerRemoveSharedGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRemoveSharedGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerReportPlayerRequestEvent != null) { foreach (var each in OnServerReportPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerReportPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerReportPlayerResultEvent != null) { foreach (var each in OnServerReportPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerReportPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeAllBansForUserRequestEvent != null) { foreach (var each in OnServerRevokeAllBansForUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeAllBansForUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeAllBansForUserResultEvent != null) { foreach (var each in OnServerRevokeAllBansForUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeAllBansForUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeBansRequestEvent != null) { foreach (var each in OnServerRevokeBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeBansResultEvent != null) { foreach (var each in OnServerRevokeBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeInventoryItemRequestEvent != null) { foreach (var each in OnServerRevokeInventoryItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeInventoryItemResultEvent != null) { foreach (var each in OnServerRevokeInventoryItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerRevokeInventoryItemsRequestEvent != null) { foreach (var each in OnServerRevokeInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerRevokeInventoryItemsResultEvent != null) { foreach (var each in OnServerRevokeInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerRevokeInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSavePushNotificationTemplateRequestEvent != null) { foreach (var each in OnServerSavePushNotificationTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSavePushNotificationTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSavePushNotificationTemplateResultEvent != null) { foreach (var each in OnServerSavePushNotificationTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSavePushNotificationTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendCustomAccountRecoveryEmailRequestEvent != null) { foreach (var each in OnServerSendCustomAccountRecoveryEmailRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendCustomAccountRecoveryEmailRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendCustomAccountRecoveryEmailResultEvent != null) { foreach (var each in OnServerSendCustomAccountRecoveryEmailResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendCustomAccountRecoveryEmailResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendEmailFromTemplateRequestEvent != null) { foreach (var each in OnServerSendEmailFromTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendEmailFromTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendEmailFromTemplateResultEvent != null) { foreach (var each in OnServerSendEmailFromTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendEmailFromTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendPushNotificationRequestEvent != null) { foreach (var each in OnServerSendPushNotificationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendPushNotificationResultEvent != null) { foreach (var each in OnServerSendPushNotificationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSendPushNotificationFromTemplateRequestEvent != null) { foreach (var each in OnServerSendPushNotificationFromTemplateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationFromTemplateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSendPushNotificationFromTemplateResultEvent != null) { foreach (var each in OnServerSendPushNotificationFromTemplateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSendPushNotificationFromTemplateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetFriendTagsRequestEvent != null) { foreach (var each in OnServerSetFriendTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetFriendTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetFriendTagsResultEvent != null) { foreach (var each in OnServerSetFriendTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetFriendTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetGameServerInstanceDataRequestEvent != null) { foreach (var each in OnServerSetGameServerInstanceDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetGameServerInstanceDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetGameServerInstanceDataResultEvent != null) { foreach (var each in OnServerSetGameServerInstanceDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetGameServerInstanceDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetGameServerInstanceStateRequestEvent != null) { foreach (var each in OnServerSetGameServerInstanceStateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetGameServerInstanceStateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetGameServerInstanceStateResultEvent != null) { foreach (var each in OnServerSetGameServerInstanceStateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetGameServerInstanceStateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetGameServerInstanceTagsRequestEvent != null) { foreach (var each in OnServerSetGameServerInstanceTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetGameServerInstanceTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetGameServerInstanceTagsResultEvent != null) { foreach (var each in OnServerSetGameServerInstanceTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetGameServerInstanceTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetPlayerSecretRequestEvent != null) { foreach (var each in OnServerSetPlayerSecretRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPlayerSecretRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetPlayerSecretResultEvent != null) { foreach (var each in OnServerSetPlayerSecretResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPlayerSecretResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetPublisherDataRequestEvent != null) { foreach (var each in OnServerSetPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetPublisherDataResultEvent != null) { foreach (var each in OnServerSetPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetTitleDataRequestEvent != null) { foreach (var each in OnServerSetTitleDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetTitleDataResultEvent != null) { foreach (var each in OnServerSetTitleDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSetTitleInternalDataRequestEvent != null) { foreach (var each in OnServerSetTitleInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSetTitleInternalDataResultEvent != null) { foreach (var each in OnServerSetTitleInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSetTitleInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSubtractCharacterVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerSubtractCharacterVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractCharacterVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSubtractCharacterVirtualCurrencyResultEvent != null) { foreach (var each in OnServerSubtractCharacterVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractCharacterVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerSubtractUserVirtualCurrencyRequestEvent != null) { foreach (var each in OnServerSubtractUserVirtualCurrencyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractUserVirtualCurrencyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerSubtractUserVirtualCurrencyResultEvent != null) { foreach (var each in OnServerSubtractUserVirtualCurrencyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerSubtractUserVirtualCurrencyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkNintendoServiceAccountRequestEvent != null) { foreach (var each in OnServerUnlinkNintendoServiceAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoServiceAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkNintendoServiceAccountResultEvent != null) { foreach (var each in OnServerUnlinkNintendoServiceAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoServiceAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkNintendoSwitchDeviceIdRequestEvent != null) { foreach (var each in OnServerUnlinkNintendoSwitchDeviceIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoSwitchDeviceIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkNintendoSwitchDeviceIdResultEvent != null) { foreach (var each in OnServerUnlinkNintendoSwitchDeviceIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkNintendoSwitchDeviceIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkPSNAccountRequestEvent != null) { foreach (var each in OnServerUnlinkPSNAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkPSNAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkPSNAccountResultEvent != null) { foreach (var each in OnServerUnlinkPSNAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkPSNAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkServerCustomIdRequestEvent != null) { foreach (var each in OnServerUnlinkServerCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkServerCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkServerCustomIdResultEvent != null) { foreach (var each in OnServerUnlinkServerCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkServerCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkSteamIdRequestEvent != null) { foreach (var each in OnServerUnlinkSteamIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkSteamIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkSteamIdResultEvent != null) { foreach (var each in OnServerUnlinkSteamIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkSteamIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlinkXboxAccountRequestEvent != null) { foreach (var each in OnServerUnlinkXboxAccountRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkXboxAccountRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlinkXboxAccountResultEvent != null) { foreach (var each in OnServerUnlinkXboxAccountResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlinkXboxAccountResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlockContainerInstanceRequestEvent != null) { foreach (var each in OnServerUnlockContainerInstanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerInstanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlockContainerInstanceResultEvent != null) { foreach (var each in OnServerUnlockContainerInstanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerInstanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUnlockContainerItemRequestEvent != null) { foreach (var each in OnServerUnlockContainerItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUnlockContainerItemResultEvent != null) { foreach (var each in OnServerUnlockContainerItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUnlockContainerItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateAvatarUrlRequestEvent != null) { foreach (var each in OnServerUpdateAvatarUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateAvatarUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateAvatarUrlResultEvent != null) { foreach (var each in OnServerUpdateAvatarUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateAvatarUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateBansRequestEvent != null) { foreach (var each in OnServerUpdateBansRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateBansRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateBansResultEvent != null) { foreach (var each in OnServerUpdateBansResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateBansResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterDataRequestEvent != null) { foreach (var each in OnServerUpdateCharacterDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterDataResultEvent != null) { foreach (var each in OnServerUpdateCharacterDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterInternalDataRequestEvent != null) { foreach (var each in OnServerUpdateCharacterInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterInternalDataResultEvent != null) { foreach (var each in OnServerUpdateCharacterInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterReadOnlyDataRequestEvent != null) { foreach (var each in OnServerUpdateCharacterReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterReadOnlyDataResultEvent != null) { foreach (var each in OnServerUpdateCharacterReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateCharacterStatisticsRequestEvent != null) { foreach (var each in OnServerUpdateCharacterStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateCharacterStatisticsResultEvent != null) { foreach (var each in OnServerUpdateCharacterStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateCharacterStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdatePlayerStatisticsRequestEvent != null) { foreach (var each in OnServerUpdatePlayerStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdatePlayerStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdatePlayerStatisticsResultEvent != null) { foreach (var each in OnServerUpdatePlayerStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdatePlayerStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateSharedGroupDataRequestEvent != null) { foreach (var each in OnServerUpdateSharedGroupDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateSharedGroupDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateSharedGroupDataResultEvent != null) { foreach (var each in OnServerUpdateSharedGroupDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateSharedGroupDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserDataRequestEvent != null) { foreach (var each in OnServerUpdateUserDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserDataResultEvent != null) { foreach (var each in OnServerUpdateUserDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserInternalDataRequestEvent != null) { foreach (var each in OnServerUpdateUserInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserInternalDataResultEvent != null) { foreach (var each in OnServerUpdateUserInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserInventoryItemCustomDataRequestEvent != null) { foreach (var each in OnServerUpdateUserInventoryItemCustomDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInventoryItemCustomDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserInventoryItemCustomDataResultEvent != null) { foreach (var each in OnServerUpdateUserInventoryItemCustomDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserInventoryItemCustomDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserPublisherDataRequestEvent != null) { foreach (var each in OnServerUpdateUserPublisherDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserPublisherDataResultEvent != null) { foreach (var each in OnServerUpdateUserPublisherDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserPublisherInternalDataRequestEvent != null) { foreach (var each in OnServerUpdateUserPublisherInternalDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherInternalDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserPublisherInternalDataResultEvent != null) { foreach (var each in OnServerUpdateUserPublisherInternalDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherInternalDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserPublisherReadOnlyDataRequestEvent != null) { foreach (var each in OnServerUpdateUserPublisherReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserPublisherReadOnlyDataResultEvent != null) { foreach (var each in OnServerUpdateUserPublisherReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserPublisherReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerUpdateUserReadOnlyDataRequestEvent != null) { foreach (var each in OnServerUpdateUserReadOnlyDataRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserReadOnlyDataRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerUpdateUserReadOnlyDataResultEvent != null) { foreach (var each in OnServerUpdateUserReadOnlyDataResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerUpdateUserReadOnlyDataResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerWriteCharacterEventRequestEvent != null) { foreach (var each in OnServerWriteCharacterEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteCharacterEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerWriteCharacterEventResultEvent != null) { foreach (var each in OnServerWriteCharacterEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteCharacterEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerWritePlayerEventRequestEvent != null) { foreach (var each in OnServerWritePlayerEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWritePlayerEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerWritePlayerEventResultEvent != null) { foreach (var each in OnServerWritePlayerEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWritePlayerEventResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnServerWriteTitleEventRequestEvent != null) { foreach (var each in OnServerWriteTitleEventRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteTitleEventRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnServerWriteTitleEventResultEvent != null) { foreach (var each in OnServerWriteTitleEventResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnServerWriteTitleEventResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent != null) { foreach (var each in OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent != null) { foreach (var each in OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAuthenticationDeleteRequestEvent != null) { foreach (var each in OnAuthenticationDeleteRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationDeleteRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationDeleteResultEvent != null) { foreach (var each in OnAuthenticationDeleteResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationDeleteResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAuthenticationGetEntityTokenRequestEvent != null) { foreach (var each in OnAuthenticationGetEntityTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationGetEntityTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationGetEntityTokenResultEvent != null) { foreach (var each in OnAuthenticationGetEntityTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationGetEntityTokenResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnAuthenticationValidateEntityTokenRequestEvent != null) { foreach (var each in OnAuthenticationValidateEntityTokenRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationValidateEntityTokenRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnAuthenticationValidateEntityTokenResultEvent != null) { foreach (var each in OnAuthenticationValidateEntityTokenResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnAuthenticationValidateEntityTokenResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnCloudScriptExecuteEntityCloudScriptRequestEvent != null) { foreach (var each in OnCloudScriptExecuteEntityCloudScriptRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteEntityCloudScriptRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptExecuteEntityCloudScriptResultEvent != null) { foreach (var each in OnCloudScriptExecuteEntityCloudScriptResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteEntityCloudScriptResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptExecuteFunctionRequestEvent != null) { foreach (var each in OnCloudScriptExecuteFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptExecuteFunctionResultEvent != null) { foreach (var each in OnCloudScriptExecuteFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptExecuteFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptGetFunctionRequestEvent != null) { foreach (var each in OnCloudScriptGetFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptGetFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptGetFunctionResultEvent != null) { foreach (var each in OnCloudScriptGetFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptGetFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptListFunctionsRequestEvent != null) { foreach (var each in OnCloudScriptListFunctionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListFunctionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptListFunctionsResultEvent != null) { foreach (var each in OnCloudScriptListFunctionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListFunctionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptListHttpFunctionsRequestEvent != null) { foreach (var each in OnCloudScriptListHttpFunctionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListHttpFunctionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptListHttpFunctionsResultEvent != null) { foreach (var each in OnCloudScriptListHttpFunctionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListHttpFunctionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptListQueuedFunctionsRequestEvent != null) { foreach (var each in OnCloudScriptListQueuedFunctionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListQueuedFunctionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptListQueuedFunctionsResultEvent != null) { foreach (var each in OnCloudScriptListQueuedFunctionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptListQueuedFunctionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptPostFunctionResultForScheduledTaskResultEvent != null) { foreach (var each in OnCloudScriptPostFunctionResultForScheduledTaskResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptPostFunctionResultForScheduledTaskResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptRegisterHttpFunctionRequestEvent != null) { foreach (var each in OnCloudScriptRegisterHttpFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterHttpFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptRegisterHttpFunctionResultEvent != null) { foreach (var each in OnCloudScriptRegisterHttpFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterHttpFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptRegisterQueuedFunctionRequestEvent != null) { foreach (var each in OnCloudScriptRegisterQueuedFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterQueuedFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptRegisterQueuedFunctionResultEvent != null) { foreach (var each in OnCloudScriptRegisterQueuedFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptRegisterQueuedFunctionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnCloudScriptUnregisterFunctionRequestEvent != null) { foreach (var each in OnCloudScriptUnregisterFunctionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptUnregisterFunctionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnCloudScriptUnregisterFunctionResultEvent != null) { foreach (var each in OnCloudScriptUnregisterFunctionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnCloudScriptUnregisterFunctionResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnDataAbortFileUploadsRequestEvent != null) { foreach (var each in OnDataAbortFileUploadsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataAbortFileUploadsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataAbortFileUploadsResultEvent != null) { foreach (var each in OnDataAbortFileUploadsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataAbortFileUploadsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataDeleteFilesRequestEvent != null) { foreach (var each in OnDataDeleteFilesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataDeleteFilesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataDeleteFilesResultEvent != null) { foreach (var each in OnDataDeleteFilesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataDeleteFilesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataFinalizeFileUploadsRequestEvent != null) { foreach (var each in OnDataFinalizeFileUploadsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataFinalizeFileUploadsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataFinalizeFileUploadsResultEvent != null) { foreach (var each in OnDataFinalizeFileUploadsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataFinalizeFileUploadsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataGetFilesRequestEvent != null) { foreach (var each in OnDataGetFilesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetFilesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataGetFilesResultEvent != null) { foreach (var each in OnDataGetFilesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetFilesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataGetObjectsRequestEvent != null) { foreach (var each in OnDataGetObjectsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetObjectsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataGetObjectsResultEvent != null) { foreach (var each in OnDataGetObjectsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataGetObjectsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataInitiateFileUploadsRequestEvent != null) { foreach (var each in OnDataInitiateFileUploadsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataInitiateFileUploadsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataInitiateFileUploadsResultEvent != null) { foreach (var each in OnDataInitiateFileUploadsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataInitiateFileUploadsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnDataSetObjectsRequestEvent != null) { foreach (var each in OnDataSetObjectsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataSetObjectsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnDataSetObjectsResultEvent != null) { foreach (var each in OnDataSetObjectsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnDataSetObjectsResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnEconomyAddInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyAddInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyAddInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyAddInventoryItemsResultEvent != null) { foreach (var each in OnEconomyAddInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyAddInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyCreateDraftItemRequestEvent != null) { foreach (var each in OnEconomyCreateDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyCreateDraftItemResultEvent != null) { foreach (var each in OnEconomyCreateDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyCreateUploadUrlsRequestEvent != null) { foreach (var each in OnEconomyCreateUploadUrlsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateUploadUrlsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyCreateUploadUrlsResultEvent != null) { foreach (var each in OnEconomyCreateUploadUrlsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyCreateUploadUrlsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteEntityItemReviewsRequestEvent != null) { foreach (var each in OnEconomyDeleteEntityItemReviewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteEntityItemReviewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteEntityItemReviewsResultEvent != null) { foreach (var each in OnEconomyDeleteEntityItemReviewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteEntityItemReviewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteInventoryCollectionRequestEvent != null) { foreach (var each in OnEconomyDeleteInventoryCollectionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryCollectionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteInventoryCollectionResultEvent != null) { foreach (var each in OnEconomyDeleteInventoryCollectionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryCollectionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyDeleteInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteInventoryItemsResultEvent != null) { foreach (var each in OnEconomyDeleteInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyDeleteItemRequestEvent != null) { foreach (var each in OnEconomyDeleteItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyDeleteItemResultEvent != null) { foreach (var each in OnEconomyDeleteItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyDeleteItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyExecuteInventoryOperationsRequestEvent != null) { foreach (var each in OnEconomyExecuteInventoryOperationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyExecuteInventoryOperationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyExecuteInventoryOperationsResultEvent != null) { foreach (var each in OnEconomyExecuteInventoryOperationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyExecuteInventoryOperationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetCatalogConfigRequestEvent != null) { foreach (var each in OnEconomyGetCatalogConfigRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetCatalogConfigRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetCatalogConfigResultEvent != null) { foreach (var each in OnEconomyGetCatalogConfigResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetCatalogConfigResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetDraftItemRequestEvent != null) { foreach (var each in OnEconomyGetDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetDraftItemResultEvent != null) { foreach (var each in OnEconomyGetDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetDraftItemsRequestEvent != null) { foreach (var each in OnEconomyGetDraftItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetDraftItemsResultEvent != null) { foreach (var each in OnEconomyGetDraftItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetDraftItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetEntityDraftItemsRequestEvent != null) { foreach (var each in OnEconomyGetEntityDraftItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityDraftItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetEntityDraftItemsResultEvent != null) { foreach (var each in OnEconomyGetEntityDraftItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityDraftItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetEntityItemReviewRequestEvent != null) { foreach (var each in OnEconomyGetEntityItemReviewRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityItemReviewRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetEntityItemReviewResultEvent != null) { foreach (var each in OnEconomyGetEntityItemReviewResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetEntityItemReviewResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetInventoryCollectionIdsRequestEvent != null) { foreach (var each in OnEconomyGetInventoryCollectionIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryCollectionIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetInventoryCollectionIdsResultEvent != null) { foreach (var each in OnEconomyGetInventoryCollectionIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryCollectionIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyGetInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetInventoryItemsResultEvent != null) { foreach (var each in OnEconomyGetInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemRequestEvent != null) { foreach (var each in OnEconomyGetItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemResultEvent != null) { foreach (var each in OnEconomyGetItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemContainersRequestEvent != null) { foreach (var each in OnEconomyGetItemContainersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemContainersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemContainersResultEvent != null) { foreach (var each in OnEconomyGetItemContainersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemContainersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemModerationStateRequestEvent != null) { foreach (var each in OnEconomyGetItemModerationStateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemModerationStateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemModerationStateResultEvent != null) { foreach (var each in OnEconomyGetItemModerationStateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemModerationStateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemPublishStatusRequestEvent != null) { foreach (var each in OnEconomyGetItemPublishStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemPublishStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemPublishStatusResultEvent != null) { foreach (var each in OnEconomyGetItemPublishStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemPublishStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemReviewsRequestEvent != null) { foreach (var each in OnEconomyGetItemReviewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemReviewsResultEvent != null) { foreach (var each in OnEconomyGetItemReviewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemReviewSummaryRequestEvent != null) { foreach (var each in OnEconomyGetItemReviewSummaryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewSummaryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemReviewSummaryResultEvent != null) { foreach (var each in OnEconomyGetItemReviewSummaryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemReviewSummaryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetItemsRequestEvent != null) { foreach (var each in OnEconomyGetItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetItemsResultEvent != null) { foreach (var each in OnEconomyGetItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetMicrosoftStoreAccessTokensRequestEvent != null) { foreach (var each in OnEconomyGetMicrosoftStoreAccessTokensRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetMicrosoftStoreAccessTokensRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetMicrosoftStoreAccessTokensResultEvent != null) { foreach (var each in OnEconomyGetMicrosoftStoreAccessTokensResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetMicrosoftStoreAccessTokensResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyGetTransactionHistoryRequestEvent != null) { foreach (var each in OnEconomyGetTransactionHistoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetTransactionHistoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyGetTransactionHistoryResultEvent != null) { foreach (var each in OnEconomyGetTransactionHistoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyGetTransactionHistoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyPublishDraftItemRequestEvent != null) { foreach (var each in OnEconomyPublishDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPublishDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyPublishDraftItemResultEvent != null) { foreach (var each in OnEconomyPublishDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPublishDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyPurchaseInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyPurchaseInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPurchaseInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyPurchaseInventoryItemsResultEvent != null) { foreach (var each in OnEconomyPurchaseInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyPurchaseInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemGooglePlayInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemGooglePlayInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemGooglePlayInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemGooglePlayInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemGooglePlayInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemGooglePlayInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemNintendoEShopInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemNintendoEShopInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemNintendoEShopInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyRedeemSteamInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyRedeemSteamInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemSteamInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyRedeemSteamInventoryItemsResultEvent != null) { foreach (var each in OnEconomyRedeemSteamInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyRedeemSteamInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyReportItemRequestEvent != null) { foreach (var each in OnEconomyReportItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyReportItemResultEvent != null) { foreach (var each in OnEconomyReportItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyReportItemReviewRequestEvent != null) { foreach (var each in OnEconomyReportItemReviewRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemReviewRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyReportItemReviewResultEvent != null) { foreach (var each in OnEconomyReportItemReviewResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReportItemReviewResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyReviewItemRequestEvent != null) { foreach (var each in OnEconomyReviewItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReviewItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyReviewItemResultEvent != null) { foreach (var each in OnEconomyReviewItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyReviewItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySearchItemsRequestEvent != null) { foreach (var each in OnEconomySearchItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySearchItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySearchItemsResultEvent != null) { foreach (var each in OnEconomySearchItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySearchItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySetItemModerationStateRequestEvent != null) { foreach (var each in OnEconomySetItemModerationStateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySetItemModerationStateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySetItemModerationStateResultEvent != null) { foreach (var each in OnEconomySetItemModerationStateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySetItemModerationStateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySubmitItemReviewVoteRequestEvent != null) { foreach (var each in OnEconomySubmitItemReviewVoteRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubmitItemReviewVoteRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySubmitItemReviewVoteResultEvent != null) { foreach (var each in OnEconomySubmitItemReviewVoteResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubmitItemReviewVoteResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomySubtractInventoryItemsRequestEvent != null) { foreach (var each in OnEconomySubtractInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubtractInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomySubtractInventoryItemsResultEvent != null) { foreach (var each in OnEconomySubtractInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomySubtractInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyTakedownItemReviewsRequestEvent != null) { foreach (var each in OnEconomyTakedownItemReviewsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTakedownItemReviewsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyTakedownItemReviewsResultEvent != null) { foreach (var each in OnEconomyTakedownItemReviewsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTakedownItemReviewsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyTransferInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyTransferInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTransferInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyTransferInventoryItemsResultEvent != null) { foreach (var each in OnEconomyTransferInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyTransferInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyUpdateCatalogConfigRequestEvent != null) { foreach (var each in OnEconomyUpdateCatalogConfigRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateCatalogConfigRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyUpdateCatalogConfigResultEvent != null) { foreach (var each in OnEconomyUpdateCatalogConfigResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateCatalogConfigResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyUpdateDraftItemRequestEvent != null) { foreach (var each in OnEconomyUpdateDraftItemRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateDraftItemRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyUpdateDraftItemResultEvent != null) { foreach (var each in OnEconomyUpdateDraftItemResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateDraftItemResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEconomyUpdateInventoryItemsRequestEvent != null) { foreach (var each in OnEconomyUpdateInventoryItemsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateInventoryItemsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEconomyUpdateInventoryItemsResultEvent != null) { foreach (var each in OnEconomyUpdateInventoryItemsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEconomyUpdateInventoryItemsResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnEventsWriteEventsRequestEvent != null) { foreach (var each in OnEventsWriteEventsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteEventsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsWriteEventsResultEvent != null) { foreach (var each in OnEventsWriteEventsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteEventsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnEventsWriteTelemetryEventsRequestEvent != null) { foreach (var each in OnEventsWriteTelemetryEventsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteTelemetryEventsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnEventsWriteTelemetryEventsResultEvent != null) { foreach (var each in OnEventsWriteTelemetryEventsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnEventsWriteTelemetryEventsResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnExperimentationCreateExclusionGroupRequestEvent != null) { foreach (var each in OnExperimentationCreateExclusionGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExclusionGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationCreateExclusionGroupResultEvent != null) { foreach (var each in OnExperimentationCreateExclusionGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExclusionGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationCreateExperimentRequestEvent != null) { foreach (var each in OnExperimentationCreateExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationCreateExperimentResultEvent != null) { foreach (var each in OnExperimentationCreateExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationCreateExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationDeleteExclusionGroupRequestEvent != null) { foreach (var each in OnExperimentationDeleteExclusionGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExclusionGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationDeleteExclusionGroupResultEvent != null) { foreach (var each in OnExperimentationDeleteExclusionGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExclusionGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationDeleteExperimentRequestEvent != null) { foreach (var each in OnExperimentationDeleteExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationDeleteExperimentResultEvent != null) { foreach (var each in OnExperimentationDeleteExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationDeleteExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetExclusionGroupsRequestEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetExclusionGroupsResultEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetExclusionGroupTrafficRequestEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupTrafficRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupTrafficRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetExclusionGroupTrafficResultEvent != null) { foreach (var each in OnExperimentationGetExclusionGroupTrafficResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExclusionGroupTrafficResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetExperimentsRequestEvent != null) { foreach (var each in OnExperimentationGetExperimentsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExperimentsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetExperimentsResultEvent != null) { foreach (var each in OnExperimentationGetExperimentsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetExperimentsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetLatestScorecardRequestEvent != null) { foreach (var each in OnExperimentationGetLatestScorecardRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetLatestScorecardRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetLatestScorecardResultEvent != null) { foreach (var each in OnExperimentationGetLatestScorecardResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetLatestScorecardResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationGetTreatmentAssignmentRequestEvent != null) { foreach (var each in OnExperimentationGetTreatmentAssignmentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetTreatmentAssignmentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationGetTreatmentAssignmentResultEvent != null) { foreach (var each in OnExperimentationGetTreatmentAssignmentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationGetTreatmentAssignmentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationStartExperimentRequestEvent != null) { foreach (var each in OnExperimentationStartExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStartExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationStartExperimentResultEvent != null) { foreach (var each in OnExperimentationStartExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStartExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationStopExperimentRequestEvent != null) { foreach (var each in OnExperimentationStopExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStopExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationStopExperimentResultEvent != null) { foreach (var each in OnExperimentationStopExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationStopExperimentResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationUpdateExclusionGroupRequestEvent != null) { foreach (var each in OnExperimentationUpdateExclusionGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExclusionGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationUpdateExclusionGroupResultEvent != null) { foreach (var each in OnExperimentationUpdateExclusionGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExclusionGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnExperimentationUpdateExperimentRequestEvent != null) { foreach (var each in OnExperimentationUpdateExperimentRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExperimentRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnExperimentationUpdateExperimentResultEvent != null) { foreach (var each in OnExperimentationUpdateExperimentResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnExperimentationUpdateExperimentResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnInsightsGetDetailsRequestEvent != null) { foreach (var each in OnInsightsGetDetailsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetDetailsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetDetailsResultEvent != null) { foreach (var each in OnInsightsGetDetailsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetDetailsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsGetLimitsRequestEvent != null) { foreach (var each in OnInsightsGetLimitsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetLimitsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetLimitsResultEvent != null) { foreach (var each in OnInsightsGetLimitsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetLimitsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsGetOperationStatusRequestEvent != null) { foreach (var each in OnInsightsGetOperationStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetOperationStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetOperationStatusResultEvent != null) { foreach (var each in OnInsightsGetOperationStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetOperationStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsGetPendingOperationsRequestEvent != null) { foreach (var each in OnInsightsGetPendingOperationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetPendingOperationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsGetPendingOperationsResultEvent != null) { foreach (var each in OnInsightsGetPendingOperationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsGetPendingOperationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsSetPerformanceRequestEvent != null) { foreach (var each in OnInsightsSetPerformanceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetPerformanceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsSetPerformanceResultEvent != null) { foreach (var each in OnInsightsSetPerformanceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetPerformanceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnInsightsSetStorageRetentionRequestEvent != null) { foreach (var each in OnInsightsSetStorageRetentionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetStorageRetentionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnInsightsSetStorageRetentionResultEvent != null) { foreach (var each in OnInsightsSetStorageRetentionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnInsightsSetStorageRetentionResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnGroupsAcceptGroupApplicationRequestEvent != null) { foreach (var each in OnGroupsAcceptGroupApplicationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupApplicationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsAcceptGroupApplicationResultEvent != null) { foreach (var each in OnGroupsAcceptGroupApplicationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupApplicationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsAcceptGroupInvitationRequestEvent != null) { foreach (var each in OnGroupsAcceptGroupInvitationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupInvitationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsAcceptGroupInvitationResultEvent != null) { foreach (var each in OnGroupsAcceptGroupInvitationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAcceptGroupInvitationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsAddMembersRequestEvent != null) { foreach (var each in OnGroupsAddMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAddMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsAddMembersResultEvent != null) { foreach (var each in OnGroupsAddMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsAddMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsApplyToGroupRequestEvent != null) { foreach (var each in OnGroupsApplyToGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsApplyToGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsApplyToGroupResultEvent != null) { foreach (var each in OnGroupsApplyToGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsApplyToGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsBlockEntityRequestEvent != null) { foreach (var each in OnGroupsBlockEntityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsBlockEntityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsBlockEntityResultEvent != null) { foreach (var each in OnGroupsBlockEntityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsBlockEntityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsChangeMemberRoleRequestEvent != null) { foreach (var each in OnGroupsChangeMemberRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsChangeMemberRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsChangeMemberRoleResultEvent != null) { foreach (var each in OnGroupsChangeMemberRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsChangeMemberRoleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsCreateGroupRequestEvent != null) { foreach (var each in OnGroupsCreateGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsCreateGroupResultEvent != null) { foreach (var each in OnGroupsCreateGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsCreateRoleRequestEvent != null) { foreach (var each in OnGroupsCreateRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsCreateRoleResultEvent != null) { foreach (var each in OnGroupsCreateRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsCreateRoleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsDeleteGroupRequestEvent != null) { foreach (var each in OnGroupsDeleteGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsDeleteGroupResultEvent != null) { foreach (var each in OnGroupsDeleteGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsDeleteRoleRequestEvent != null) { foreach (var each in OnGroupsDeleteRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsDeleteRoleResultEvent != null) { foreach (var each in OnGroupsDeleteRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsDeleteRoleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsGetGroupRequestEvent != null) { foreach (var each in OnGroupsGetGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsGetGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsGetGroupResultEvent != null) { foreach (var each in OnGroupsGetGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsGetGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsInviteToGroupRequestEvent != null) { foreach (var each in OnGroupsInviteToGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsInviteToGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsInviteToGroupResultEvent != null) { foreach (var each in OnGroupsInviteToGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsInviteToGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsIsMemberRequestEvent != null) { foreach (var each in OnGroupsIsMemberRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsIsMemberRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsIsMemberResultEvent != null) { foreach (var each in OnGroupsIsMemberResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsIsMemberResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupApplicationsRequestEvent != null) { foreach (var each in OnGroupsListGroupApplicationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupApplicationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupApplicationsResultEvent != null) { foreach (var each in OnGroupsListGroupApplicationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupApplicationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupBlocksRequestEvent != null) { foreach (var each in OnGroupsListGroupBlocksRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupBlocksRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupBlocksResultEvent != null) { foreach (var each in OnGroupsListGroupBlocksResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupBlocksResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupInvitationsRequestEvent != null) { foreach (var each in OnGroupsListGroupInvitationsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupInvitationsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupInvitationsResultEvent != null) { foreach (var each in OnGroupsListGroupInvitationsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupInvitationsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListGroupMembersRequestEvent != null) { foreach (var each in OnGroupsListGroupMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListGroupMembersResultEvent != null) { foreach (var each in OnGroupsListGroupMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListGroupMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListMembershipRequestEvent != null) { foreach (var each in OnGroupsListMembershipRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListMembershipResultEvent != null) { foreach (var each in OnGroupsListMembershipResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsListMembershipOpportunitiesRequestEvent != null) { foreach (var each in OnGroupsListMembershipOpportunitiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipOpportunitiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsListMembershipOpportunitiesResultEvent != null) { foreach (var each in OnGroupsListMembershipOpportunitiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsListMembershipOpportunitiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsRemoveGroupApplicationRequestEvent != null) { foreach (var each in OnGroupsRemoveGroupApplicationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupApplicationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsRemoveGroupApplicationResultEvent != null) { foreach (var each in OnGroupsRemoveGroupApplicationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupApplicationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsRemoveGroupInvitationRequestEvent != null) { foreach (var each in OnGroupsRemoveGroupInvitationRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupInvitationRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsRemoveGroupInvitationResultEvent != null) { foreach (var each in OnGroupsRemoveGroupInvitationResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveGroupInvitationResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsRemoveMembersRequestEvent != null) { foreach (var each in OnGroupsRemoveMembersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveMembersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsRemoveMembersResultEvent != null) { foreach (var each in OnGroupsRemoveMembersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsRemoveMembersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsUnblockEntityRequestEvent != null) { foreach (var each in OnGroupsUnblockEntityRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUnblockEntityRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsUnblockEntityResultEvent != null) { foreach (var each in OnGroupsUnblockEntityResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUnblockEntityResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsUpdateGroupRequestEvent != null) { foreach (var each in OnGroupsUpdateGroupRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateGroupRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsUpdateGroupResultEvent != null) { foreach (var each in OnGroupsUpdateGroupResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateGroupResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnGroupsUpdateRoleRequestEvent != null) { foreach (var each in OnGroupsUpdateRoleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateRoleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnGroupsUpdateRoleResultEvent != null) { foreach (var each in OnGroupsUpdateRoleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnGroupsUpdateRoleResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnLocalizationGetLanguageListRequestEvent != null) { foreach (var each in OnLocalizationGetLanguageListRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLocalizationGetLanguageListRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnLocalizationGetLanguageListResultEvent != null) { foreach (var each in OnLocalizationGetLanguageListResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnLocalizationGetLanguageListResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCancelMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerCancelMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerCancelMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCancelServerBackfillTicketRequestEvent != null) { foreach (var each in OnMultiplayerCancelServerBackfillTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelServerBackfillTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCancelServerBackfillTicketResultEvent != null) { foreach (var each in OnMultiplayerCancelServerBackfillTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCancelServerBackfillTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildWithCustomContainerRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithCustomContainerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithCustomContainerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildWithCustomContainerResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithCustomContainerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithCustomContainerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildWithManagedContainerRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithManagedContainerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithManagedContainerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildWithManagedContainerResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithManagedContainerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithManagedContainerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateBuildWithProcessBasedServerResultEvent != null) { foreach (var each in OnMultiplayerCreateBuildWithProcessBasedServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateBuildWithProcessBasedServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateLobbyRequestEvent != null) { foreach (var each in OnMultiplayerCreateLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateLobbyResultEvent != null) { foreach (var each in OnMultiplayerCreateLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerCreateMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerCreateMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateRemoteUserRequestEvent != null) { foreach (var each in OnMultiplayerCreateRemoteUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateRemoteUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateRemoteUserResultEvent != null) { foreach (var each in OnMultiplayerCreateRemoteUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateRemoteUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateServerBackfillTicketRequestEvent != null) { foreach (var each in OnMultiplayerCreateServerBackfillTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerBackfillTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateServerBackfillTicketResultEvent != null) { foreach (var each in OnMultiplayerCreateServerBackfillTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerBackfillTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateServerMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerCreateServerMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateServerMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerCreateServerMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateServerMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent != null) { foreach (var each in OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent != null) { foreach (var each in OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteAssetRequestEvent != null) { foreach (var each in OnMultiplayerDeleteAssetRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteAssetRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteAssetResultEvent != null) { foreach (var each in OnMultiplayerDeleteAssetResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteAssetResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteBuildRequestEvent != null) { foreach (var each in OnMultiplayerDeleteBuildRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteBuildResultEvent != null) { foreach (var each in OnMultiplayerDeleteBuildResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerDeleteBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerDeleteBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteBuildRegionRequestEvent != null) { foreach (var each in OnMultiplayerDeleteBuildRegionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildRegionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteBuildRegionResultEvent != null) { foreach (var each in OnMultiplayerDeleteBuildRegionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteBuildRegionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteCertificateRequestEvent != null) { foreach (var each in OnMultiplayerDeleteCertificateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteCertificateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteCertificateResultEvent != null) { foreach (var each in OnMultiplayerDeleteCertificateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteCertificateResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteContainerImageRepositoryRequestEvent != null) { foreach (var each in OnMultiplayerDeleteContainerImageRepositoryRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteContainerImageRepositoryRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteContainerImageRepositoryResultEvent != null) { foreach (var each in OnMultiplayerDeleteContainerImageRepositoryResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteContainerImageRepositoryResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteLobbyRequestEvent != null) { foreach (var each in OnMultiplayerDeleteLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteLobbyResultEvent != null) { foreach (var each in OnMultiplayerDeleteLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerDeleteRemoteUserRequestEvent != null) { foreach (var each in OnMultiplayerDeleteRemoteUserRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteRemoteUserRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerDeleteRemoteUserResultEvent != null) { foreach (var each in OnMultiplayerDeleteRemoteUserResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerDeleteRemoteUserResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerEnableMultiplayerServersForTitleRequestEvent != null) { foreach (var each in OnMultiplayerEnableMultiplayerServersForTitleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerEnableMultiplayerServersForTitleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerEnableMultiplayerServersForTitleResultEvent != null) { foreach (var each in OnMultiplayerEnableMultiplayerServersForTitleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerEnableMultiplayerServersForTitleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerFindFriendLobbiesRequestEvent != null) { foreach (var each in OnMultiplayerFindFriendLobbiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindFriendLobbiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerFindFriendLobbiesResultEvent != null) { foreach (var each in OnMultiplayerFindFriendLobbiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindFriendLobbiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerFindLobbiesRequestEvent != null) { foreach (var each in OnMultiplayerFindLobbiesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindLobbiesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerFindLobbiesResultEvent != null) { foreach (var each in OnMultiplayerFindLobbiesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerFindLobbiesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetAssetDownloadUrlRequestEvent != null) { foreach (var each in OnMultiplayerGetAssetDownloadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetDownloadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetAssetDownloadUrlResultEvent != null) { foreach (var each in OnMultiplayerGetAssetDownloadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetDownloadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetAssetUploadUrlRequestEvent != null) { foreach (var each in OnMultiplayerGetAssetUploadUrlRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetUploadUrlRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetAssetUploadUrlResultEvent != null) { foreach (var each in OnMultiplayerGetAssetUploadUrlResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetAssetUploadUrlResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetBuildRequestEvent != null) { foreach (var each in OnMultiplayerGetBuildRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetBuildResultEvent != null) { foreach (var each in OnMultiplayerGetBuildResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerGetBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerGetBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetContainerRegistryCredentialsRequestEvent != null) { foreach (var each in OnMultiplayerGetContainerRegistryCredentialsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetContainerRegistryCredentialsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetContainerRegistryCredentialsResultEvent != null) { foreach (var each in OnMultiplayerGetContainerRegistryCredentialsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetContainerRegistryCredentialsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetLobbyRequestEvent != null) { foreach (var each in OnMultiplayerGetLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetLobbyResultEvent != null) { foreach (var each in OnMultiplayerGetLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMatchRequestEvent != null) { foreach (var each in OnMultiplayerGetMatchRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMatchResultEvent != null) { foreach (var each in OnMultiplayerGetMatchResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMatchmakingQueueRequestEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingQueueRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingQueueRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMatchmakingQueueResultEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingQueueResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingQueueResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerGetMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMultiplayerServerDetailsRequestEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerDetailsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerDetailsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMultiplayerServerDetailsResultEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerDetailsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerDetailsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMultiplayerServerLogsRequestEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerLogsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerLogsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMultiplayerServerLogsResultEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerServerLogsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerServerLogsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent != null) { foreach (var each in OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetQueueStatisticsRequestEvent != null) { foreach (var each in OnMultiplayerGetQueueStatisticsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetQueueStatisticsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetQueueStatisticsResultEvent != null) { foreach (var each in OnMultiplayerGetQueueStatisticsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetQueueStatisticsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetRemoteLoginEndpointRequestEvent != null) { foreach (var each in OnMultiplayerGetRemoteLoginEndpointRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetRemoteLoginEndpointRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetRemoteLoginEndpointResultEvent != null) { foreach (var each in OnMultiplayerGetRemoteLoginEndpointResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetRemoteLoginEndpointResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetServerBackfillTicketRequestEvent != null) { foreach (var each in OnMultiplayerGetServerBackfillTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetServerBackfillTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetServerBackfillTicketResultEvent != null) { foreach (var each in OnMultiplayerGetServerBackfillTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetServerBackfillTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent != null) { foreach (var each in OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent != null) { foreach (var each in OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent != null) { foreach (var each in OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerInviteToLobbyRequestEvent != null) { foreach (var each in OnMultiplayerInviteToLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerInviteToLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerInviteToLobbyResultEvent != null) { foreach (var each in OnMultiplayerInviteToLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerInviteToLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerJoinArrangedLobbyRequestEvent != null) { foreach (var each in OnMultiplayerJoinArrangedLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinArrangedLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerJoinArrangedLobbyResultEvent != null) { foreach (var each in OnMultiplayerJoinArrangedLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinArrangedLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerJoinLobbyRequestEvent != null) { foreach (var each in OnMultiplayerJoinLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerJoinLobbyResultEvent != null) { foreach (var each in OnMultiplayerJoinLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerJoinMatchmakingTicketRequestEvent != null) { foreach (var each in OnMultiplayerJoinMatchmakingTicketRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinMatchmakingTicketRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerJoinMatchmakingTicketResultEvent != null) { foreach (var each in OnMultiplayerJoinMatchmakingTicketResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerJoinMatchmakingTicketResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerLeaveLobbyRequestEvent != null) { foreach (var each in OnMultiplayerLeaveLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerLeaveLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerLeaveLobbyResultEvent != null) { foreach (var each in OnMultiplayerLeaveLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerLeaveLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListArchivedMultiplayerServersRequestEvent != null) { foreach (var each in OnMultiplayerListArchivedMultiplayerServersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListArchivedMultiplayerServersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListArchivedMultiplayerServersResultEvent != null) { foreach (var each in OnMultiplayerListArchivedMultiplayerServersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListArchivedMultiplayerServersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListAssetSummariesRequestEvent != null) { foreach (var each in OnMultiplayerListAssetSummariesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListAssetSummariesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListAssetSummariesResultEvent != null) { foreach (var each in OnMultiplayerListAssetSummariesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListAssetSummariesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListBuildAliasesRequestEvent != null) { foreach (var each in OnMultiplayerListBuildAliasesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildAliasesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListBuildAliasesResultEvent != null) { foreach (var each in OnMultiplayerListBuildAliasesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildAliasesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListBuildSummariesV2RequestEvent != null) { foreach (var each in OnMultiplayerListBuildSummariesV2RequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildSummariesV2RequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListBuildSummariesV2ResultEvent != null) { foreach (var each in OnMultiplayerListBuildSummariesV2ResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListBuildSummariesV2ResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListCertificateSummariesRequestEvent != null) { foreach (var each in OnMultiplayerListCertificateSummariesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListCertificateSummariesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListCertificateSummariesResultEvent != null) { foreach (var each in OnMultiplayerListCertificateSummariesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListCertificateSummariesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListContainerImagesRequestEvent != null) { foreach (var each in OnMultiplayerListContainerImagesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImagesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListContainerImagesResultEvent != null) { foreach (var each in OnMultiplayerListContainerImagesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImagesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListContainerImageTagsRequestEvent != null) { foreach (var each in OnMultiplayerListContainerImageTagsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImageTagsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListContainerImageTagsResultEvent != null) { foreach (var each in OnMultiplayerListContainerImageTagsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListContainerImageTagsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListMatchmakingQueuesRequestEvent != null) { foreach (var each in OnMultiplayerListMatchmakingQueuesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingQueuesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListMatchmakingQueuesResultEvent != null) { foreach (var each in OnMultiplayerListMatchmakingQueuesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingQueuesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListMatchmakingTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerListMatchmakingTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMatchmakingTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListMultiplayerServersRequestEvent != null) { foreach (var each in OnMultiplayerListMultiplayerServersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMultiplayerServersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListMultiplayerServersResultEvent != null) { foreach (var each in OnMultiplayerListMultiplayerServersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListMultiplayerServersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListPartyQosServersRequestEvent != null) { foreach (var each in OnMultiplayerListPartyQosServersRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListPartyQosServersRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListPartyQosServersResultEvent != null) { foreach (var each in OnMultiplayerListPartyQosServersResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListPartyQosServersResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListQosServersForTitleRequestEvent != null) { foreach (var each in OnMultiplayerListQosServersForTitleRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListQosServersForTitleRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListQosServersForTitleResultEvent != null) { foreach (var each in OnMultiplayerListQosServersForTitleResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListQosServersForTitleResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent != null) { foreach (var each in OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListServerBackfillTicketsForPlayerResultEvent != null) { foreach (var each in OnMultiplayerListServerBackfillTicketsForPlayerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListServerBackfillTicketsForPlayerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent != null) { foreach (var each in OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent != null) { foreach (var each in OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerListVirtualMachineSummariesRequestEvent != null) { foreach (var each in OnMultiplayerListVirtualMachineSummariesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListVirtualMachineSummariesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerListVirtualMachineSummariesResultEvent != null) { foreach (var each in OnMultiplayerListVirtualMachineSummariesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerListVirtualMachineSummariesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRemoveMatchmakingQueueRequestEvent != null) { foreach (var each in OnMultiplayerRemoveMatchmakingQueueRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMatchmakingQueueRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRemoveMatchmakingQueueResultEvent != null) { foreach (var each in OnMultiplayerRemoveMatchmakingQueueResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMatchmakingQueueResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRemoveMemberRequestEvent != null) { foreach (var each in OnMultiplayerRemoveMemberRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMemberRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRemoveMemberResultEvent != null) { foreach (var each in OnMultiplayerRemoveMemberResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRemoveMemberResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRequestMultiplayerServerRequestEvent != null) { foreach (var each in OnMultiplayerRequestMultiplayerServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRequestMultiplayerServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRequestMultiplayerServerResultEvent != null) { foreach (var each in OnMultiplayerRequestMultiplayerServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRequestMultiplayerServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent != null) { foreach (var each in OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerRolloverContainerRegistryCredentialsResultEvent != null) { foreach (var each in OnMultiplayerRolloverContainerRegistryCredentialsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerRolloverContainerRegistryCredentialsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerSetMatchmakingQueueRequestEvent != null) { foreach (var each in OnMultiplayerSetMatchmakingQueueRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSetMatchmakingQueueRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerSetMatchmakingQueueResultEvent != null) { foreach (var each in OnMultiplayerSetMatchmakingQueueResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSetMatchmakingQueueResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerShutdownMultiplayerServerRequestEvent != null) { foreach (var each in OnMultiplayerShutdownMultiplayerServerRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerShutdownMultiplayerServerRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerShutdownMultiplayerServerResultEvent != null) { foreach (var each in OnMultiplayerShutdownMultiplayerServerResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerShutdownMultiplayerServerResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerSubscribeToLobbyResourceRequestEvent != null) { foreach (var each in OnMultiplayerSubscribeToLobbyResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToLobbyResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerSubscribeToLobbyResourceResultEvent != null) { foreach (var each in OnMultiplayerSubscribeToLobbyResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToLobbyResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerSubscribeToMatchmakingResourceRequestEvent != null) { foreach (var each in OnMultiplayerSubscribeToMatchmakingResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToMatchmakingResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerSubscribeToMatchmakingResourceResultEvent != null) { foreach (var each in OnMultiplayerSubscribeToMatchmakingResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerSubscribeToMatchmakingResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUnsubscribeFromLobbyResourceResultEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromLobbyResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromLobbyResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent != null) { foreach (var each in OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUntagContainerImageRequestEvent != null) { foreach (var each in OnMultiplayerUntagContainerImageRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUntagContainerImageRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUntagContainerImageResultEvent != null) { foreach (var each in OnMultiplayerUntagContainerImageResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUntagContainerImageResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildAliasRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildAliasRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildAliasRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildAliasResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildAliasResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildAliasResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildNameRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildNameRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildNameRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildNameResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildNameResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildNameResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildRegionRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildRegionResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateBuildRegionsRequestEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateBuildRegionsResultEvent != null) { foreach (var each in OnMultiplayerUpdateBuildRegionsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateBuildRegionsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUpdateLobbyRequestEvent != null) { foreach (var each in OnMultiplayerUpdateLobbyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateLobbyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUpdateLobbyResultEvent != null) { foreach (var each in OnMultiplayerUpdateLobbyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUpdateLobbyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnMultiplayerUploadCertificateRequestEvent != null) { foreach (var each in OnMultiplayerUploadCertificateRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUploadCertificateRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnMultiplayerUploadCertificateResultEvent != null) { foreach (var each in OnMultiplayerUploadCertificateResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnMultiplayerUploadCertificateResultEvent -= (PlayFabResultEvent)each; } } } + +#endif +#if !DISABLE_PLAYFABENTITY_API + if (OnProfilesGetGlobalPolicyRequestEvent != null) { foreach (var each in OnProfilesGetGlobalPolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetGlobalPolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetGlobalPolicyResultEvent != null) { foreach (var each in OnProfilesGetGlobalPolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetGlobalPolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetProfileRequestEvent != null) { foreach (var each in OnProfilesGetProfileRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfileRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetProfileResultEvent != null) { foreach (var each in OnProfilesGetProfileResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfileResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetProfilesRequestEvent != null) { foreach (var each in OnProfilesGetProfilesRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfilesRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetProfilesResultEvent != null) { foreach (var each in OnProfilesGetProfilesResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetProfilesResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent != null) { foreach (var each in OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesSetGlobalPolicyRequestEvent != null) { foreach (var each in OnProfilesSetGlobalPolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetGlobalPolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesSetGlobalPolicyResultEvent != null) { foreach (var each in OnProfilesSetGlobalPolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetGlobalPolicyResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesSetProfileLanguageRequestEvent != null) { foreach (var each in OnProfilesSetProfileLanguageRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfileLanguageRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesSetProfileLanguageResultEvent != null) { foreach (var each in OnProfilesSetProfileLanguageResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfileLanguageResultEvent -= (PlayFabResultEvent)each; } } } + + if (OnProfilesSetProfilePolicyRequestEvent != null) { foreach (var each in OnProfilesSetProfilePolicyRequestEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfilePolicyRequestEvent -= (PlayFabRequestEvent)each; } } } + if (OnProfilesSetProfilePolicyResultEvent != null) { foreach (var each in OnProfilesSetProfilePolicyResultEvent.GetInvocationList()) { if (ReferenceEquals(each.Target, instance)) { OnProfilesSetProfilePolicyResultEvent -= (PlayFabResultEvent)each; } } } + +#endif + + } + + private void OnProcessingErrorEvent(PlayFabRequestCommon request, PlayFabError error) + { + //This just forwards the event. + if (_instance.OnGlobalErrorEvent != null) + { + _instance.OnGlobalErrorEvent(request, error); + } + } + + private void OnProcessingEvent(ApiProcessingEventArgs e) + { + + if (e.EventType == ApiProcessingEventType.Pre) + { + var type = e.Request.GetType(); +#if ENABLE_PLAYFABADMIN_API + if (type == typeof(AdminModels.AbortTaskInstanceRequest)) { if (_instance.OnAdminAbortTaskInstanceRequestEvent != null) { _instance.OnAdminAbortTaskInstanceRequestEvent((AdminModels.AbortTaskInstanceRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddLocalizedNewsRequest)) { if (_instance.OnAdminAddLocalizedNewsRequestEvent != null) { _instance.OnAdminAddLocalizedNewsRequestEvent((AdminModels.AddLocalizedNewsRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddNewsRequest)) { if (_instance.OnAdminAddNewsRequestEvent != null) { _instance.OnAdminAddNewsRequestEvent((AdminModels.AddNewsRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddPlayerTagRequest)) { if (_instance.OnAdminAddPlayerTagRequestEvent != null) { _instance.OnAdminAddPlayerTagRequestEvent((AdminModels.AddPlayerTagRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddUserVirtualCurrencyRequest)) { if (_instance.OnAdminAddUserVirtualCurrencyRequestEvent != null) { _instance.OnAdminAddUserVirtualCurrencyRequestEvent((AdminModels.AddUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(AdminModels.AddVirtualCurrencyTypesRequest)) { if (_instance.OnAdminAddVirtualCurrencyTypesRequestEvent != null) { _instance.OnAdminAddVirtualCurrencyTypesRequestEvent((AdminModels.AddVirtualCurrencyTypesRequest)e.Request); return; } } + if (type == typeof(AdminModels.BanUsersRequest)) { if (_instance.OnAdminBanUsersRequestEvent != null) { _instance.OnAdminBanUsersRequestEvent((AdminModels.BanUsersRequest)e.Request); return; } } + if (type == typeof(AdminModels.CheckLimitedEditionItemAvailabilityRequest)) { if (_instance.OnAdminCheckLimitedEditionItemAvailabilityRequestEvent != null) { _instance.OnAdminCheckLimitedEditionItemAvailabilityRequestEvent((AdminModels.CheckLimitedEditionItemAvailabilityRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateActionsOnPlayerSegmentTaskRequest)) { if (_instance.OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent != null) { _instance.OnAdminCreateActionsOnPlayersInSegmentTaskRequestEvent((AdminModels.CreateActionsOnPlayerSegmentTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateCloudScriptTaskRequest)) { if (_instance.OnAdminCreateCloudScriptTaskRequestEvent != null) { _instance.OnAdminCreateCloudScriptTaskRequestEvent((AdminModels.CreateCloudScriptTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateInsightsScheduledScalingTaskRequest)) { if (_instance.OnAdminCreateInsightsScheduledScalingTaskRequestEvent != null) { _instance.OnAdminCreateInsightsScheduledScalingTaskRequestEvent((AdminModels.CreateInsightsScheduledScalingTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateOpenIdConnectionRequest)) { if (_instance.OnAdminCreateOpenIdConnectionRequestEvent != null) { _instance.OnAdminCreateOpenIdConnectionRequestEvent((AdminModels.CreateOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreatePlayerSharedSecretRequest)) { if (_instance.OnAdminCreatePlayerSharedSecretRequestEvent != null) { _instance.OnAdminCreatePlayerSharedSecretRequestEvent((AdminModels.CreatePlayerSharedSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreatePlayerStatisticDefinitionRequest)) { if (_instance.OnAdminCreatePlayerStatisticDefinitionRequestEvent != null) { _instance.OnAdminCreatePlayerStatisticDefinitionRequestEvent((AdminModels.CreatePlayerStatisticDefinitionRequest)e.Request); return; } } + if (type == typeof(AdminModels.CreateSegmentRequest)) { if (_instance.OnAdminCreateSegmentRequestEvent != null) { _instance.OnAdminCreateSegmentRequestEvent((AdminModels.CreateSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteContentRequest)) { if (_instance.OnAdminDeleteContentRequestEvent != null) { _instance.OnAdminDeleteContentRequestEvent((AdminModels.DeleteContentRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteMasterPlayerAccountRequest)) { if (_instance.OnAdminDeleteMasterPlayerAccountRequestEvent != null) { _instance.OnAdminDeleteMasterPlayerAccountRequestEvent((AdminModels.DeleteMasterPlayerAccountRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteMembershipSubscriptionRequest)) { if (_instance.OnAdminDeleteMembershipSubscriptionRequestEvent != null) { _instance.OnAdminDeleteMembershipSubscriptionRequestEvent((AdminModels.DeleteMembershipSubscriptionRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteOpenIdConnectionRequest)) { if (_instance.OnAdminDeleteOpenIdConnectionRequestEvent != null) { _instance.OnAdminDeleteOpenIdConnectionRequestEvent((AdminModels.DeleteOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeletePlayerRequest)) { if (_instance.OnAdminDeletePlayerRequestEvent != null) { _instance.OnAdminDeletePlayerRequestEvent((AdminModels.DeletePlayerRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeletePlayerSharedSecretRequest)) { if (_instance.OnAdminDeletePlayerSharedSecretRequestEvent != null) { _instance.OnAdminDeletePlayerSharedSecretRequestEvent((AdminModels.DeletePlayerSharedSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteSegmentRequest)) { if (_instance.OnAdminDeleteSegmentRequestEvent != null) { _instance.OnAdminDeleteSegmentRequestEvent((AdminModels.DeleteSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteStoreRequest)) { if (_instance.OnAdminDeleteStoreRequestEvent != null) { _instance.OnAdminDeleteStoreRequestEvent((AdminModels.DeleteStoreRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteTaskRequest)) { if (_instance.OnAdminDeleteTaskRequestEvent != null) { _instance.OnAdminDeleteTaskRequestEvent((AdminModels.DeleteTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteTitleRequest)) { if (_instance.OnAdminDeleteTitleRequestEvent != null) { _instance.OnAdminDeleteTitleRequestEvent((AdminModels.DeleteTitleRequest)e.Request); return; } } + if (type == typeof(AdminModels.DeleteTitleDataOverrideRequest)) { if (_instance.OnAdminDeleteTitleDataOverrideRequestEvent != null) { _instance.OnAdminDeleteTitleDataOverrideRequestEvent((AdminModels.DeleteTitleDataOverrideRequest)e.Request); return; } } + if (type == typeof(AdminModels.ExportMasterPlayerDataRequest)) { if (_instance.OnAdminExportMasterPlayerDataRequestEvent != null) { _instance.OnAdminExportMasterPlayerDataRequestEvent((AdminModels.ExportMasterPlayerDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.ExportPlayersInSegmentRequest)) { if (_instance.OnAdminExportPlayersInSegmentRequestEvent != null) { _instance.OnAdminExportPlayersInSegmentRequestEvent((AdminModels.ExportPlayersInSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTaskInstanceRequest)) { if (_instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent != null) { _instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceRequestEvent((AdminModels.GetTaskInstanceRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetAllSegmentsRequest)) { if (_instance.OnAdminGetAllSegmentsRequestEvent != null) { _instance.OnAdminGetAllSegmentsRequestEvent((AdminModels.GetAllSegmentsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetCatalogItemsRequest)) { if (_instance.OnAdminGetCatalogItemsRequestEvent != null) { _instance.OnAdminGetCatalogItemsRequestEvent((AdminModels.GetCatalogItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetCloudScriptRevisionRequest)) { if (_instance.OnAdminGetCloudScriptRevisionRequestEvent != null) { _instance.OnAdminGetCloudScriptRevisionRequestEvent((AdminModels.GetCloudScriptRevisionRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTaskInstanceRequest)) { if (_instance.OnAdminGetCloudScriptTaskInstanceRequestEvent != null) { _instance.OnAdminGetCloudScriptTaskInstanceRequestEvent((AdminModels.GetTaskInstanceRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetCloudScriptVersionsRequest)) { if (_instance.OnAdminGetCloudScriptVersionsRequestEvent != null) { _instance.OnAdminGetCloudScriptVersionsRequestEvent((AdminModels.GetCloudScriptVersionsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetContentListRequest)) { if (_instance.OnAdminGetContentListRequestEvent != null) { _instance.OnAdminGetContentListRequestEvent((AdminModels.GetContentListRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetContentUploadUrlRequest)) { if (_instance.OnAdminGetContentUploadUrlRequestEvent != null) { _instance.OnAdminGetContentUploadUrlRequestEvent((AdminModels.GetContentUploadUrlRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetDataReportRequest)) { if (_instance.OnAdminGetDataReportRequestEvent != null) { _instance.OnAdminGetDataReportRequestEvent((AdminModels.GetDataReportRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetMatchmakerGameInfoRequest)) { if (_instance.OnAdminGetMatchmakerGameInfoRequestEvent != null) { _instance.OnAdminGetMatchmakerGameInfoRequestEvent((AdminModels.GetMatchmakerGameInfoRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetMatchmakerGameModesRequest)) { if (_instance.OnAdminGetMatchmakerGameModesRequestEvent != null) { _instance.OnAdminGetMatchmakerGameModesRequestEvent((AdminModels.GetMatchmakerGameModesRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayedTitleListRequest)) { if (_instance.OnAdminGetPlayedTitleListRequestEvent != null) { _instance.OnAdminGetPlayedTitleListRequestEvent((AdminModels.GetPlayedTitleListRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerIdFromAuthTokenRequest)) { if (_instance.OnAdminGetPlayerIdFromAuthTokenRequestEvent != null) { _instance.OnAdminGetPlayerIdFromAuthTokenRequestEvent((AdminModels.GetPlayerIdFromAuthTokenRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerProfileRequest)) { if (_instance.OnAdminGetPlayerProfileRequestEvent != null) { _instance.OnAdminGetPlayerProfileRequestEvent((AdminModels.GetPlayerProfileRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayersSegmentsRequest)) { if (_instance.OnAdminGetPlayerSegmentsRequestEvent != null) { _instance.OnAdminGetPlayerSegmentsRequestEvent((AdminModels.GetPlayersSegmentsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerSharedSecretsRequest)) { if (_instance.OnAdminGetPlayerSharedSecretsRequestEvent != null) { _instance.OnAdminGetPlayerSharedSecretsRequestEvent((AdminModels.GetPlayerSharedSecretsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentRequest)) { if (_instance.OnAdminGetPlayersInSegmentRequestEvent != null) { _instance.OnAdminGetPlayersInSegmentRequestEvent((AdminModels.GetPlayersInSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticDefinitionsRequest)) { if (_instance.OnAdminGetPlayerStatisticDefinitionsRequestEvent != null) { _instance.OnAdminGetPlayerStatisticDefinitionsRequestEvent((AdminModels.GetPlayerStatisticDefinitionsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticVersionsRequest)) { if (_instance.OnAdminGetPlayerStatisticVersionsRequestEvent != null) { _instance.OnAdminGetPlayerStatisticVersionsRequestEvent((AdminModels.GetPlayerStatisticVersionsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayerTagsRequest)) { if (_instance.OnAdminGetPlayerTagsRequestEvent != null) { _instance.OnAdminGetPlayerTagsRequestEvent((AdminModels.GetPlayerTagsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPolicyRequest)) { if (_instance.OnAdminGetPolicyRequestEvent != null) { _instance.OnAdminGetPolicyRequestEvent((AdminModels.GetPolicyRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPublisherDataRequest)) { if (_instance.OnAdminGetPublisherDataRequestEvent != null) { _instance.OnAdminGetPublisherDataRequestEvent((AdminModels.GetPublisherDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetRandomResultTablesRequest)) { if (_instance.OnAdminGetRandomResultTablesRequestEvent != null) { _instance.OnAdminGetRandomResultTablesRequestEvent((AdminModels.GetRandomResultTablesRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentExportRequest)) { if (_instance.OnAdminGetSegmentExportRequestEvent != null) { _instance.OnAdminGetSegmentExportRequestEvent((AdminModels.GetPlayersInSegmentExportRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetSegmentsRequest)) { if (_instance.OnAdminGetSegmentsRequestEvent != null) { _instance.OnAdminGetSegmentsRequestEvent((AdminModels.GetSegmentsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetStoreItemsRequest)) { if (_instance.OnAdminGetStoreItemsRequestEvent != null) { _instance.OnAdminGetStoreItemsRequestEvent((AdminModels.GetStoreItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTaskInstancesRequest)) { if (_instance.OnAdminGetTaskInstancesRequestEvent != null) { _instance.OnAdminGetTaskInstancesRequestEvent((AdminModels.GetTaskInstancesRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTasksRequest)) { if (_instance.OnAdminGetTasksRequestEvent != null) { _instance.OnAdminGetTasksRequestEvent((AdminModels.GetTasksRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTitleDataRequest)) { if (_instance.OnAdminGetTitleDataRequestEvent != null) { _instance.OnAdminGetTitleDataRequestEvent((AdminModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetTitleDataRequest)) { if (_instance.OnAdminGetTitleInternalDataRequestEvent != null) { _instance.OnAdminGetTitleInternalDataRequestEvent((AdminModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.LookupUserAccountInfoRequest)) { if (_instance.OnAdminGetUserAccountInfoRequestEvent != null) { _instance.OnAdminGetUserAccountInfoRequestEvent((AdminModels.LookupUserAccountInfoRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserBansRequest)) { if (_instance.OnAdminGetUserBansRequestEvent != null) { _instance.OnAdminGetUserBansRequestEvent((AdminModels.GetUserBansRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserDataRequestEvent != null) { _instance.OnAdminGetUserDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserInternalDataRequestEvent != null) { _instance.OnAdminGetUserInternalDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserInventoryRequest)) { if (_instance.OnAdminGetUserInventoryRequestEvent != null) { _instance.OnAdminGetUserInventoryRequestEvent((AdminModels.GetUserInventoryRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserPublisherDataRequestEvent != null) { _instance.OnAdminGetUserPublisherDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserPublisherInternalDataRequestEvent != null) { _instance.OnAdminGetUserPublisherInternalDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnAdminGetUserPublisherReadOnlyDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GetUserDataRequest)) { if (_instance.OnAdminGetUserReadOnlyDataRequestEvent != null) { _instance.OnAdminGetUserReadOnlyDataRequestEvent((AdminModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.GrantItemsToUsersRequest)) { if (_instance.OnAdminGrantItemsToUsersRequestEvent != null) { _instance.OnAdminGrantItemsToUsersRequestEvent((AdminModels.GrantItemsToUsersRequest)e.Request); return; } } + if (type == typeof(AdminModels.IncrementLimitedEditionItemAvailabilityRequest)) { if (_instance.OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent != null) { _instance.OnAdminIncrementLimitedEditionItemAvailabilityRequestEvent((AdminModels.IncrementLimitedEditionItemAvailabilityRequest)e.Request); return; } } + if (type == typeof(AdminModels.IncrementPlayerStatisticVersionRequest)) { if (_instance.OnAdminIncrementPlayerStatisticVersionRequestEvent != null) { _instance.OnAdminIncrementPlayerStatisticVersionRequestEvent((AdminModels.IncrementPlayerStatisticVersionRequest)e.Request); return; } } + if (type == typeof(AdminModels.ListOpenIdConnectionRequest)) { if (_instance.OnAdminListOpenIdConnectionRequestEvent != null) { _instance.OnAdminListOpenIdConnectionRequestEvent((AdminModels.ListOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.ListVirtualCurrencyTypesRequest)) { if (_instance.OnAdminListVirtualCurrencyTypesRequestEvent != null) { _instance.OnAdminListVirtualCurrencyTypesRequestEvent((AdminModels.ListVirtualCurrencyTypesRequest)e.Request); return; } } + if (type == typeof(AdminModels.ModifyServerBuildRequest)) { if (_instance.OnAdminModifyServerBuildRequestEvent != null) { _instance.OnAdminModifyServerBuildRequestEvent((AdminModels.ModifyServerBuildRequest)e.Request); return; } } + if (type == typeof(AdminModels.RefundPurchaseRequest)) { if (_instance.OnAdminRefundPurchaseRequestEvent != null) { _instance.OnAdminRefundPurchaseRequestEvent((AdminModels.RefundPurchaseRequest)e.Request); return; } } + if (type == typeof(AdminModels.RemovePlayerTagRequest)) { if (_instance.OnAdminRemovePlayerTagRequestEvent != null) { _instance.OnAdminRemovePlayerTagRequestEvent((AdminModels.RemovePlayerTagRequest)e.Request); return; } } + if (type == typeof(AdminModels.RemoveVirtualCurrencyTypesRequest)) { if (_instance.OnAdminRemoveVirtualCurrencyTypesRequestEvent != null) { _instance.OnAdminRemoveVirtualCurrencyTypesRequestEvent((AdminModels.RemoveVirtualCurrencyTypesRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResetCharacterStatisticsRequest)) { if (_instance.OnAdminResetCharacterStatisticsRequestEvent != null) { _instance.OnAdminResetCharacterStatisticsRequestEvent((AdminModels.ResetCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResetPasswordRequest)) { if (_instance.OnAdminResetPasswordRequestEvent != null) { _instance.OnAdminResetPasswordRequestEvent((AdminModels.ResetPasswordRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResetUserStatisticsRequest)) { if (_instance.OnAdminResetUserStatisticsRequestEvent != null) { _instance.OnAdminResetUserStatisticsRequestEvent((AdminModels.ResetUserStatisticsRequest)e.Request); return; } } + if (type == typeof(AdminModels.ResolvePurchaseDisputeRequest)) { if (_instance.OnAdminResolvePurchaseDisputeRequestEvent != null) { _instance.OnAdminResolvePurchaseDisputeRequestEvent((AdminModels.ResolvePurchaseDisputeRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeAllBansForUserRequest)) { if (_instance.OnAdminRevokeAllBansForUserRequestEvent != null) { _instance.OnAdminRevokeAllBansForUserRequestEvent((AdminModels.RevokeAllBansForUserRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeBansRequest)) { if (_instance.OnAdminRevokeBansRequestEvent != null) { _instance.OnAdminRevokeBansRequestEvent((AdminModels.RevokeBansRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeInventoryItemRequest)) { if (_instance.OnAdminRevokeInventoryItemRequestEvent != null) { _instance.OnAdminRevokeInventoryItemRequestEvent((AdminModels.RevokeInventoryItemRequest)e.Request); return; } } + if (type == typeof(AdminModels.RevokeInventoryItemsRequest)) { if (_instance.OnAdminRevokeInventoryItemsRequestEvent != null) { _instance.OnAdminRevokeInventoryItemsRequestEvent((AdminModels.RevokeInventoryItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.RunTaskRequest)) { if (_instance.OnAdminRunTaskRequestEvent != null) { _instance.OnAdminRunTaskRequestEvent((AdminModels.RunTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.SendAccountRecoveryEmailRequest)) { if (_instance.OnAdminSendAccountRecoveryEmailRequestEvent != null) { _instance.OnAdminSendAccountRecoveryEmailRequestEvent((AdminModels.SendAccountRecoveryEmailRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsRequest)) { if (_instance.OnAdminSetCatalogItemsRequestEvent != null) { _instance.OnAdminSetCatalogItemsRequestEvent((AdminModels.UpdateCatalogItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetMembershipOverrideRequest)) { if (_instance.OnAdminSetMembershipOverrideRequestEvent != null) { _instance.OnAdminSetMembershipOverrideRequestEvent((AdminModels.SetMembershipOverrideRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetPlayerSecretRequest)) { if (_instance.OnAdminSetPlayerSecretRequestEvent != null) { _instance.OnAdminSetPlayerSecretRequestEvent((AdminModels.SetPlayerSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetPublishedRevisionRequest)) { if (_instance.OnAdminSetPublishedRevisionRequestEvent != null) { _instance.OnAdminSetPublishedRevisionRequestEvent((AdminModels.SetPublishedRevisionRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetPublisherDataRequest)) { if (_instance.OnAdminSetPublisherDataRequestEvent != null) { _instance.OnAdminSetPublisherDataRequestEvent((AdminModels.SetPublisherDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsRequest)) { if (_instance.OnAdminSetStoreItemsRequestEvent != null) { _instance.OnAdminSetStoreItemsRequestEvent((AdminModels.UpdateStoreItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetTitleDataRequest)) { if (_instance.OnAdminSetTitleDataRequestEvent != null) { _instance.OnAdminSetTitleDataRequestEvent((AdminModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetTitleDataAndOverridesRequest)) { if (_instance.OnAdminSetTitleDataAndOverridesRequestEvent != null) { _instance.OnAdminSetTitleDataAndOverridesRequestEvent((AdminModels.SetTitleDataAndOverridesRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetTitleDataRequest)) { if (_instance.OnAdminSetTitleInternalDataRequestEvent != null) { _instance.OnAdminSetTitleInternalDataRequestEvent((AdminModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.SetupPushNotificationRequest)) { if (_instance.OnAdminSetupPushNotificationRequestEvent != null) { _instance.OnAdminSetupPushNotificationRequestEvent((AdminModels.SetupPushNotificationRequest)e.Request); return; } } + if (type == typeof(AdminModels.SubtractUserVirtualCurrencyRequest)) { if (_instance.OnAdminSubtractUserVirtualCurrencyRequestEvent != null) { _instance.OnAdminSubtractUserVirtualCurrencyRequestEvent((AdminModels.SubtractUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateBansRequest)) { if (_instance.OnAdminUpdateBansRequestEvent != null) { _instance.OnAdminUpdateBansRequestEvent((AdminModels.UpdateBansRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsRequest)) { if (_instance.OnAdminUpdateCatalogItemsRequestEvent != null) { _instance.OnAdminUpdateCatalogItemsRequestEvent((AdminModels.UpdateCatalogItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateCloudScriptRequest)) { if (_instance.OnAdminUpdateCloudScriptRequestEvent != null) { _instance.OnAdminUpdateCloudScriptRequestEvent((AdminModels.UpdateCloudScriptRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateOpenIdConnectionRequest)) { if (_instance.OnAdminUpdateOpenIdConnectionRequestEvent != null) { _instance.OnAdminUpdateOpenIdConnectionRequestEvent((AdminModels.UpdateOpenIdConnectionRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdatePlayerSharedSecretRequest)) { if (_instance.OnAdminUpdatePlayerSharedSecretRequestEvent != null) { _instance.OnAdminUpdatePlayerSharedSecretRequestEvent((AdminModels.UpdatePlayerSharedSecretRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdatePlayerStatisticDefinitionRequest)) { if (_instance.OnAdminUpdatePlayerStatisticDefinitionRequestEvent != null) { _instance.OnAdminUpdatePlayerStatisticDefinitionRequestEvent((AdminModels.UpdatePlayerStatisticDefinitionRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdatePolicyRequest)) { if (_instance.OnAdminUpdatePolicyRequestEvent != null) { _instance.OnAdminUpdatePolicyRequestEvent((AdminModels.UpdatePolicyRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateRandomResultTablesRequest)) { if (_instance.OnAdminUpdateRandomResultTablesRequestEvent != null) { _instance.OnAdminUpdateRandomResultTablesRequestEvent((AdminModels.UpdateRandomResultTablesRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateSegmentRequest)) { if (_instance.OnAdminUpdateSegmentRequestEvent != null) { _instance.OnAdminUpdateSegmentRequestEvent((AdminModels.UpdateSegmentRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsRequest)) { if (_instance.OnAdminUpdateStoreItemsRequestEvent != null) { _instance.OnAdminUpdateStoreItemsRequestEvent((AdminModels.UpdateStoreItemsRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateTaskRequest)) { if (_instance.OnAdminUpdateTaskRequestEvent != null) { _instance.OnAdminUpdateTaskRequestEvent((AdminModels.UpdateTaskRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserDataRequestEvent != null) { _instance.OnAdminUpdateUserDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserInternalDataRequest)) { if (_instance.OnAdminUpdateUserInternalDataRequestEvent != null) { _instance.OnAdminUpdateUserInternalDataRequestEvent((AdminModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserPublisherDataRequestEvent != null) { _instance.OnAdminUpdateUserPublisherDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserInternalDataRequest)) { if (_instance.OnAdminUpdateUserPublisherInternalDataRequestEvent != null) { _instance.OnAdminUpdateUserPublisherInternalDataRequestEvent((AdminModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnAdminUpdateUserPublisherReadOnlyDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserDataRequest)) { if (_instance.OnAdminUpdateUserReadOnlyDataRequestEvent != null) { _instance.OnAdminUpdateUserReadOnlyDataRequestEvent((AdminModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(AdminModels.UpdateUserTitleDisplayNameRequest)) { if (_instance.OnAdminUpdateUserTitleDisplayNameRequestEvent != null) { _instance.OnAdminUpdateUserTitleDisplayNameRequestEvent((AdminModels.UpdateUserTitleDisplayNameRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABCLIENT_API + if (type == typeof(ClientModels.AcceptTradeRequest)) { if (_instance.OnAcceptTradeRequestEvent != null) { _instance.OnAcceptTradeRequestEvent((ClientModels.AcceptTradeRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddFriendRequest)) { if (_instance.OnAddFriendRequestEvent != null) { _instance.OnAddFriendRequestEvent((ClientModels.AddFriendRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddGenericIDRequest)) { if (_instance.OnAddGenericIDRequestEvent != null) { _instance.OnAddGenericIDRequestEvent((ClientModels.AddGenericIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddOrUpdateContactEmailRequest)) { if (_instance.OnAddOrUpdateContactEmailRequestEvent != null) { _instance.OnAddOrUpdateContactEmailRequestEvent((ClientModels.AddOrUpdateContactEmailRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddSharedGroupMembersRequest)) { if (_instance.OnAddSharedGroupMembersRequestEvent != null) { _instance.OnAddSharedGroupMembersRequestEvent((ClientModels.AddSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddUsernamePasswordRequest)) { if (_instance.OnAddUsernamePasswordRequestEvent != null) { _instance.OnAddUsernamePasswordRequestEvent((ClientModels.AddUsernamePasswordRequest)e.Request); return; } } + if (type == typeof(ClientModels.AddUserVirtualCurrencyRequest)) { if (_instance.OnAddUserVirtualCurrencyRequestEvent != null) { _instance.OnAddUserVirtualCurrencyRequestEvent((ClientModels.AddUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ClientModels.AndroidDevicePushNotificationRegistrationRequest)) { if (_instance.OnAndroidDevicePushNotificationRegistrationRequestEvent != null) { _instance.OnAndroidDevicePushNotificationRegistrationRequestEvent((ClientModels.AndroidDevicePushNotificationRegistrationRequest)e.Request); return; } } + if (type == typeof(ClientModels.AttributeInstallRequest)) { if (_instance.OnAttributeInstallRequestEvent != null) { _instance.OnAttributeInstallRequestEvent((ClientModels.AttributeInstallRequest)e.Request); return; } } + if (type == typeof(ClientModels.CancelTradeRequest)) { if (_instance.OnCancelTradeRequestEvent != null) { _instance.OnCancelTradeRequestEvent((ClientModels.CancelTradeRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConfirmPurchaseRequest)) { if (_instance.OnConfirmPurchaseRequestEvent != null) { _instance.OnConfirmPurchaseRequestEvent((ClientModels.ConfirmPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumeItemRequest)) { if (_instance.OnConsumeItemRequestEvent != null) { _instance.OnConsumeItemRequestEvent((ClientModels.ConsumeItemRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumeMicrosoftStoreEntitlementsRequest)) { if (_instance.OnConsumeMicrosoftStoreEntitlementsRequestEvent != null) { _instance.OnConsumeMicrosoftStoreEntitlementsRequestEvent((ClientModels.ConsumeMicrosoftStoreEntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumePS5EntitlementsRequest)) { if (_instance.OnConsumePS5EntitlementsRequestEvent != null) { _instance.OnConsumePS5EntitlementsRequestEvent((ClientModels.ConsumePS5EntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumePSNEntitlementsRequest)) { if (_instance.OnConsumePSNEntitlementsRequestEvent != null) { _instance.OnConsumePSNEntitlementsRequestEvent((ClientModels.ConsumePSNEntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ConsumeXboxEntitlementsRequest)) { if (_instance.OnConsumeXboxEntitlementsRequestEvent != null) { _instance.OnConsumeXboxEntitlementsRequestEvent((ClientModels.ConsumeXboxEntitlementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.CreateSharedGroupRequest)) { if (_instance.OnCreateSharedGroupRequestEvent != null) { _instance.OnCreateSharedGroupRequestEvent((ClientModels.CreateSharedGroupRequest)e.Request); return; } } + if (type == typeof(ClientModels.ExecuteCloudScriptRequest)) { if (_instance.OnExecuteCloudScriptRequestEvent != null) { _instance.OnExecuteCloudScriptRequestEvent((ClientModels.ExecuteCloudScriptRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetAccountInfoRequest)) { if (_instance.OnGetAccountInfoRequestEvent != null) { _instance.OnGetAccountInfoRequestEvent((ClientModels.GetAccountInfoRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetAdPlacementsRequest)) { if (_instance.OnGetAdPlacementsRequestEvent != null) { _instance.OnGetAdPlacementsRequestEvent((ClientModels.GetAdPlacementsRequest)e.Request); return; } } + if (type == typeof(ClientModels.ListUsersCharactersRequest)) { if (_instance.OnGetAllUsersCharactersRequestEvent != null) { _instance.OnGetAllUsersCharactersRequestEvent((ClientModels.ListUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCatalogItemsRequest)) { if (_instance.OnGetCatalogItemsRequestEvent != null) { _instance.OnGetCatalogItemsRequestEvent((ClientModels.GetCatalogItemsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterDataRequest)) { if (_instance.OnGetCharacterDataRequestEvent != null) { _instance.OnGetCharacterDataRequestEvent((ClientModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterInventoryRequest)) { if (_instance.OnGetCharacterInventoryRequestEvent != null) { _instance.OnGetCharacterInventoryRequestEvent((ClientModels.GetCharacterInventoryRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterLeaderboardRequest)) { if (_instance.OnGetCharacterLeaderboardRequestEvent != null) { _instance.OnGetCharacterLeaderboardRequestEvent((ClientModels.GetCharacterLeaderboardRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterDataRequest)) { if (_instance.OnGetCharacterReadOnlyDataRequestEvent != null) { _instance.OnGetCharacterReadOnlyDataRequestEvent((ClientModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetCharacterStatisticsRequest)) { if (_instance.OnGetCharacterStatisticsRequestEvent != null) { _instance.OnGetCharacterStatisticsRequestEvent((ClientModels.GetCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetContentDownloadUrlRequest)) { if (_instance.OnGetContentDownloadUrlRequestEvent != null) { _instance.OnGetContentDownloadUrlRequestEvent((ClientModels.GetContentDownloadUrlRequest)e.Request); return; } } + if (type == typeof(ClientModels.CurrentGamesRequest)) { if (_instance.OnGetCurrentGamesRequestEvent != null) { _instance.OnGetCurrentGamesRequestEvent((ClientModels.CurrentGamesRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetFriendLeaderboardRequest)) { if (_instance.OnGetFriendLeaderboardRequestEvent != null) { _instance.OnGetFriendLeaderboardRequestEvent((ClientModels.GetFriendLeaderboardRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetFriendLeaderboardAroundPlayerRequest)) { if (_instance.OnGetFriendLeaderboardAroundPlayerRequestEvent != null) { _instance.OnGetFriendLeaderboardAroundPlayerRequestEvent((ClientModels.GetFriendLeaderboardAroundPlayerRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetFriendsListRequest)) { if (_instance.OnGetFriendsListRequestEvent != null) { _instance.OnGetFriendsListRequestEvent((ClientModels.GetFriendsListRequest)e.Request); return; } } + if (type == typeof(ClientModels.GameServerRegionsRequest)) { if (_instance.OnGetGameServerRegionsRequestEvent != null) { _instance.OnGetGameServerRegionsRequestEvent((ClientModels.GameServerRegionsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardRequest)) { if (_instance.OnGetLeaderboardRequestEvent != null) { _instance.OnGetLeaderboardRequestEvent((ClientModels.GetLeaderboardRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundCharacterRequest)) { if (_instance.OnGetLeaderboardAroundCharacterRequestEvent != null) { _instance.OnGetLeaderboardAroundCharacterRequestEvent((ClientModels.GetLeaderboardAroundCharacterRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundPlayerRequest)) { if (_instance.OnGetLeaderboardAroundPlayerRequestEvent != null) { _instance.OnGetLeaderboardAroundPlayerRequestEvent((ClientModels.GetLeaderboardAroundPlayerRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetLeaderboardForUsersCharactersRequest)) { if (_instance.OnGetLeaderboardForUserCharactersRequestEvent != null) { _instance.OnGetLeaderboardForUserCharactersRequestEvent((ClientModels.GetLeaderboardForUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPaymentTokenRequest)) { if (_instance.OnGetPaymentTokenRequestEvent != null) { _instance.OnGetPaymentTokenRequestEvent((ClientModels.GetPaymentTokenRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPhotonAuthenticationTokenRequest)) { if (_instance.OnGetPhotonAuthenticationTokenRequestEvent != null) { _instance.OnGetPhotonAuthenticationTokenRequestEvent((ClientModels.GetPhotonAuthenticationTokenRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerCombinedInfoRequest)) { if (_instance.OnGetPlayerCombinedInfoRequestEvent != null) { _instance.OnGetPlayerCombinedInfoRequestEvent((ClientModels.GetPlayerCombinedInfoRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerProfileRequest)) { if (_instance.OnGetPlayerProfileRequestEvent != null) { _instance.OnGetPlayerProfileRequestEvent((ClientModels.GetPlayerProfileRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerSegmentsRequest)) { if (_instance.OnGetPlayerSegmentsRequestEvent != null) { _instance.OnGetPlayerSegmentsRequestEvent((ClientModels.GetPlayerSegmentsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticsRequest)) { if (_instance.OnGetPlayerStatisticsRequestEvent != null) { _instance.OnGetPlayerStatisticsRequestEvent((ClientModels.GetPlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticVersionsRequest)) { if (_instance.OnGetPlayerStatisticVersionsRequestEvent != null) { _instance.OnGetPlayerStatisticVersionsRequestEvent((ClientModels.GetPlayerStatisticVersionsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerTagsRequest)) { if (_instance.OnGetPlayerTagsRequestEvent != null) { _instance.OnGetPlayerTagsRequestEvent((ClientModels.GetPlayerTagsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayerTradesRequest)) { if (_instance.OnGetPlayerTradesRequestEvent != null) { _instance.OnGetPlayerTradesRequestEvent((ClientModels.GetPlayerTradesRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookIDsRequest)) { if (_instance.OnGetPlayFabIDsFromFacebookIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromFacebookIDsRequestEvent((ClientModels.GetPlayFabIDsFromFacebookIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)) { if (_instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { _instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent((ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGameCenterIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGameCenterIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGameCenterIDsRequestEvent((ClientModels.GetPlayFabIDsFromGameCenterIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGenericIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGenericIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGenericIDsRequestEvent((ClientModels.GetPlayFabIDsFromGenericIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGoogleIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGoogleIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGoogleIDsRequestEvent((ClientModels.GetPlayFabIDsFromGoogleIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest)) { if (_instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsRequestEvent((ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromKongregateIDsRequest)) { if (_instance.OnGetPlayFabIDsFromKongregateIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromKongregateIDsRequestEvent((ClientModels.GetPlayFabIDsFromKongregateIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)) { if (_instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { _instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent((ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)) { if (_instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { _instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent((ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromPSNAccountIDsRequest)) { if (_instance.OnGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromPSNAccountIDsRequestEvent((ClientModels.GetPlayFabIDsFromPSNAccountIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromSteamIDsRequest)) { if (_instance.OnGetPlayFabIDsFromSteamIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromSteamIDsRequestEvent((ClientModels.GetPlayFabIDsFromSteamIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromTwitchIDsRequest)) { if (_instance.OnGetPlayFabIDsFromTwitchIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromTwitchIDsRequestEvent((ClientModels.GetPlayFabIDsFromTwitchIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromXboxLiveIDsRequest)) { if (_instance.OnGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { _instance.OnGetPlayFabIDsFromXboxLiveIDsRequestEvent((ClientModels.GetPlayFabIDsFromXboxLiveIDsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPublisherDataRequest)) { if (_instance.OnGetPublisherDataRequestEvent != null) { _instance.OnGetPublisherDataRequestEvent((ClientModels.GetPublisherDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetPurchaseRequest)) { if (_instance.OnGetPurchaseRequestEvent != null) { _instance.OnGetPurchaseRequestEvent((ClientModels.GetPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetSharedGroupDataRequest)) { if (_instance.OnGetSharedGroupDataRequestEvent != null) { _instance.OnGetSharedGroupDataRequestEvent((ClientModels.GetSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetStoreItemsRequest)) { if (_instance.OnGetStoreItemsRequestEvent != null) { _instance.OnGetStoreItemsRequestEvent((ClientModels.GetStoreItemsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTimeRequest)) { if (_instance.OnGetTimeRequestEvent != null) { _instance.OnGetTimeRequestEvent((ClientModels.GetTimeRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTitleDataRequest)) { if (_instance.OnGetTitleDataRequestEvent != null) { _instance.OnGetTitleDataRequestEvent((ClientModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTitleNewsRequest)) { if (_instance.OnGetTitleNewsRequestEvent != null) { _instance.OnGetTitleNewsRequestEvent((ClientModels.GetTitleNewsRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTitlePublicKeyRequest)) { if (_instance.OnGetTitlePublicKeyRequestEvent != null) { _instance.OnGetTitlePublicKeyRequestEvent((ClientModels.GetTitlePublicKeyRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetTradeStatusRequest)) { if (_instance.OnGetTradeStatusRequestEvent != null) { _instance.OnGetTradeStatusRequestEvent((ClientModels.GetTradeStatusRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserDataRequestEvent != null) { _instance.OnGetUserDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserInventoryRequest)) { if (_instance.OnGetUserInventoryRequestEvent != null) { _instance.OnGetUserInventoryRequestEvent((ClientModels.GetUserInventoryRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserPublisherDataRequestEvent != null) { _instance.OnGetUserPublisherDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnGetUserPublisherReadOnlyDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GetUserDataRequest)) { if (_instance.OnGetUserReadOnlyDataRequestEvent != null) { _instance.OnGetUserReadOnlyDataRequestEvent((ClientModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.GrantCharacterToUserRequest)) { if (_instance.OnGrantCharacterToUserRequestEvent != null) { _instance.OnGrantCharacterToUserRequestEvent((ClientModels.GrantCharacterToUserRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkAndroidDeviceIDRequest)) { if (_instance.OnLinkAndroidDeviceIDRequestEvent != null) { _instance.OnLinkAndroidDeviceIDRequestEvent((ClientModels.LinkAndroidDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkAppleRequest)) { if (_instance.OnLinkAppleRequestEvent != null) { _instance.OnLinkAppleRequestEvent((ClientModels.LinkAppleRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkCustomIDRequest)) { if (_instance.OnLinkCustomIDRequestEvent != null) { _instance.OnLinkCustomIDRequestEvent((ClientModels.LinkCustomIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkFacebookAccountRequest)) { if (_instance.OnLinkFacebookAccountRequestEvent != null) { _instance.OnLinkFacebookAccountRequestEvent((ClientModels.LinkFacebookAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkFacebookInstantGamesIdRequest)) { if (_instance.OnLinkFacebookInstantGamesIdRequestEvent != null) { _instance.OnLinkFacebookInstantGamesIdRequestEvent((ClientModels.LinkFacebookInstantGamesIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkGameCenterAccountRequest)) { if (_instance.OnLinkGameCenterAccountRequestEvent != null) { _instance.OnLinkGameCenterAccountRequestEvent((ClientModels.LinkGameCenterAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkGoogleAccountRequest)) { if (_instance.OnLinkGoogleAccountRequestEvent != null) { _instance.OnLinkGoogleAccountRequestEvent((ClientModels.LinkGoogleAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkGooglePlayGamesServicesAccountRequest)) { if (_instance.OnLinkGooglePlayGamesServicesAccountRequestEvent != null) { _instance.OnLinkGooglePlayGamesServicesAccountRequestEvent((ClientModels.LinkGooglePlayGamesServicesAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkIOSDeviceIDRequest)) { if (_instance.OnLinkIOSDeviceIDRequestEvent != null) { _instance.OnLinkIOSDeviceIDRequestEvent((ClientModels.LinkIOSDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkKongregateAccountRequest)) { if (_instance.OnLinkKongregateRequestEvent != null) { _instance.OnLinkKongregateRequestEvent((ClientModels.LinkKongregateAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkNintendoServiceAccountRequest)) { if (_instance.OnLinkNintendoServiceAccountRequestEvent != null) { _instance.OnLinkNintendoServiceAccountRequestEvent((ClientModels.LinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnLinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnLinkNintendoSwitchDeviceIdRequestEvent((ClientModels.LinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkOpenIdConnectRequest)) { if (_instance.OnLinkOpenIdConnectRequestEvent != null) { _instance.OnLinkOpenIdConnectRequestEvent((ClientModels.LinkOpenIdConnectRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkPSNAccountRequest)) { if (_instance.OnLinkPSNAccountRequestEvent != null) { _instance.OnLinkPSNAccountRequestEvent((ClientModels.LinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkSteamAccountRequest)) { if (_instance.OnLinkSteamAccountRequestEvent != null) { _instance.OnLinkSteamAccountRequestEvent((ClientModels.LinkSteamAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkTwitchAccountRequest)) { if (_instance.OnLinkTwitchRequestEvent != null) { _instance.OnLinkTwitchRequestEvent((ClientModels.LinkTwitchAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LinkXboxAccountRequest)) { if (_instance.OnLinkXboxAccountRequestEvent != null) { _instance.OnLinkXboxAccountRequestEvent((ClientModels.LinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithAndroidDeviceIDRequest)) { if (_instance.OnLoginWithAndroidDeviceIDRequestEvent != null) { _instance.OnLoginWithAndroidDeviceIDRequestEvent((ClientModels.LoginWithAndroidDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithAppleRequest)) { if (_instance.OnLoginWithAppleRequestEvent != null) { _instance.OnLoginWithAppleRequestEvent((ClientModels.LoginWithAppleRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithCustomIDRequest)) { if (_instance.OnLoginWithCustomIDRequestEvent != null) { _instance.OnLoginWithCustomIDRequestEvent((ClientModels.LoginWithCustomIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithEmailAddressRequest)) { if (_instance.OnLoginWithEmailAddressRequestEvent != null) { _instance.OnLoginWithEmailAddressRequestEvent((ClientModels.LoginWithEmailAddressRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithFacebookRequest)) { if (_instance.OnLoginWithFacebookRequestEvent != null) { _instance.OnLoginWithFacebookRequestEvent((ClientModels.LoginWithFacebookRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithFacebookInstantGamesIdRequest)) { if (_instance.OnLoginWithFacebookInstantGamesIdRequestEvent != null) { _instance.OnLoginWithFacebookInstantGamesIdRequestEvent((ClientModels.LoginWithFacebookInstantGamesIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithGameCenterRequest)) { if (_instance.OnLoginWithGameCenterRequestEvent != null) { _instance.OnLoginWithGameCenterRequestEvent((ClientModels.LoginWithGameCenterRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithGoogleAccountRequest)) { if (_instance.OnLoginWithGoogleAccountRequestEvent != null) { _instance.OnLoginWithGoogleAccountRequestEvent((ClientModels.LoginWithGoogleAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithGooglePlayGamesServicesRequest)) { if (_instance.OnLoginWithGooglePlayGamesServicesRequestEvent != null) { _instance.OnLoginWithGooglePlayGamesServicesRequestEvent((ClientModels.LoginWithGooglePlayGamesServicesRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithIOSDeviceIDRequest)) { if (_instance.OnLoginWithIOSDeviceIDRequestEvent != null) { _instance.OnLoginWithIOSDeviceIDRequestEvent((ClientModels.LoginWithIOSDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithKongregateRequest)) { if (_instance.OnLoginWithKongregateRequestEvent != null) { _instance.OnLoginWithKongregateRequestEvent((ClientModels.LoginWithKongregateRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithNintendoServiceAccountRequest)) { if (_instance.OnLoginWithNintendoServiceAccountRequestEvent != null) { _instance.OnLoginWithNintendoServiceAccountRequestEvent((ClientModels.LoginWithNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithNintendoSwitchDeviceIdRequest)) { if (_instance.OnLoginWithNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnLoginWithNintendoSwitchDeviceIdRequestEvent((ClientModels.LoginWithNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithOpenIdConnectRequest)) { if (_instance.OnLoginWithOpenIdConnectRequestEvent != null) { _instance.OnLoginWithOpenIdConnectRequestEvent((ClientModels.LoginWithOpenIdConnectRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithPlayFabRequest)) { if (_instance.OnLoginWithPlayFabRequestEvent != null) { _instance.OnLoginWithPlayFabRequestEvent((ClientModels.LoginWithPlayFabRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithPSNRequest)) { if (_instance.OnLoginWithPSNRequestEvent != null) { _instance.OnLoginWithPSNRequestEvent((ClientModels.LoginWithPSNRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithSteamRequest)) { if (_instance.OnLoginWithSteamRequestEvent != null) { _instance.OnLoginWithSteamRequestEvent((ClientModels.LoginWithSteamRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithTwitchRequest)) { if (_instance.OnLoginWithTwitchRequestEvent != null) { _instance.OnLoginWithTwitchRequestEvent((ClientModels.LoginWithTwitchRequest)e.Request); return; } } + if (type == typeof(ClientModels.LoginWithXboxRequest)) { if (_instance.OnLoginWithXboxRequestEvent != null) { _instance.OnLoginWithXboxRequestEvent((ClientModels.LoginWithXboxRequest)e.Request); return; } } + if (type == typeof(ClientModels.MatchmakeRequest)) { if (_instance.OnMatchmakeRequestEvent != null) { _instance.OnMatchmakeRequestEvent((ClientModels.MatchmakeRequest)e.Request); return; } } + if (type == typeof(ClientModels.OpenTradeRequest)) { if (_instance.OnOpenTradeRequestEvent != null) { _instance.OnOpenTradeRequestEvent((ClientModels.OpenTradeRequest)e.Request); return; } } + if (type == typeof(ClientModels.PayForPurchaseRequest)) { if (_instance.OnPayForPurchaseRequestEvent != null) { _instance.OnPayForPurchaseRequestEvent((ClientModels.PayForPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.PurchaseItemRequest)) { if (_instance.OnPurchaseItemRequestEvent != null) { _instance.OnPurchaseItemRequestEvent((ClientModels.PurchaseItemRequest)e.Request); return; } } + if (type == typeof(ClientModels.RedeemCouponRequest)) { if (_instance.OnRedeemCouponRequestEvent != null) { _instance.OnRedeemCouponRequestEvent((ClientModels.RedeemCouponRequest)e.Request); return; } } + if (type == typeof(ClientModels.RefreshPSNAuthTokenRequest)) { if (_instance.OnRefreshPSNAuthTokenRequestEvent != null) { _instance.OnRefreshPSNAuthTokenRequestEvent((ClientModels.RefreshPSNAuthTokenRequest)e.Request); return; } } + if (type == typeof(ClientModels.RegisterForIOSPushNotificationRequest)) { if (_instance.OnRegisterForIOSPushNotificationRequestEvent != null) { _instance.OnRegisterForIOSPushNotificationRequestEvent((ClientModels.RegisterForIOSPushNotificationRequest)e.Request); return; } } + if (type == typeof(ClientModels.RegisterPlayFabUserRequest)) { if (_instance.OnRegisterPlayFabUserRequestEvent != null) { _instance.OnRegisterPlayFabUserRequestEvent((ClientModels.RegisterPlayFabUserRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveContactEmailRequest)) { if (_instance.OnRemoveContactEmailRequestEvent != null) { _instance.OnRemoveContactEmailRequestEvent((ClientModels.RemoveContactEmailRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveFriendRequest)) { if (_instance.OnRemoveFriendRequestEvent != null) { _instance.OnRemoveFriendRequestEvent((ClientModels.RemoveFriendRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveGenericIDRequest)) { if (_instance.OnRemoveGenericIDRequestEvent != null) { _instance.OnRemoveGenericIDRequestEvent((ClientModels.RemoveGenericIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.RemoveSharedGroupMembersRequest)) { if (_instance.OnRemoveSharedGroupMembersRequestEvent != null) { _instance.OnRemoveSharedGroupMembersRequestEvent((ClientModels.RemoveSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ClientModels.ReportAdActivityRequest)) { if (_instance.OnReportAdActivityRequestEvent != null) { _instance.OnReportAdActivityRequestEvent((ClientModels.ReportAdActivityRequest)e.Request); return; } } + if (type == typeof(ClientModels.DeviceInfoRequest)) { if (_instance.OnReportDeviceInfoRequestEvent != null) { _instance.OnReportDeviceInfoRequestEvent((ClientModels.DeviceInfoRequest)e.Request); return; } } + if (type == typeof(ClientModels.ReportPlayerClientRequest)) { if (_instance.OnReportPlayerRequestEvent != null) { _instance.OnReportPlayerRequestEvent((ClientModels.ReportPlayerClientRequest)e.Request); return; } } + if (type == typeof(ClientModels.RestoreIOSPurchasesRequest)) { if (_instance.OnRestoreIOSPurchasesRequestEvent != null) { _instance.OnRestoreIOSPurchasesRequestEvent((ClientModels.RestoreIOSPurchasesRequest)e.Request); return; } } + if (type == typeof(ClientModels.RewardAdActivityRequest)) { if (_instance.OnRewardAdActivityRequestEvent != null) { _instance.OnRewardAdActivityRequestEvent((ClientModels.RewardAdActivityRequest)e.Request); return; } } + if (type == typeof(ClientModels.SendAccountRecoveryEmailRequest)) { if (_instance.OnSendAccountRecoveryEmailRequestEvent != null) { _instance.OnSendAccountRecoveryEmailRequestEvent((ClientModels.SendAccountRecoveryEmailRequest)e.Request); return; } } + if (type == typeof(ClientModels.SetFriendTagsRequest)) { if (_instance.OnSetFriendTagsRequestEvent != null) { _instance.OnSetFriendTagsRequestEvent((ClientModels.SetFriendTagsRequest)e.Request); return; } } + if (type == typeof(ClientModels.SetPlayerSecretRequest)) { if (_instance.OnSetPlayerSecretRequestEvent != null) { _instance.OnSetPlayerSecretRequestEvent((ClientModels.SetPlayerSecretRequest)e.Request); return; } } + if (type == typeof(ClientModels.StartPurchaseRequest)) { if (_instance.OnStartPurchaseRequestEvent != null) { _instance.OnStartPurchaseRequestEvent((ClientModels.StartPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.SubtractUserVirtualCurrencyRequest)) { if (_instance.OnSubtractUserVirtualCurrencyRequestEvent != null) { _instance.OnSubtractUserVirtualCurrencyRequestEvent((ClientModels.SubtractUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkAndroidDeviceIDRequest)) { if (_instance.OnUnlinkAndroidDeviceIDRequestEvent != null) { _instance.OnUnlinkAndroidDeviceIDRequestEvent((ClientModels.UnlinkAndroidDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkAppleRequest)) { if (_instance.OnUnlinkAppleRequestEvent != null) { _instance.OnUnlinkAppleRequestEvent((ClientModels.UnlinkAppleRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkCustomIDRequest)) { if (_instance.OnUnlinkCustomIDRequestEvent != null) { _instance.OnUnlinkCustomIDRequestEvent((ClientModels.UnlinkCustomIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkFacebookAccountRequest)) { if (_instance.OnUnlinkFacebookAccountRequestEvent != null) { _instance.OnUnlinkFacebookAccountRequestEvent((ClientModels.UnlinkFacebookAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkFacebookInstantGamesIdRequest)) { if (_instance.OnUnlinkFacebookInstantGamesIdRequestEvent != null) { _instance.OnUnlinkFacebookInstantGamesIdRequestEvent((ClientModels.UnlinkFacebookInstantGamesIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkGameCenterAccountRequest)) { if (_instance.OnUnlinkGameCenterAccountRequestEvent != null) { _instance.OnUnlinkGameCenterAccountRequestEvent((ClientModels.UnlinkGameCenterAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkGoogleAccountRequest)) { if (_instance.OnUnlinkGoogleAccountRequestEvent != null) { _instance.OnUnlinkGoogleAccountRequestEvent((ClientModels.UnlinkGoogleAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkGooglePlayGamesServicesAccountRequest)) { if (_instance.OnUnlinkGooglePlayGamesServicesAccountRequestEvent != null) { _instance.OnUnlinkGooglePlayGamesServicesAccountRequestEvent((ClientModels.UnlinkGooglePlayGamesServicesAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkIOSDeviceIDRequest)) { if (_instance.OnUnlinkIOSDeviceIDRequestEvent != null) { _instance.OnUnlinkIOSDeviceIDRequestEvent((ClientModels.UnlinkIOSDeviceIDRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkKongregateAccountRequest)) { if (_instance.OnUnlinkKongregateRequestEvent != null) { _instance.OnUnlinkKongregateRequestEvent((ClientModels.UnlinkKongregateAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkNintendoServiceAccountRequest)) { if (_instance.OnUnlinkNintendoServiceAccountRequestEvent != null) { _instance.OnUnlinkNintendoServiceAccountRequestEvent((ClientModels.UnlinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnUnlinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnUnlinkNintendoSwitchDeviceIdRequestEvent((ClientModels.UnlinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkOpenIdConnectRequest)) { if (_instance.OnUnlinkOpenIdConnectRequestEvent != null) { _instance.OnUnlinkOpenIdConnectRequestEvent((ClientModels.UnlinkOpenIdConnectRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkPSNAccountRequest)) { if (_instance.OnUnlinkPSNAccountRequestEvent != null) { _instance.OnUnlinkPSNAccountRequestEvent((ClientModels.UnlinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkSteamAccountRequest)) { if (_instance.OnUnlinkSteamAccountRequestEvent != null) { _instance.OnUnlinkSteamAccountRequestEvent((ClientModels.UnlinkSteamAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkTwitchAccountRequest)) { if (_instance.OnUnlinkTwitchRequestEvent != null) { _instance.OnUnlinkTwitchRequestEvent((ClientModels.UnlinkTwitchAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlinkXboxAccountRequest)) { if (_instance.OnUnlinkXboxAccountRequestEvent != null) { _instance.OnUnlinkXboxAccountRequestEvent((ClientModels.UnlinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlockContainerInstanceRequest)) { if (_instance.OnUnlockContainerInstanceRequestEvent != null) { _instance.OnUnlockContainerInstanceRequestEvent((ClientModels.UnlockContainerInstanceRequest)e.Request); return; } } + if (type == typeof(ClientModels.UnlockContainerItemRequest)) { if (_instance.OnUnlockContainerItemRequestEvent != null) { _instance.OnUnlockContainerItemRequestEvent((ClientModels.UnlockContainerItemRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateAvatarUrlRequest)) { if (_instance.OnUpdateAvatarUrlRequestEvent != null) { _instance.OnUpdateAvatarUrlRequestEvent((ClientModels.UpdateAvatarUrlRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateCharacterDataRequest)) { if (_instance.OnUpdateCharacterDataRequestEvent != null) { _instance.OnUpdateCharacterDataRequestEvent((ClientModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateCharacterStatisticsRequest)) { if (_instance.OnUpdateCharacterStatisticsRequestEvent != null) { _instance.OnUpdateCharacterStatisticsRequestEvent((ClientModels.UpdateCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdatePlayerStatisticsRequest)) { if (_instance.OnUpdatePlayerStatisticsRequestEvent != null) { _instance.OnUpdatePlayerStatisticsRequestEvent((ClientModels.UpdatePlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateSharedGroupDataRequest)) { if (_instance.OnUpdateSharedGroupDataRequestEvent != null) { _instance.OnUpdateSharedGroupDataRequestEvent((ClientModels.UpdateSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateUserDataRequest)) { if (_instance.OnUpdateUserDataRequestEvent != null) { _instance.OnUpdateUserDataRequestEvent((ClientModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateUserDataRequest)) { if (_instance.OnUpdateUserPublisherDataRequestEvent != null) { _instance.OnUpdateUserPublisherDataRequestEvent((ClientModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ClientModels.UpdateUserTitleDisplayNameRequest)) { if (_instance.OnUpdateUserTitleDisplayNameRequestEvent != null) { _instance.OnUpdateUserTitleDisplayNameRequestEvent((ClientModels.UpdateUserTitleDisplayNameRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateAmazonReceiptRequest)) { if (_instance.OnValidateAmazonIAPReceiptRequestEvent != null) { _instance.OnValidateAmazonIAPReceiptRequestEvent((ClientModels.ValidateAmazonReceiptRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateGooglePlayPurchaseRequest)) { if (_instance.OnValidateGooglePlayPurchaseRequestEvent != null) { _instance.OnValidateGooglePlayPurchaseRequestEvent((ClientModels.ValidateGooglePlayPurchaseRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateIOSReceiptRequest)) { if (_instance.OnValidateIOSReceiptRequestEvent != null) { _instance.OnValidateIOSReceiptRequestEvent((ClientModels.ValidateIOSReceiptRequest)e.Request); return; } } + if (type == typeof(ClientModels.ValidateWindowsReceiptRequest)) { if (_instance.OnValidateWindowsStoreReceiptRequestEvent != null) { _instance.OnValidateWindowsStoreReceiptRequestEvent((ClientModels.ValidateWindowsReceiptRequest)e.Request); return; } } + if (type == typeof(ClientModels.WriteClientCharacterEventRequest)) { if (_instance.OnWriteCharacterEventRequestEvent != null) { _instance.OnWriteCharacterEventRequestEvent((ClientModels.WriteClientCharacterEventRequest)e.Request); return; } } + if (type == typeof(ClientModels.WriteClientPlayerEventRequest)) { if (_instance.OnWritePlayerEventRequestEvent != null) { _instance.OnWritePlayerEventRequestEvent((ClientModels.WriteClientPlayerEventRequest)e.Request); return; } } + if (type == typeof(ClientModels.WriteTitleEventRequest)) { if (_instance.OnWriteTitleEventRequestEvent != null) { _instance.OnWriteTitleEventRequestEvent((ClientModels.WriteTitleEventRequest)e.Request); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API + if (type == typeof(MatchmakerModels.AuthUserRequest)) { if (_instance.OnMatchmakerAuthUserRequestEvent != null) { _instance.OnMatchmakerAuthUserRequestEvent((MatchmakerModels.AuthUserRequest)e.Request); return; } } + if (type == typeof(MatchmakerModels.PlayerJoinedRequest)) { if (_instance.OnMatchmakerPlayerJoinedRequestEvent != null) { _instance.OnMatchmakerPlayerJoinedRequestEvent((MatchmakerModels.PlayerJoinedRequest)e.Request); return; } } + if (type == typeof(MatchmakerModels.PlayerLeftRequest)) { if (_instance.OnMatchmakerPlayerLeftRequestEvent != null) { _instance.OnMatchmakerPlayerLeftRequestEvent((MatchmakerModels.PlayerLeftRequest)e.Request); return; } } + if (type == typeof(MatchmakerModels.UserInfoRequest)) { if (_instance.OnMatchmakerUserInfoRequestEvent != null) { _instance.OnMatchmakerUserInfoRequestEvent((MatchmakerModels.UserInfoRequest)e.Request); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API + if (type == typeof(ServerModels.AddCharacterVirtualCurrencyRequest)) { if (_instance.OnServerAddCharacterVirtualCurrencyRequestEvent != null) { _instance.OnServerAddCharacterVirtualCurrencyRequestEvent((ServerModels.AddCharacterVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddFriendRequest)) { if (_instance.OnServerAddFriendRequestEvent != null) { _instance.OnServerAddFriendRequestEvent((ServerModels.AddFriendRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddGenericIDRequest)) { if (_instance.OnServerAddGenericIDRequestEvent != null) { _instance.OnServerAddGenericIDRequestEvent((ServerModels.AddGenericIDRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddPlayerTagRequest)) { if (_instance.OnServerAddPlayerTagRequestEvent != null) { _instance.OnServerAddPlayerTagRequestEvent((ServerModels.AddPlayerTagRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddSharedGroupMembersRequest)) { if (_instance.OnServerAddSharedGroupMembersRequestEvent != null) { _instance.OnServerAddSharedGroupMembersRequestEvent((ServerModels.AddSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ServerModels.AddUserVirtualCurrencyRequest)) { if (_instance.OnServerAddUserVirtualCurrencyRequestEvent != null) { _instance.OnServerAddUserVirtualCurrencyRequestEvent((ServerModels.AddUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.AuthenticateSessionTicketRequest)) { if (_instance.OnServerAuthenticateSessionTicketRequestEvent != null) { _instance.OnServerAuthenticateSessionTicketRequestEvent((ServerModels.AuthenticateSessionTicketRequest)e.Request); return; } } + if (type == typeof(ServerModels.AwardSteamAchievementRequest)) { if (_instance.OnServerAwardSteamAchievementRequestEvent != null) { _instance.OnServerAwardSteamAchievementRequestEvent((ServerModels.AwardSteamAchievementRequest)e.Request); return; } } + if (type == typeof(ServerModels.BanUsersRequest)) { if (_instance.OnServerBanUsersRequestEvent != null) { _instance.OnServerBanUsersRequestEvent((ServerModels.BanUsersRequest)e.Request); return; } } + if (type == typeof(ServerModels.ConsumeItemRequest)) { if (_instance.OnServerConsumeItemRequestEvent != null) { _instance.OnServerConsumeItemRequestEvent((ServerModels.ConsumeItemRequest)e.Request); return; } } + if (type == typeof(ServerModels.CreateSharedGroupRequest)) { if (_instance.OnServerCreateSharedGroupRequestEvent != null) { _instance.OnServerCreateSharedGroupRequestEvent((ServerModels.CreateSharedGroupRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeleteCharacterFromUserRequest)) { if (_instance.OnServerDeleteCharacterFromUserRequestEvent != null) { _instance.OnServerDeleteCharacterFromUserRequestEvent((ServerModels.DeleteCharacterFromUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeletePlayerRequest)) { if (_instance.OnServerDeletePlayerRequestEvent != null) { _instance.OnServerDeletePlayerRequestEvent((ServerModels.DeletePlayerRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeletePushNotificationTemplateRequest)) { if (_instance.OnServerDeletePushNotificationTemplateRequestEvent != null) { _instance.OnServerDeletePushNotificationTemplateRequestEvent((ServerModels.DeletePushNotificationTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeleteSharedGroupRequest)) { if (_instance.OnServerDeleteSharedGroupRequestEvent != null) { _instance.OnServerDeleteSharedGroupRequestEvent((ServerModels.DeleteSharedGroupRequest)e.Request); return; } } + if (type == typeof(ServerModels.DeregisterGameRequest)) { if (_instance.OnServerDeregisterGameRequestEvent != null) { _instance.OnServerDeregisterGameRequestEvent((ServerModels.DeregisterGameRequest)e.Request); return; } } + if (type == typeof(ServerModels.EvaluateRandomResultTableRequest)) { if (_instance.OnServerEvaluateRandomResultTableRequestEvent != null) { _instance.OnServerEvaluateRandomResultTableRequestEvent((ServerModels.EvaluateRandomResultTableRequest)e.Request); return; } } + if (type == typeof(ServerModels.ExecuteCloudScriptServerRequest)) { if (_instance.OnServerExecuteCloudScriptRequestEvent != null) { _instance.OnServerExecuteCloudScriptRequestEvent((ServerModels.ExecuteCloudScriptServerRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetAllSegmentsRequest)) { if (_instance.OnServerGetAllSegmentsRequestEvent != null) { _instance.OnServerGetAllSegmentsRequestEvent((ServerModels.GetAllSegmentsRequest)e.Request); return; } } + if (type == typeof(ServerModels.ListUsersCharactersRequest)) { if (_instance.OnServerGetAllUsersCharactersRequestEvent != null) { _instance.OnServerGetAllUsersCharactersRequestEvent((ServerModels.ListUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCatalogItemsRequest)) { if (_instance.OnServerGetCatalogItemsRequestEvent != null) { _instance.OnServerGetCatalogItemsRequestEvent((ServerModels.GetCatalogItemsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterDataRequest)) { if (_instance.OnServerGetCharacterDataRequestEvent != null) { _instance.OnServerGetCharacterDataRequestEvent((ServerModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterDataRequest)) { if (_instance.OnServerGetCharacterInternalDataRequestEvent != null) { _instance.OnServerGetCharacterInternalDataRequestEvent((ServerModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterInventoryRequest)) { if (_instance.OnServerGetCharacterInventoryRequestEvent != null) { _instance.OnServerGetCharacterInventoryRequestEvent((ServerModels.GetCharacterInventoryRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterLeaderboardRequest)) { if (_instance.OnServerGetCharacterLeaderboardRequestEvent != null) { _instance.OnServerGetCharacterLeaderboardRequestEvent((ServerModels.GetCharacterLeaderboardRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterDataRequest)) { if (_instance.OnServerGetCharacterReadOnlyDataRequestEvent != null) { _instance.OnServerGetCharacterReadOnlyDataRequestEvent((ServerModels.GetCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetCharacterStatisticsRequest)) { if (_instance.OnServerGetCharacterStatisticsRequestEvent != null) { _instance.OnServerGetCharacterStatisticsRequestEvent((ServerModels.GetCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetContentDownloadUrlRequest)) { if (_instance.OnServerGetContentDownloadUrlRequestEvent != null) { _instance.OnServerGetContentDownloadUrlRequestEvent((ServerModels.GetContentDownloadUrlRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetFriendLeaderboardRequest)) { if (_instance.OnServerGetFriendLeaderboardRequestEvent != null) { _instance.OnServerGetFriendLeaderboardRequestEvent((ServerModels.GetFriendLeaderboardRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetFriendsListRequest)) { if (_instance.OnServerGetFriendsListRequestEvent != null) { _instance.OnServerGetFriendsListRequestEvent((ServerModels.GetFriendsListRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardRequest)) { if (_instance.OnServerGetLeaderboardRequestEvent != null) { _instance.OnServerGetLeaderboardRequestEvent((ServerModels.GetLeaderboardRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundCharacterRequest)) { if (_instance.OnServerGetLeaderboardAroundCharacterRequestEvent != null) { _instance.OnServerGetLeaderboardAroundCharacterRequestEvent((ServerModels.GetLeaderboardAroundCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundUserRequest)) { if (_instance.OnServerGetLeaderboardAroundUserRequestEvent != null) { _instance.OnServerGetLeaderboardAroundUserRequestEvent((ServerModels.GetLeaderboardAroundUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetLeaderboardForUsersCharactersRequest)) { if (_instance.OnServerGetLeaderboardForUserCharactersRequestEvent != null) { _instance.OnServerGetLeaderboardForUserCharactersRequestEvent((ServerModels.GetLeaderboardForUsersCharactersRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerCombinedInfoRequest)) { if (_instance.OnServerGetPlayerCombinedInfoRequestEvent != null) { _instance.OnServerGetPlayerCombinedInfoRequestEvent((ServerModels.GetPlayerCombinedInfoRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerProfileRequest)) { if (_instance.OnServerGetPlayerProfileRequestEvent != null) { _instance.OnServerGetPlayerProfileRequestEvent((ServerModels.GetPlayerProfileRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayersSegmentsRequest)) { if (_instance.OnServerGetPlayerSegmentsRequestEvent != null) { _instance.OnServerGetPlayerSegmentsRequestEvent((ServerModels.GetPlayersSegmentsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayersInSegmentRequest)) { if (_instance.OnServerGetPlayersInSegmentRequestEvent != null) { _instance.OnServerGetPlayersInSegmentRequestEvent((ServerModels.GetPlayersInSegmentRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticsRequest)) { if (_instance.OnServerGetPlayerStatisticsRequestEvent != null) { _instance.OnServerGetPlayerStatisticsRequestEvent((ServerModels.GetPlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticVersionsRequest)) { if (_instance.OnServerGetPlayerStatisticVersionsRequestEvent != null) { _instance.OnServerGetPlayerStatisticVersionsRequestEvent((ServerModels.GetPlayerStatisticVersionsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayerTagsRequest)) { if (_instance.OnServerGetPlayerTagsRequestEvent != null) { _instance.OnServerGetPlayerTagsRequestEvent((ServerModels.GetPlayerTagsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromFacebookIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookIDsRequestEvent((ServerModels.GetPlayFabIDsFromFacebookIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)) { if (_instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsRequestEvent((ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromGenericIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromGenericIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromGenericIDsRequestEvent((ServerModels.GetPlayFabIDsFromGenericIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)) { if (_instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsRequestEvent((ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)) { if (_instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsRequestEvent((ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromPSNAccountIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromPSNAccountIDsRequestEvent((ServerModels.GetPlayFabIDsFromPSNAccountIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromSteamIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromSteamIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromSteamIDsRequestEvent((ServerModels.GetPlayFabIDsFromSteamIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromTwitchIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromTwitchIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromTwitchIDsRequestEvent((ServerModels.GetPlayFabIDsFromTwitchIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromXboxLiveIDsRequest)) { if (_instance.OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent != null) { _instance.OnServerGetPlayFabIDsFromXboxLiveIDsRequestEvent((ServerModels.GetPlayFabIDsFromXboxLiveIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetPublisherDataRequest)) { if (_instance.OnServerGetPublisherDataRequestEvent != null) { _instance.OnServerGetPublisherDataRequestEvent((ServerModels.GetPublisherDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetRandomResultTablesRequest)) { if (_instance.OnServerGetRandomResultTablesRequestEvent != null) { _instance.OnServerGetRandomResultTablesRequestEvent((ServerModels.GetRandomResultTablesRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetServerCustomIDsFromPlayFabIDsRequest)) { if (_instance.OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent != null) { _instance.OnServerGetServerCustomIDsFromPlayFabIDsRequestEvent((ServerModels.GetServerCustomIDsFromPlayFabIDsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetSharedGroupDataRequest)) { if (_instance.OnServerGetSharedGroupDataRequestEvent != null) { _instance.OnServerGetSharedGroupDataRequestEvent((ServerModels.GetSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetStoreItemsServerRequest)) { if (_instance.OnServerGetStoreItemsRequestEvent != null) { _instance.OnServerGetStoreItemsRequestEvent((ServerModels.GetStoreItemsServerRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTimeRequest)) { if (_instance.OnServerGetTimeRequestEvent != null) { _instance.OnServerGetTimeRequestEvent((ServerModels.GetTimeRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTitleDataRequest)) { if (_instance.OnServerGetTitleDataRequestEvent != null) { _instance.OnServerGetTitleDataRequestEvent((ServerModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTitleDataRequest)) { if (_instance.OnServerGetTitleInternalDataRequestEvent != null) { _instance.OnServerGetTitleInternalDataRequestEvent((ServerModels.GetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetTitleNewsRequest)) { if (_instance.OnServerGetTitleNewsRequestEvent != null) { _instance.OnServerGetTitleNewsRequestEvent((ServerModels.GetTitleNewsRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserAccountInfoRequest)) { if (_instance.OnServerGetUserAccountInfoRequestEvent != null) { _instance.OnServerGetUserAccountInfoRequestEvent((ServerModels.GetUserAccountInfoRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserBansRequest)) { if (_instance.OnServerGetUserBansRequestEvent != null) { _instance.OnServerGetUserBansRequestEvent((ServerModels.GetUserBansRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserDataRequestEvent != null) { _instance.OnServerGetUserDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserInternalDataRequestEvent != null) { _instance.OnServerGetUserInternalDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserInventoryRequest)) { if (_instance.OnServerGetUserInventoryRequestEvent != null) { _instance.OnServerGetUserInventoryRequestEvent((ServerModels.GetUserInventoryRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserPublisherDataRequestEvent != null) { _instance.OnServerGetUserPublisherDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserPublisherInternalDataRequestEvent != null) { _instance.OnServerGetUserPublisherInternalDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnServerGetUserPublisherReadOnlyDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GetUserDataRequest)) { if (_instance.OnServerGetUserReadOnlyDataRequestEvent != null) { _instance.OnServerGetUserReadOnlyDataRequestEvent((ServerModels.GetUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantCharacterToUserRequest)) { if (_instance.OnServerGrantCharacterToUserRequestEvent != null) { _instance.OnServerGrantCharacterToUserRequestEvent((ServerModels.GrantCharacterToUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantItemsToCharacterRequest)) { if (_instance.OnServerGrantItemsToCharacterRequestEvent != null) { _instance.OnServerGrantItemsToCharacterRequestEvent((ServerModels.GrantItemsToCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantItemsToUserRequest)) { if (_instance.OnServerGrantItemsToUserRequestEvent != null) { _instance.OnServerGrantItemsToUserRequestEvent((ServerModels.GrantItemsToUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.GrantItemsToUsersRequest)) { if (_instance.OnServerGrantItemsToUsersRequestEvent != null) { _instance.OnServerGrantItemsToUsersRequestEvent((ServerModels.GrantItemsToUsersRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkNintendoServiceAccountRequest)) { if (_instance.OnServerLinkNintendoServiceAccountRequestEvent != null) { _instance.OnServerLinkNintendoServiceAccountRequestEvent((ServerModels.LinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnServerLinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnServerLinkNintendoSwitchDeviceIdRequestEvent((ServerModels.LinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkPSNAccountRequest)) { if (_instance.OnServerLinkPSNAccountRequestEvent != null) { _instance.OnServerLinkPSNAccountRequestEvent((ServerModels.LinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkServerCustomIdRequest)) { if (_instance.OnServerLinkServerCustomIdRequestEvent != null) { _instance.OnServerLinkServerCustomIdRequestEvent((ServerModels.LinkServerCustomIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkSteamIdRequest)) { if (_instance.OnServerLinkSteamIdRequestEvent != null) { _instance.OnServerLinkSteamIdRequestEvent((ServerModels.LinkSteamIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LinkXboxAccountRequest)) { if (_instance.OnServerLinkXboxAccountRequestEvent != null) { _instance.OnServerLinkXboxAccountRequestEvent((ServerModels.LinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithServerCustomIdRequest)) { if (_instance.OnServerLoginWithServerCustomIdRequestEvent != null) { _instance.OnServerLoginWithServerCustomIdRequestEvent((ServerModels.LoginWithServerCustomIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithSteamIdRequest)) { if (_instance.OnServerLoginWithSteamIdRequestEvent != null) { _instance.OnServerLoginWithSteamIdRequestEvent((ServerModels.LoginWithSteamIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithXboxRequest)) { if (_instance.OnServerLoginWithXboxRequestEvent != null) { _instance.OnServerLoginWithXboxRequestEvent((ServerModels.LoginWithXboxRequest)e.Request); return; } } + if (type == typeof(ServerModels.LoginWithXboxIdRequest)) { if (_instance.OnServerLoginWithXboxIdRequestEvent != null) { _instance.OnServerLoginWithXboxIdRequestEvent((ServerModels.LoginWithXboxIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.ModifyItemUsesRequest)) { if (_instance.OnServerModifyItemUsesRequestEvent != null) { _instance.OnServerModifyItemUsesRequestEvent((ServerModels.ModifyItemUsesRequest)e.Request); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromCharacterRequest)) { if (_instance.OnServerMoveItemToCharacterFromCharacterRequestEvent != null) { _instance.OnServerMoveItemToCharacterFromCharacterRequestEvent((ServerModels.MoveItemToCharacterFromCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromUserRequest)) { if (_instance.OnServerMoveItemToCharacterFromUserRequestEvent != null) { _instance.OnServerMoveItemToCharacterFromUserRequestEvent((ServerModels.MoveItemToCharacterFromUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.MoveItemToUserFromCharacterRequest)) { if (_instance.OnServerMoveItemToUserFromCharacterRequestEvent != null) { _instance.OnServerMoveItemToUserFromCharacterRequestEvent((ServerModels.MoveItemToUserFromCharacterRequest)e.Request); return; } } + if (type == typeof(ServerModels.NotifyMatchmakerPlayerLeftRequest)) { if (_instance.OnServerNotifyMatchmakerPlayerLeftRequestEvent != null) { _instance.OnServerNotifyMatchmakerPlayerLeftRequestEvent((ServerModels.NotifyMatchmakerPlayerLeftRequest)e.Request); return; } } + if (type == typeof(ServerModels.RedeemCouponRequest)) { if (_instance.OnServerRedeemCouponRequestEvent != null) { _instance.OnServerRedeemCouponRequestEvent((ServerModels.RedeemCouponRequest)e.Request); return; } } + if (type == typeof(ServerModels.RedeemMatchmakerTicketRequest)) { if (_instance.OnServerRedeemMatchmakerTicketRequestEvent != null) { _instance.OnServerRedeemMatchmakerTicketRequestEvent((ServerModels.RedeemMatchmakerTicketRequest)e.Request); return; } } + if (type == typeof(ServerModels.RefreshGameServerInstanceHeartbeatRequest)) { if (_instance.OnServerRefreshGameServerInstanceHeartbeatRequestEvent != null) { _instance.OnServerRefreshGameServerInstanceHeartbeatRequestEvent((ServerModels.RefreshGameServerInstanceHeartbeatRequest)e.Request); return; } } + if (type == typeof(ServerModels.RegisterGameRequest)) { if (_instance.OnServerRegisterGameRequestEvent != null) { _instance.OnServerRegisterGameRequestEvent((ServerModels.RegisterGameRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemoveFriendRequest)) { if (_instance.OnServerRemoveFriendRequestEvent != null) { _instance.OnServerRemoveFriendRequestEvent((ServerModels.RemoveFriendRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemoveGenericIDRequest)) { if (_instance.OnServerRemoveGenericIDRequestEvent != null) { _instance.OnServerRemoveGenericIDRequestEvent((ServerModels.RemoveGenericIDRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemovePlayerTagRequest)) { if (_instance.OnServerRemovePlayerTagRequestEvent != null) { _instance.OnServerRemovePlayerTagRequestEvent((ServerModels.RemovePlayerTagRequest)e.Request); return; } } + if (type == typeof(ServerModels.RemoveSharedGroupMembersRequest)) { if (_instance.OnServerRemoveSharedGroupMembersRequestEvent != null) { _instance.OnServerRemoveSharedGroupMembersRequestEvent((ServerModels.RemoveSharedGroupMembersRequest)e.Request); return; } } + if (type == typeof(ServerModels.ReportPlayerServerRequest)) { if (_instance.OnServerReportPlayerRequestEvent != null) { _instance.OnServerReportPlayerRequestEvent((ServerModels.ReportPlayerServerRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeAllBansForUserRequest)) { if (_instance.OnServerRevokeAllBansForUserRequestEvent != null) { _instance.OnServerRevokeAllBansForUserRequestEvent((ServerModels.RevokeAllBansForUserRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeBansRequest)) { if (_instance.OnServerRevokeBansRequestEvent != null) { _instance.OnServerRevokeBansRequestEvent((ServerModels.RevokeBansRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeInventoryItemRequest)) { if (_instance.OnServerRevokeInventoryItemRequestEvent != null) { _instance.OnServerRevokeInventoryItemRequestEvent((ServerModels.RevokeInventoryItemRequest)e.Request); return; } } + if (type == typeof(ServerModels.RevokeInventoryItemsRequest)) { if (_instance.OnServerRevokeInventoryItemsRequestEvent != null) { _instance.OnServerRevokeInventoryItemsRequestEvent((ServerModels.RevokeInventoryItemsRequest)e.Request); return; } } + if (type == typeof(ServerModels.SavePushNotificationTemplateRequest)) { if (_instance.OnServerSavePushNotificationTemplateRequestEvent != null) { _instance.OnServerSavePushNotificationTemplateRequestEvent((ServerModels.SavePushNotificationTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendCustomAccountRecoveryEmailRequest)) { if (_instance.OnServerSendCustomAccountRecoveryEmailRequestEvent != null) { _instance.OnServerSendCustomAccountRecoveryEmailRequestEvent((ServerModels.SendCustomAccountRecoveryEmailRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendEmailFromTemplateRequest)) { if (_instance.OnServerSendEmailFromTemplateRequestEvent != null) { _instance.OnServerSendEmailFromTemplateRequestEvent((ServerModels.SendEmailFromTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendPushNotificationRequest)) { if (_instance.OnServerSendPushNotificationRequestEvent != null) { _instance.OnServerSendPushNotificationRequestEvent((ServerModels.SendPushNotificationRequest)e.Request); return; } } + if (type == typeof(ServerModels.SendPushNotificationFromTemplateRequest)) { if (_instance.OnServerSendPushNotificationFromTemplateRequestEvent != null) { _instance.OnServerSendPushNotificationFromTemplateRequestEvent((ServerModels.SendPushNotificationFromTemplateRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetFriendTagsRequest)) { if (_instance.OnServerSetFriendTagsRequestEvent != null) { _instance.OnServerSetFriendTagsRequestEvent((ServerModels.SetFriendTagsRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetGameServerInstanceDataRequest)) { if (_instance.OnServerSetGameServerInstanceDataRequestEvent != null) { _instance.OnServerSetGameServerInstanceDataRequestEvent((ServerModels.SetGameServerInstanceDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetGameServerInstanceStateRequest)) { if (_instance.OnServerSetGameServerInstanceStateRequestEvent != null) { _instance.OnServerSetGameServerInstanceStateRequestEvent((ServerModels.SetGameServerInstanceStateRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetGameServerInstanceTagsRequest)) { if (_instance.OnServerSetGameServerInstanceTagsRequestEvent != null) { _instance.OnServerSetGameServerInstanceTagsRequestEvent((ServerModels.SetGameServerInstanceTagsRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetPlayerSecretRequest)) { if (_instance.OnServerSetPlayerSecretRequestEvent != null) { _instance.OnServerSetPlayerSecretRequestEvent((ServerModels.SetPlayerSecretRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetPublisherDataRequest)) { if (_instance.OnServerSetPublisherDataRequestEvent != null) { _instance.OnServerSetPublisherDataRequestEvent((ServerModels.SetPublisherDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetTitleDataRequest)) { if (_instance.OnServerSetTitleDataRequestEvent != null) { _instance.OnServerSetTitleDataRequestEvent((ServerModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.SetTitleDataRequest)) { if (_instance.OnServerSetTitleInternalDataRequestEvent != null) { _instance.OnServerSetTitleInternalDataRequestEvent((ServerModels.SetTitleDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.SubtractCharacterVirtualCurrencyRequest)) { if (_instance.OnServerSubtractCharacterVirtualCurrencyRequestEvent != null) { _instance.OnServerSubtractCharacterVirtualCurrencyRequestEvent((ServerModels.SubtractCharacterVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.SubtractUserVirtualCurrencyRequest)) { if (_instance.OnServerSubtractUserVirtualCurrencyRequestEvent != null) { _instance.OnServerSubtractUserVirtualCurrencyRequestEvent((ServerModels.SubtractUserVirtualCurrencyRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkNintendoServiceAccountRequest)) { if (_instance.OnServerUnlinkNintendoServiceAccountRequestEvent != null) { _instance.OnServerUnlinkNintendoServiceAccountRequestEvent((ServerModels.UnlinkNintendoServiceAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkNintendoSwitchDeviceIdRequest)) { if (_instance.OnServerUnlinkNintendoSwitchDeviceIdRequestEvent != null) { _instance.OnServerUnlinkNintendoSwitchDeviceIdRequestEvent((ServerModels.UnlinkNintendoSwitchDeviceIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkPSNAccountRequest)) { if (_instance.OnServerUnlinkPSNAccountRequestEvent != null) { _instance.OnServerUnlinkPSNAccountRequestEvent((ServerModels.UnlinkPSNAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkServerCustomIdRequest)) { if (_instance.OnServerUnlinkServerCustomIdRequestEvent != null) { _instance.OnServerUnlinkServerCustomIdRequestEvent((ServerModels.UnlinkServerCustomIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkSteamIdRequest)) { if (_instance.OnServerUnlinkSteamIdRequestEvent != null) { _instance.OnServerUnlinkSteamIdRequestEvent((ServerModels.UnlinkSteamIdRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlinkXboxAccountRequest)) { if (_instance.OnServerUnlinkXboxAccountRequestEvent != null) { _instance.OnServerUnlinkXboxAccountRequestEvent((ServerModels.UnlinkXboxAccountRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlockContainerInstanceRequest)) { if (_instance.OnServerUnlockContainerInstanceRequestEvent != null) { _instance.OnServerUnlockContainerInstanceRequestEvent((ServerModels.UnlockContainerInstanceRequest)e.Request); return; } } + if (type == typeof(ServerModels.UnlockContainerItemRequest)) { if (_instance.OnServerUnlockContainerItemRequestEvent != null) { _instance.OnServerUnlockContainerItemRequestEvent((ServerModels.UnlockContainerItemRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateAvatarUrlRequest)) { if (_instance.OnServerUpdateAvatarUrlRequestEvent != null) { _instance.OnServerUpdateAvatarUrlRequestEvent((ServerModels.UpdateAvatarUrlRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateBansRequest)) { if (_instance.OnServerUpdateBansRequestEvent != null) { _instance.OnServerUpdateBansRequestEvent((ServerModels.UpdateBansRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataRequest)) { if (_instance.OnServerUpdateCharacterDataRequestEvent != null) { _instance.OnServerUpdateCharacterDataRequestEvent((ServerModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataRequest)) { if (_instance.OnServerUpdateCharacterInternalDataRequestEvent != null) { _instance.OnServerUpdateCharacterInternalDataRequestEvent((ServerModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataRequest)) { if (_instance.OnServerUpdateCharacterReadOnlyDataRequestEvent != null) { _instance.OnServerUpdateCharacterReadOnlyDataRequestEvent((ServerModels.UpdateCharacterDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateCharacterStatisticsRequest)) { if (_instance.OnServerUpdateCharacterStatisticsRequestEvent != null) { _instance.OnServerUpdateCharacterStatisticsRequestEvent((ServerModels.UpdateCharacterStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdatePlayerStatisticsRequest)) { if (_instance.OnServerUpdatePlayerStatisticsRequestEvent != null) { _instance.OnServerUpdatePlayerStatisticsRequestEvent((ServerModels.UpdatePlayerStatisticsRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateSharedGroupDataRequest)) { if (_instance.OnServerUpdateSharedGroupDataRequestEvent != null) { _instance.OnServerUpdateSharedGroupDataRequestEvent((ServerModels.UpdateSharedGroupDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserDataRequestEvent != null) { _instance.OnServerUpdateUserDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserInternalDataRequest)) { if (_instance.OnServerUpdateUserInternalDataRequestEvent != null) { _instance.OnServerUpdateUserInternalDataRequestEvent((ServerModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserInventoryItemDataRequest)) { if (_instance.OnServerUpdateUserInventoryItemCustomDataRequestEvent != null) { _instance.OnServerUpdateUserInventoryItemCustomDataRequestEvent((ServerModels.UpdateUserInventoryItemDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserPublisherDataRequestEvent != null) { _instance.OnServerUpdateUserPublisherDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserInternalDataRequest)) { if (_instance.OnServerUpdateUserPublisherInternalDataRequestEvent != null) { _instance.OnServerUpdateUserPublisherInternalDataRequestEvent((ServerModels.UpdateUserInternalDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserPublisherReadOnlyDataRequestEvent != null) { _instance.OnServerUpdateUserPublisherReadOnlyDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.UpdateUserDataRequest)) { if (_instance.OnServerUpdateUserReadOnlyDataRequestEvent != null) { _instance.OnServerUpdateUserReadOnlyDataRequestEvent((ServerModels.UpdateUserDataRequest)e.Request); return; } } + if (type == typeof(ServerModels.WriteServerCharacterEventRequest)) { if (_instance.OnServerWriteCharacterEventRequestEvent != null) { _instance.OnServerWriteCharacterEventRequestEvent((ServerModels.WriteServerCharacterEventRequest)e.Request); return; } } + if (type == typeof(ServerModels.WriteServerPlayerEventRequest)) { if (_instance.OnServerWritePlayerEventRequestEvent != null) { _instance.OnServerWritePlayerEventRequestEvent((ServerModels.WriteServerPlayerEventRequest)e.Request); return; } } + if (type == typeof(ServerModels.WriteTitleEventRequest)) { if (_instance.OnServerWriteTitleEventRequestEvent != null) { _instance.OnServerWriteTitleEventRequestEvent((ServerModels.WriteTitleEventRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(AuthenticationModels.AuthenticateCustomIdRequest)) { if (_instance.OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent != null) { _instance.OnAuthenticationAuthenticateGameServerWithCustomIdRequestEvent((AuthenticationModels.AuthenticateCustomIdRequest)e.Request); return; } } + if (type == typeof(AuthenticationModels.DeleteRequest)) { if (_instance.OnAuthenticationDeleteRequestEvent != null) { _instance.OnAuthenticationDeleteRequestEvent((AuthenticationModels.DeleteRequest)e.Request); return; } } + if (type == typeof(AuthenticationModels.GetEntityTokenRequest)) { if (_instance.OnAuthenticationGetEntityTokenRequestEvent != null) { _instance.OnAuthenticationGetEntityTokenRequestEvent((AuthenticationModels.GetEntityTokenRequest)e.Request); return; } } + if (type == typeof(AuthenticationModels.ValidateEntityTokenRequest)) { if (_instance.OnAuthenticationValidateEntityTokenRequestEvent != null) { _instance.OnAuthenticationValidateEntityTokenRequestEvent((AuthenticationModels.ValidateEntityTokenRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(CloudScriptModels.ExecuteEntityCloudScriptRequest)) { if (_instance.OnCloudScriptExecuteEntityCloudScriptRequestEvent != null) { _instance.OnCloudScriptExecuteEntityCloudScriptRequestEvent((CloudScriptModels.ExecuteEntityCloudScriptRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ExecuteFunctionRequest)) { if (_instance.OnCloudScriptExecuteFunctionRequestEvent != null) { _instance.OnCloudScriptExecuteFunctionRequestEvent((CloudScriptModels.ExecuteFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.GetFunctionRequest)) { if (_instance.OnCloudScriptGetFunctionRequestEvent != null) { _instance.OnCloudScriptGetFunctionRequestEvent((CloudScriptModels.GetFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsRequest)) { if (_instance.OnCloudScriptListFunctionsRequestEvent != null) { _instance.OnCloudScriptListFunctionsRequestEvent((CloudScriptModels.ListFunctionsRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsRequest)) { if (_instance.OnCloudScriptListHttpFunctionsRequestEvent != null) { _instance.OnCloudScriptListHttpFunctionsRequestEvent((CloudScriptModels.ListFunctionsRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsRequest)) { if (_instance.OnCloudScriptListQueuedFunctionsRequestEvent != null) { _instance.OnCloudScriptListQueuedFunctionsRequestEvent((CloudScriptModels.ListFunctionsRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForEntityTriggeredActionRequest)) { if (_instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionRequestEvent((CloudScriptModels.PostFunctionResultForEntityTriggeredActionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForFunctionExecutionRequest)) { if (_instance.OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForFunctionExecutionRequestEvent((CloudScriptModels.PostFunctionResultForFunctionExecutionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForPlayerTriggeredActionRequest)) { if (_instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionRequestEvent((CloudScriptModels.PostFunctionResultForPlayerTriggeredActionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.PostFunctionResultForScheduledTaskRequest)) { if (_instance.OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent != null) { _instance.OnCloudScriptPostFunctionResultForScheduledTaskRequestEvent((CloudScriptModels.PostFunctionResultForScheduledTaskRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.RegisterHttpFunctionRequest)) { if (_instance.OnCloudScriptRegisterHttpFunctionRequestEvent != null) { _instance.OnCloudScriptRegisterHttpFunctionRequestEvent((CloudScriptModels.RegisterHttpFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.RegisterQueuedFunctionRequest)) { if (_instance.OnCloudScriptRegisterQueuedFunctionRequestEvent != null) { _instance.OnCloudScriptRegisterQueuedFunctionRequestEvent((CloudScriptModels.RegisterQueuedFunctionRequest)e.Request); return; } } + if (type == typeof(CloudScriptModels.UnregisterFunctionRequest)) { if (_instance.OnCloudScriptUnregisterFunctionRequestEvent != null) { _instance.OnCloudScriptUnregisterFunctionRequestEvent((CloudScriptModels.UnregisterFunctionRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(DataModels.AbortFileUploadsRequest)) { if (_instance.OnDataAbortFileUploadsRequestEvent != null) { _instance.OnDataAbortFileUploadsRequestEvent((DataModels.AbortFileUploadsRequest)e.Request); return; } } + if (type == typeof(DataModels.DeleteFilesRequest)) { if (_instance.OnDataDeleteFilesRequestEvent != null) { _instance.OnDataDeleteFilesRequestEvent((DataModels.DeleteFilesRequest)e.Request); return; } } + if (type == typeof(DataModels.FinalizeFileUploadsRequest)) { if (_instance.OnDataFinalizeFileUploadsRequestEvent != null) { _instance.OnDataFinalizeFileUploadsRequestEvent((DataModels.FinalizeFileUploadsRequest)e.Request); return; } } + if (type == typeof(DataModels.GetFilesRequest)) { if (_instance.OnDataGetFilesRequestEvent != null) { _instance.OnDataGetFilesRequestEvent((DataModels.GetFilesRequest)e.Request); return; } } + if (type == typeof(DataModels.GetObjectsRequest)) { if (_instance.OnDataGetObjectsRequestEvent != null) { _instance.OnDataGetObjectsRequestEvent((DataModels.GetObjectsRequest)e.Request); return; } } + if (type == typeof(DataModels.InitiateFileUploadsRequest)) { if (_instance.OnDataInitiateFileUploadsRequestEvent != null) { _instance.OnDataInitiateFileUploadsRequestEvent((DataModels.InitiateFileUploadsRequest)e.Request); return; } } + if (type == typeof(DataModels.SetObjectsRequest)) { if (_instance.OnDataSetObjectsRequestEvent != null) { _instance.OnDataSetObjectsRequestEvent((DataModels.SetObjectsRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(EconomyModels.AddInventoryItemsRequest)) { if (_instance.OnEconomyAddInventoryItemsRequestEvent != null) { _instance.OnEconomyAddInventoryItemsRequestEvent((EconomyModels.AddInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.CreateDraftItemRequest)) { if (_instance.OnEconomyCreateDraftItemRequestEvent != null) { _instance.OnEconomyCreateDraftItemRequestEvent((EconomyModels.CreateDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.CreateUploadUrlsRequest)) { if (_instance.OnEconomyCreateUploadUrlsRequestEvent != null) { _instance.OnEconomyCreateUploadUrlsRequestEvent((EconomyModels.CreateUploadUrlsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteEntityItemReviewsRequest)) { if (_instance.OnEconomyDeleteEntityItemReviewsRequestEvent != null) { _instance.OnEconomyDeleteEntityItemReviewsRequestEvent((EconomyModels.DeleteEntityItemReviewsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteInventoryCollectionRequest)) { if (_instance.OnEconomyDeleteInventoryCollectionRequestEvent != null) { _instance.OnEconomyDeleteInventoryCollectionRequestEvent((EconomyModels.DeleteInventoryCollectionRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteInventoryItemsRequest)) { if (_instance.OnEconomyDeleteInventoryItemsRequestEvent != null) { _instance.OnEconomyDeleteInventoryItemsRequestEvent((EconomyModels.DeleteInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.DeleteItemRequest)) { if (_instance.OnEconomyDeleteItemRequestEvent != null) { _instance.OnEconomyDeleteItemRequestEvent((EconomyModels.DeleteItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ExecuteInventoryOperationsRequest)) { if (_instance.OnEconomyExecuteInventoryOperationsRequestEvent != null) { _instance.OnEconomyExecuteInventoryOperationsRequestEvent((EconomyModels.ExecuteInventoryOperationsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetCatalogConfigRequest)) { if (_instance.OnEconomyGetCatalogConfigRequestEvent != null) { _instance.OnEconomyGetCatalogConfigRequestEvent((EconomyModels.GetCatalogConfigRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetDraftItemRequest)) { if (_instance.OnEconomyGetDraftItemRequestEvent != null) { _instance.OnEconomyGetDraftItemRequestEvent((EconomyModels.GetDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetDraftItemsRequest)) { if (_instance.OnEconomyGetDraftItemsRequestEvent != null) { _instance.OnEconomyGetDraftItemsRequestEvent((EconomyModels.GetDraftItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetEntityDraftItemsRequest)) { if (_instance.OnEconomyGetEntityDraftItemsRequestEvent != null) { _instance.OnEconomyGetEntityDraftItemsRequestEvent((EconomyModels.GetEntityDraftItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetEntityItemReviewRequest)) { if (_instance.OnEconomyGetEntityItemReviewRequestEvent != null) { _instance.OnEconomyGetEntityItemReviewRequestEvent((EconomyModels.GetEntityItemReviewRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetInventoryCollectionIdsRequest)) { if (_instance.OnEconomyGetInventoryCollectionIdsRequestEvent != null) { _instance.OnEconomyGetInventoryCollectionIdsRequestEvent((EconomyModels.GetInventoryCollectionIdsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetInventoryItemsRequest)) { if (_instance.OnEconomyGetInventoryItemsRequestEvent != null) { _instance.OnEconomyGetInventoryItemsRequestEvent((EconomyModels.GetInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemRequest)) { if (_instance.OnEconomyGetItemRequestEvent != null) { _instance.OnEconomyGetItemRequestEvent((EconomyModels.GetItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemContainersRequest)) { if (_instance.OnEconomyGetItemContainersRequestEvent != null) { _instance.OnEconomyGetItemContainersRequestEvent((EconomyModels.GetItemContainersRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemModerationStateRequest)) { if (_instance.OnEconomyGetItemModerationStateRequestEvent != null) { _instance.OnEconomyGetItemModerationStateRequestEvent((EconomyModels.GetItemModerationStateRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemPublishStatusRequest)) { if (_instance.OnEconomyGetItemPublishStatusRequestEvent != null) { _instance.OnEconomyGetItemPublishStatusRequestEvent((EconomyModels.GetItemPublishStatusRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemReviewsRequest)) { if (_instance.OnEconomyGetItemReviewsRequestEvent != null) { _instance.OnEconomyGetItemReviewsRequestEvent((EconomyModels.GetItemReviewsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemReviewSummaryRequest)) { if (_instance.OnEconomyGetItemReviewSummaryRequestEvent != null) { _instance.OnEconomyGetItemReviewSummaryRequestEvent((EconomyModels.GetItemReviewSummaryRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetItemsRequest)) { if (_instance.OnEconomyGetItemsRequestEvent != null) { _instance.OnEconomyGetItemsRequestEvent((EconomyModels.GetItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetMicrosoftStoreAccessTokensRequest)) { if (_instance.OnEconomyGetMicrosoftStoreAccessTokensRequestEvent != null) { _instance.OnEconomyGetMicrosoftStoreAccessTokensRequestEvent((EconomyModels.GetMicrosoftStoreAccessTokensRequest)e.Request); return; } } + if (type == typeof(EconomyModels.GetTransactionHistoryRequest)) { if (_instance.OnEconomyGetTransactionHistoryRequestEvent != null) { _instance.OnEconomyGetTransactionHistoryRequestEvent((EconomyModels.GetTransactionHistoryRequest)e.Request); return; } } + if (type == typeof(EconomyModels.PublishDraftItemRequest)) { if (_instance.OnEconomyPublishDraftItemRequestEvent != null) { _instance.OnEconomyPublishDraftItemRequestEvent((EconomyModels.PublishDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.PurchaseInventoryItemsRequest)) { if (_instance.OnEconomyPurchaseInventoryItemsRequestEvent != null) { _instance.OnEconomyPurchaseInventoryItemsRequestEvent((EconomyModels.PurchaseInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemAppleAppStoreInventoryItemsRequest)) { if (_instance.OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemAppleAppStoreInventoryItemsRequestEvent((EconomyModels.RedeemAppleAppStoreInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemGooglePlayInventoryItemsRequest)) { if (_instance.OnEconomyRedeemGooglePlayInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemGooglePlayInventoryItemsRequestEvent((EconomyModels.RedeemGooglePlayInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemMicrosoftStoreInventoryItemsRequest)) { if (_instance.OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemMicrosoftStoreInventoryItemsRequestEvent((EconomyModels.RedeemMicrosoftStoreInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemNintendoEShopInventoryItemsRequest)) { if (_instance.OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemNintendoEShopInventoryItemsRequestEvent((EconomyModels.RedeemNintendoEShopInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemPlayStationStoreInventoryItemsRequest)) { if (_instance.OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemPlayStationStoreInventoryItemsRequestEvent((EconomyModels.RedeemPlayStationStoreInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.RedeemSteamInventoryItemsRequest)) { if (_instance.OnEconomyRedeemSteamInventoryItemsRequestEvent != null) { _instance.OnEconomyRedeemSteamInventoryItemsRequestEvent((EconomyModels.RedeemSteamInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ReportItemRequest)) { if (_instance.OnEconomyReportItemRequestEvent != null) { _instance.OnEconomyReportItemRequestEvent((EconomyModels.ReportItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ReportItemReviewRequest)) { if (_instance.OnEconomyReportItemReviewRequestEvent != null) { _instance.OnEconomyReportItemReviewRequestEvent((EconomyModels.ReportItemReviewRequest)e.Request); return; } } + if (type == typeof(EconomyModels.ReviewItemRequest)) { if (_instance.OnEconomyReviewItemRequestEvent != null) { _instance.OnEconomyReviewItemRequestEvent((EconomyModels.ReviewItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SearchItemsRequest)) { if (_instance.OnEconomySearchItemsRequestEvent != null) { _instance.OnEconomySearchItemsRequestEvent((EconomyModels.SearchItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SetItemModerationStateRequest)) { if (_instance.OnEconomySetItemModerationStateRequestEvent != null) { _instance.OnEconomySetItemModerationStateRequestEvent((EconomyModels.SetItemModerationStateRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SubmitItemReviewVoteRequest)) { if (_instance.OnEconomySubmitItemReviewVoteRequestEvent != null) { _instance.OnEconomySubmitItemReviewVoteRequestEvent((EconomyModels.SubmitItemReviewVoteRequest)e.Request); return; } } + if (type == typeof(EconomyModels.SubtractInventoryItemsRequest)) { if (_instance.OnEconomySubtractInventoryItemsRequestEvent != null) { _instance.OnEconomySubtractInventoryItemsRequestEvent((EconomyModels.SubtractInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.TakedownItemReviewsRequest)) { if (_instance.OnEconomyTakedownItemReviewsRequestEvent != null) { _instance.OnEconomyTakedownItemReviewsRequestEvent((EconomyModels.TakedownItemReviewsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.TransferInventoryItemsRequest)) { if (_instance.OnEconomyTransferInventoryItemsRequestEvent != null) { _instance.OnEconomyTransferInventoryItemsRequestEvent((EconomyModels.TransferInventoryItemsRequest)e.Request); return; } } + if (type == typeof(EconomyModels.UpdateCatalogConfigRequest)) { if (_instance.OnEconomyUpdateCatalogConfigRequestEvent != null) { _instance.OnEconomyUpdateCatalogConfigRequestEvent((EconomyModels.UpdateCatalogConfigRequest)e.Request); return; } } + if (type == typeof(EconomyModels.UpdateDraftItemRequest)) { if (_instance.OnEconomyUpdateDraftItemRequestEvent != null) { _instance.OnEconomyUpdateDraftItemRequestEvent((EconomyModels.UpdateDraftItemRequest)e.Request); return; } } + if (type == typeof(EconomyModels.UpdateInventoryItemsRequest)) { if (_instance.OnEconomyUpdateInventoryItemsRequestEvent != null) { _instance.OnEconomyUpdateInventoryItemsRequestEvent((EconomyModels.UpdateInventoryItemsRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(EventsModels.WriteEventsRequest)) { if (_instance.OnEventsWriteEventsRequestEvent != null) { _instance.OnEventsWriteEventsRequestEvent((EventsModels.WriteEventsRequest)e.Request); return; } } + if (type == typeof(EventsModels.WriteEventsRequest)) { if (_instance.OnEventsWriteTelemetryEventsRequestEvent != null) { _instance.OnEventsWriteTelemetryEventsRequestEvent((EventsModels.WriteEventsRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(ExperimentationModels.CreateExclusionGroupRequest)) { if (_instance.OnExperimentationCreateExclusionGroupRequestEvent != null) { _instance.OnExperimentationCreateExclusionGroupRequestEvent((ExperimentationModels.CreateExclusionGroupRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.CreateExperimentRequest)) { if (_instance.OnExperimentationCreateExperimentRequestEvent != null) { _instance.OnExperimentationCreateExperimentRequestEvent((ExperimentationModels.CreateExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.DeleteExclusionGroupRequest)) { if (_instance.OnExperimentationDeleteExclusionGroupRequestEvent != null) { _instance.OnExperimentationDeleteExclusionGroupRequestEvent((ExperimentationModels.DeleteExclusionGroupRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.DeleteExperimentRequest)) { if (_instance.OnExperimentationDeleteExperimentRequestEvent != null) { _instance.OnExperimentationDeleteExperimentRequestEvent((ExperimentationModels.DeleteExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupsRequest)) { if (_instance.OnExperimentationGetExclusionGroupsRequestEvent != null) { _instance.OnExperimentationGetExclusionGroupsRequestEvent((ExperimentationModels.GetExclusionGroupsRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupTrafficRequest)) { if (_instance.OnExperimentationGetExclusionGroupTrafficRequestEvent != null) { _instance.OnExperimentationGetExclusionGroupTrafficRequestEvent((ExperimentationModels.GetExclusionGroupTrafficRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetExperimentsRequest)) { if (_instance.OnExperimentationGetExperimentsRequestEvent != null) { _instance.OnExperimentationGetExperimentsRequestEvent((ExperimentationModels.GetExperimentsRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetLatestScorecardRequest)) { if (_instance.OnExperimentationGetLatestScorecardRequestEvent != null) { _instance.OnExperimentationGetLatestScorecardRequestEvent((ExperimentationModels.GetLatestScorecardRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.GetTreatmentAssignmentRequest)) { if (_instance.OnExperimentationGetTreatmentAssignmentRequestEvent != null) { _instance.OnExperimentationGetTreatmentAssignmentRequestEvent((ExperimentationModels.GetTreatmentAssignmentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.StartExperimentRequest)) { if (_instance.OnExperimentationStartExperimentRequestEvent != null) { _instance.OnExperimentationStartExperimentRequestEvent((ExperimentationModels.StartExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.StopExperimentRequest)) { if (_instance.OnExperimentationStopExperimentRequestEvent != null) { _instance.OnExperimentationStopExperimentRequestEvent((ExperimentationModels.StopExperimentRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.UpdateExclusionGroupRequest)) { if (_instance.OnExperimentationUpdateExclusionGroupRequestEvent != null) { _instance.OnExperimentationUpdateExclusionGroupRequestEvent((ExperimentationModels.UpdateExclusionGroupRequest)e.Request); return; } } + if (type == typeof(ExperimentationModels.UpdateExperimentRequest)) { if (_instance.OnExperimentationUpdateExperimentRequestEvent != null) { _instance.OnExperimentationUpdateExperimentRequestEvent((ExperimentationModels.UpdateExperimentRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(InsightsModels.InsightsEmptyRequest)) { if (_instance.OnInsightsGetDetailsRequestEvent != null) { _instance.OnInsightsGetDetailsRequestEvent((InsightsModels.InsightsEmptyRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsEmptyRequest)) { if (_instance.OnInsightsGetLimitsRequestEvent != null) { _instance.OnInsightsGetLimitsRequestEvent((InsightsModels.InsightsEmptyRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsGetOperationStatusRequest)) { if (_instance.OnInsightsGetOperationStatusRequestEvent != null) { _instance.OnInsightsGetOperationStatusRequestEvent((InsightsModels.InsightsGetOperationStatusRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsGetPendingOperationsRequest)) { if (_instance.OnInsightsGetPendingOperationsRequestEvent != null) { _instance.OnInsightsGetPendingOperationsRequestEvent((InsightsModels.InsightsGetPendingOperationsRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsSetPerformanceRequest)) { if (_instance.OnInsightsSetPerformanceRequestEvent != null) { _instance.OnInsightsSetPerformanceRequestEvent((InsightsModels.InsightsSetPerformanceRequest)e.Request); return; } } + if (type == typeof(InsightsModels.InsightsSetStorageRetentionRequest)) { if (_instance.OnInsightsSetStorageRetentionRequestEvent != null) { _instance.OnInsightsSetStorageRetentionRequestEvent((InsightsModels.InsightsSetStorageRetentionRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(GroupsModels.AcceptGroupApplicationRequest)) { if (_instance.OnGroupsAcceptGroupApplicationRequestEvent != null) { _instance.OnGroupsAcceptGroupApplicationRequestEvent((GroupsModels.AcceptGroupApplicationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.AcceptGroupInvitationRequest)) { if (_instance.OnGroupsAcceptGroupInvitationRequestEvent != null) { _instance.OnGroupsAcceptGroupInvitationRequestEvent((GroupsModels.AcceptGroupInvitationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.AddMembersRequest)) { if (_instance.OnGroupsAddMembersRequestEvent != null) { _instance.OnGroupsAddMembersRequestEvent((GroupsModels.AddMembersRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ApplyToGroupRequest)) { if (_instance.OnGroupsApplyToGroupRequestEvent != null) { _instance.OnGroupsApplyToGroupRequestEvent((GroupsModels.ApplyToGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.BlockEntityRequest)) { if (_instance.OnGroupsBlockEntityRequestEvent != null) { _instance.OnGroupsBlockEntityRequestEvent((GroupsModels.BlockEntityRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ChangeMemberRoleRequest)) { if (_instance.OnGroupsChangeMemberRoleRequestEvent != null) { _instance.OnGroupsChangeMemberRoleRequestEvent((GroupsModels.ChangeMemberRoleRequest)e.Request); return; } } + if (type == typeof(GroupsModels.CreateGroupRequest)) { if (_instance.OnGroupsCreateGroupRequestEvent != null) { _instance.OnGroupsCreateGroupRequestEvent((GroupsModels.CreateGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.CreateGroupRoleRequest)) { if (_instance.OnGroupsCreateRoleRequestEvent != null) { _instance.OnGroupsCreateRoleRequestEvent((GroupsModels.CreateGroupRoleRequest)e.Request); return; } } + if (type == typeof(GroupsModels.DeleteGroupRequest)) { if (_instance.OnGroupsDeleteGroupRequestEvent != null) { _instance.OnGroupsDeleteGroupRequestEvent((GroupsModels.DeleteGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.DeleteRoleRequest)) { if (_instance.OnGroupsDeleteRoleRequestEvent != null) { _instance.OnGroupsDeleteRoleRequestEvent((GroupsModels.DeleteRoleRequest)e.Request); return; } } + if (type == typeof(GroupsModels.GetGroupRequest)) { if (_instance.OnGroupsGetGroupRequestEvent != null) { _instance.OnGroupsGetGroupRequestEvent((GroupsModels.GetGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.InviteToGroupRequest)) { if (_instance.OnGroupsInviteToGroupRequestEvent != null) { _instance.OnGroupsInviteToGroupRequestEvent((GroupsModels.InviteToGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.IsMemberRequest)) { if (_instance.OnGroupsIsMemberRequestEvent != null) { _instance.OnGroupsIsMemberRequestEvent((GroupsModels.IsMemberRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupApplicationsRequest)) { if (_instance.OnGroupsListGroupApplicationsRequestEvent != null) { _instance.OnGroupsListGroupApplicationsRequestEvent((GroupsModels.ListGroupApplicationsRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupBlocksRequest)) { if (_instance.OnGroupsListGroupBlocksRequestEvent != null) { _instance.OnGroupsListGroupBlocksRequestEvent((GroupsModels.ListGroupBlocksRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupInvitationsRequest)) { if (_instance.OnGroupsListGroupInvitationsRequestEvent != null) { _instance.OnGroupsListGroupInvitationsRequestEvent((GroupsModels.ListGroupInvitationsRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListGroupMembersRequest)) { if (_instance.OnGroupsListGroupMembersRequestEvent != null) { _instance.OnGroupsListGroupMembersRequestEvent((GroupsModels.ListGroupMembersRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListMembershipRequest)) { if (_instance.OnGroupsListMembershipRequestEvent != null) { _instance.OnGroupsListMembershipRequestEvent((GroupsModels.ListMembershipRequest)e.Request); return; } } + if (type == typeof(GroupsModels.ListMembershipOpportunitiesRequest)) { if (_instance.OnGroupsListMembershipOpportunitiesRequestEvent != null) { _instance.OnGroupsListMembershipOpportunitiesRequestEvent((GroupsModels.ListMembershipOpportunitiesRequest)e.Request); return; } } + if (type == typeof(GroupsModels.RemoveGroupApplicationRequest)) { if (_instance.OnGroupsRemoveGroupApplicationRequestEvent != null) { _instance.OnGroupsRemoveGroupApplicationRequestEvent((GroupsModels.RemoveGroupApplicationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.RemoveGroupInvitationRequest)) { if (_instance.OnGroupsRemoveGroupInvitationRequestEvent != null) { _instance.OnGroupsRemoveGroupInvitationRequestEvent((GroupsModels.RemoveGroupInvitationRequest)e.Request); return; } } + if (type == typeof(GroupsModels.RemoveMembersRequest)) { if (_instance.OnGroupsRemoveMembersRequestEvent != null) { _instance.OnGroupsRemoveMembersRequestEvent((GroupsModels.RemoveMembersRequest)e.Request); return; } } + if (type == typeof(GroupsModels.UnblockEntityRequest)) { if (_instance.OnGroupsUnblockEntityRequestEvent != null) { _instance.OnGroupsUnblockEntityRequestEvent((GroupsModels.UnblockEntityRequest)e.Request); return; } } + if (type == typeof(GroupsModels.UpdateGroupRequest)) { if (_instance.OnGroupsUpdateGroupRequestEvent != null) { _instance.OnGroupsUpdateGroupRequestEvent((GroupsModels.UpdateGroupRequest)e.Request); return; } } + if (type == typeof(GroupsModels.UpdateGroupRoleRequest)) { if (_instance.OnGroupsUpdateRoleRequestEvent != null) { _instance.OnGroupsUpdateRoleRequestEvent((GroupsModels.UpdateGroupRoleRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(LocalizationModels.GetLanguageListRequest)) { if (_instance.OnLocalizationGetLanguageListRequestEvent != null) { _instance.OnLocalizationGetLanguageListRequestEvent((LocalizationModels.GetLanguageListRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(MultiplayerModels.CancelAllMatchmakingTicketsForPlayerRequest)) { if (_instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerRequestEvent((MultiplayerModels.CancelAllMatchmakingTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CancelAllServerBackfillTicketsForPlayerRequest)) { if (_instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerRequestEvent((MultiplayerModels.CancelAllServerBackfillTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CancelMatchmakingTicketRequest)) { if (_instance.OnMultiplayerCancelMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerCancelMatchmakingTicketRequestEvent((MultiplayerModels.CancelMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CancelServerBackfillTicketRequest)) { if (_instance.OnMultiplayerCancelServerBackfillTicketRequestEvent != null) { _instance.OnMultiplayerCancelServerBackfillTicketRequestEvent((MultiplayerModels.CancelServerBackfillTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildAliasRequest)) { if (_instance.OnMultiplayerCreateBuildAliasRequestEvent != null) { _instance.OnMultiplayerCreateBuildAliasRequestEvent((MultiplayerModels.CreateBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithCustomContainerRequest)) { if (_instance.OnMultiplayerCreateBuildWithCustomContainerRequestEvent != null) { _instance.OnMultiplayerCreateBuildWithCustomContainerRequestEvent((MultiplayerModels.CreateBuildWithCustomContainerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithManagedContainerRequest)) { if (_instance.OnMultiplayerCreateBuildWithManagedContainerRequestEvent != null) { _instance.OnMultiplayerCreateBuildWithManagedContainerRequestEvent((MultiplayerModels.CreateBuildWithManagedContainerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithProcessBasedServerRequest)) { if (_instance.OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent != null) { _instance.OnMultiplayerCreateBuildWithProcessBasedServerRequestEvent((MultiplayerModels.CreateBuildWithProcessBasedServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateLobbyRequest)) { if (_instance.OnMultiplayerCreateLobbyRequestEvent != null) { _instance.OnMultiplayerCreateLobbyRequestEvent((MultiplayerModels.CreateLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateMatchmakingTicketRequest)) { if (_instance.OnMultiplayerCreateMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerCreateMatchmakingTicketRequestEvent((MultiplayerModels.CreateMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateRemoteUserRequest)) { if (_instance.OnMultiplayerCreateRemoteUserRequestEvent != null) { _instance.OnMultiplayerCreateRemoteUserRequestEvent((MultiplayerModels.CreateRemoteUserRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateServerBackfillTicketRequest)) { if (_instance.OnMultiplayerCreateServerBackfillTicketRequestEvent != null) { _instance.OnMultiplayerCreateServerBackfillTicketRequestEvent((MultiplayerModels.CreateServerBackfillTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateServerMatchmakingTicketRequest)) { if (_instance.OnMultiplayerCreateServerMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerCreateServerMatchmakingTicketRequestEvent((MultiplayerModels.CreateServerMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeRequest)) { if (_instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent != null) { _instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeRequestEvent((MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteAssetRequest)) { if (_instance.OnMultiplayerDeleteAssetRequestEvent != null) { _instance.OnMultiplayerDeleteAssetRequestEvent((MultiplayerModels.DeleteAssetRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteBuildRequest)) { if (_instance.OnMultiplayerDeleteBuildRequestEvent != null) { _instance.OnMultiplayerDeleteBuildRequestEvent((MultiplayerModels.DeleteBuildRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteBuildAliasRequest)) { if (_instance.OnMultiplayerDeleteBuildAliasRequestEvent != null) { _instance.OnMultiplayerDeleteBuildAliasRequestEvent((MultiplayerModels.DeleteBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteBuildRegionRequest)) { if (_instance.OnMultiplayerDeleteBuildRegionRequestEvent != null) { _instance.OnMultiplayerDeleteBuildRegionRequestEvent((MultiplayerModels.DeleteBuildRegionRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteCertificateRequest)) { if (_instance.OnMultiplayerDeleteCertificateRequestEvent != null) { _instance.OnMultiplayerDeleteCertificateRequestEvent((MultiplayerModels.DeleteCertificateRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteContainerImageRequest)) { if (_instance.OnMultiplayerDeleteContainerImageRepositoryRequestEvent != null) { _instance.OnMultiplayerDeleteContainerImageRepositoryRequestEvent((MultiplayerModels.DeleteContainerImageRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteLobbyRequest)) { if (_instance.OnMultiplayerDeleteLobbyRequestEvent != null) { _instance.OnMultiplayerDeleteLobbyRequestEvent((MultiplayerModels.DeleteLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.DeleteRemoteUserRequest)) { if (_instance.OnMultiplayerDeleteRemoteUserRequestEvent != null) { _instance.OnMultiplayerDeleteRemoteUserRequestEvent((MultiplayerModels.DeleteRemoteUserRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.EnableMultiplayerServersForTitleRequest)) { if (_instance.OnMultiplayerEnableMultiplayerServersForTitleRequestEvent != null) { _instance.OnMultiplayerEnableMultiplayerServersForTitleRequestEvent((MultiplayerModels.EnableMultiplayerServersForTitleRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.FindFriendLobbiesRequest)) { if (_instance.OnMultiplayerFindFriendLobbiesRequestEvent != null) { _instance.OnMultiplayerFindFriendLobbiesRequestEvent((MultiplayerModels.FindFriendLobbiesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.FindLobbiesRequest)) { if (_instance.OnMultiplayerFindLobbiesRequestEvent != null) { _instance.OnMultiplayerFindLobbiesRequestEvent((MultiplayerModels.FindLobbiesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetAssetDownloadUrlRequest)) { if (_instance.OnMultiplayerGetAssetDownloadUrlRequestEvent != null) { _instance.OnMultiplayerGetAssetDownloadUrlRequestEvent((MultiplayerModels.GetAssetDownloadUrlRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetAssetUploadUrlRequest)) { if (_instance.OnMultiplayerGetAssetUploadUrlRequestEvent != null) { _instance.OnMultiplayerGetAssetUploadUrlRequestEvent((MultiplayerModels.GetAssetUploadUrlRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetBuildRequest)) { if (_instance.OnMultiplayerGetBuildRequestEvent != null) { _instance.OnMultiplayerGetBuildRequestEvent((MultiplayerModels.GetBuildRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetBuildAliasRequest)) { if (_instance.OnMultiplayerGetBuildAliasRequestEvent != null) { _instance.OnMultiplayerGetBuildAliasRequestEvent((MultiplayerModels.GetBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetContainerRegistryCredentialsRequest)) { if (_instance.OnMultiplayerGetContainerRegistryCredentialsRequestEvent != null) { _instance.OnMultiplayerGetContainerRegistryCredentialsRequestEvent((MultiplayerModels.GetContainerRegistryCredentialsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetLobbyRequest)) { if (_instance.OnMultiplayerGetLobbyRequestEvent != null) { _instance.OnMultiplayerGetLobbyRequestEvent((MultiplayerModels.GetLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMatchRequest)) { if (_instance.OnMultiplayerGetMatchRequestEvent != null) { _instance.OnMultiplayerGetMatchRequestEvent((MultiplayerModels.GetMatchRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingQueueRequest)) { if (_instance.OnMultiplayerGetMatchmakingQueueRequestEvent != null) { _instance.OnMultiplayerGetMatchmakingQueueRequestEvent((MultiplayerModels.GetMatchmakingQueueRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingTicketRequest)) { if (_instance.OnMultiplayerGetMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerGetMatchmakingTicketRequestEvent((MultiplayerModels.GetMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerDetailsRequest)) { if (_instance.OnMultiplayerGetMultiplayerServerDetailsRequestEvent != null) { _instance.OnMultiplayerGetMultiplayerServerDetailsRequestEvent((MultiplayerModels.GetMultiplayerServerDetailsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerLogsRequest)) { if (_instance.OnMultiplayerGetMultiplayerServerLogsRequestEvent != null) { _instance.OnMultiplayerGetMultiplayerServerLogsRequestEvent((MultiplayerModels.GetMultiplayerServerLogsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerSessionLogsBySessionIdRequest)) { if (_instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent != null) { _instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdRequestEvent((MultiplayerModels.GetMultiplayerSessionLogsBySessionIdRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetQueueStatisticsRequest)) { if (_instance.OnMultiplayerGetQueueStatisticsRequestEvent != null) { _instance.OnMultiplayerGetQueueStatisticsRequestEvent((MultiplayerModels.GetQueueStatisticsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetRemoteLoginEndpointRequest)) { if (_instance.OnMultiplayerGetRemoteLoginEndpointRequestEvent != null) { _instance.OnMultiplayerGetRemoteLoginEndpointRequestEvent((MultiplayerModels.GetRemoteLoginEndpointRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetServerBackfillTicketRequest)) { if (_instance.OnMultiplayerGetServerBackfillTicketRequestEvent != null) { _instance.OnMultiplayerGetServerBackfillTicketRequestEvent((MultiplayerModels.GetServerBackfillTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusRequest)) { if (_instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent != null) { _instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusRequestEvent((MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotaChangeRequest)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeRequestEvent((MultiplayerModels.GetTitleMultiplayerServersQuotaChangeRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotasRequest)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotasRequestEvent((MultiplayerModels.GetTitleMultiplayerServersQuotasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.InviteToLobbyRequest)) { if (_instance.OnMultiplayerInviteToLobbyRequestEvent != null) { _instance.OnMultiplayerInviteToLobbyRequestEvent((MultiplayerModels.InviteToLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.JoinArrangedLobbyRequest)) { if (_instance.OnMultiplayerJoinArrangedLobbyRequestEvent != null) { _instance.OnMultiplayerJoinArrangedLobbyRequestEvent((MultiplayerModels.JoinArrangedLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyRequest)) { if (_instance.OnMultiplayerJoinLobbyRequestEvent != null) { _instance.OnMultiplayerJoinLobbyRequestEvent((MultiplayerModels.JoinLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.JoinMatchmakingTicketRequest)) { if (_instance.OnMultiplayerJoinMatchmakingTicketRequestEvent != null) { _instance.OnMultiplayerJoinMatchmakingTicketRequestEvent((MultiplayerModels.JoinMatchmakingTicketRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.LeaveLobbyRequest)) { if (_instance.OnMultiplayerLeaveLobbyRequestEvent != null) { _instance.OnMultiplayerLeaveLobbyRequestEvent((MultiplayerModels.LeaveLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersRequest)) { if (_instance.OnMultiplayerListArchivedMultiplayerServersRequestEvent != null) { _instance.OnMultiplayerListArchivedMultiplayerServersRequestEvent((MultiplayerModels.ListMultiplayerServersRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListAssetSummariesRequest)) { if (_instance.OnMultiplayerListAssetSummariesRequestEvent != null) { _instance.OnMultiplayerListAssetSummariesRequestEvent((MultiplayerModels.ListAssetSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListBuildAliasesRequest)) { if (_instance.OnMultiplayerListBuildAliasesRequestEvent != null) { _instance.OnMultiplayerListBuildAliasesRequestEvent((MultiplayerModels.ListBuildAliasesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListBuildSummariesRequest)) { if (_instance.OnMultiplayerListBuildSummariesV2RequestEvent != null) { _instance.OnMultiplayerListBuildSummariesV2RequestEvent((MultiplayerModels.ListBuildSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListCertificateSummariesRequest)) { if (_instance.OnMultiplayerListCertificateSummariesRequestEvent != null) { _instance.OnMultiplayerListCertificateSummariesRequestEvent((MultiplayerModels.ListCertificateSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListContainerImagesRequest)) { if (_instance.OnMultiplayerListContainerImagesRequestEvent != null) { _instance.OnMultiplayerListContainerImagesRequestEvent((MultiplayerModels.ListContainerImagesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListContainerImageTagsRequest)) { if (_instance.OnMultiplayerListContainerImageTagsRequestEvent != null) { _instance.OnMultiplayerListContainerImageTagsRequestEvent((MultiplayerModels.ListContainerImageTagsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingQueuesRequest)) { if (_instance.OnMultiplayerListMatchmakingQueuesRequestEvent != null) { _instance.OnMultiplayerListMatchmakingQueuesRequestEvent((MultiplayerModels.ListMatchmakingQueuesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingTicketsForPlayerRequest)) { if (_instance.OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerListMatchmakingTicketsForPlayerRequestEvent((MultiplayerModels.ListMatchmakingTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersRequest)) { if (_instance.OnMultiplayerListMultiplayerServersRequestEvent != null) { _instance.OnMultiplayerListMultiplayerServersRequestEvent((MultiplayerModels.ListMultiplayerServersRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListPartyQosServersRequest)) { if (_instance.OnMultiplayerListPartyQosServersRequestEvent != null) { _instance.OnMultiplayerListPartyQosServersRequestEvent((MultiplayerModels.ListPartyQosServersRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListQosServersForTitleRequest)) { if (_instance.OnMultiplayerListQosServersForTitleRequestEvent != null) { _instance.OnMultiplayerListQosServersForTitleRequestEvent((MultiplayerModels.ListQosServersForTitleRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListServerBackfillTicketsForPlayerRequest)) { if (_instance.OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent != null) { _instance.OnMultiplayerListServerBackfillTicketsForPlayerRequestEvent((MultiplayerModels.ListServerBackfillTicketsForPlayerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListTitleMultiplayerServersQuotaChangesRequest)) { if (_instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent != null) { _instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesRequestEvent((MultiplayerModels.ListTitleMultiplayerServersQuotaChangesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ListVirtualMachineSummariesRequest)) { if (_instance.OnMultiplayerListVirtualMachineSummariesRequestEvent != null) { _instance.OnMultiplayerListVirtualMachineSummariesRequestEvent((MultiplayerModels.ListVirtualMachineSummariesRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RemoveMatchmakingQueueRequest)) { if (_instance.OnMultiplayerRemoveMatchmakingQueueRequestEvent != null) { _instance.OnMultiplayerRemoveMatchmakingQueueRequestEvent((MultiplayerModels.RemoveMatchmakingQueueRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RemoveMemberFromLobbyRequest)) { if (_instance.OnMultiplayerRemoveMemberRequestEvent != null) { _instance.OnMultiplayerRemoveMemberRequestEvent((MultiplayerModels.RemoveMemberFromLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RequestMultiplayerServerRequest)) { if (_instance.OnMultiplayerRequestMultiplayerServerRequestEvent != null) { _instance.OnMultiplayerRequestMultiplayerServerRequestEvent((MultiplayerModels.RequestMultiplayerServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.RolloverContainerRegistryCredentialsRequest)) { if (_instance.OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent != null) { _instance.OnMultiplayerRolloverContainerRegistryCredentialsRequestEvent((MultiplayerModels.RolloverContainerRegistryCredentialsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.SetMatchmakingQueueRequest)) { if (_instance.OnMultiplayerSetMatchmakingQueueRequestEvent != null) { _instance.OnMultiplayerSetMatchmakingQueueRequestEvent((MultiplayerModels.SetMatchmakingQueueRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.ShutdownMultiplayerServerRequest)) { if (_instance.OnMultiplayerShutdownMultiplayerServerRequestEvent != null) { _instance.OnMultiplayerShutdownMultiplayerServerRequestEvent((MultiplayerModels.ShutdownMultiplayerServerRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.SubscribeToLobbyResourceRequest)) { if (_instance.OnMultiplayerSubscribeToLobbyResourceRequestEvent != null) { _instance.OnMultiplayerSubscribeToLobbyResourceRequestEvent((MultiplayerModels.SubscribeToLobbyResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.SubscribeToMatchResourceRequest)) { if (_instance.OnMultiplayerSubscribeToMatchmakingResourceRequestEvent != null) { _instance.OnMultiplayerSubscribeToMatchmakingResourceRequestEvent((MultiplayerModels.SubscribeToMatchResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UnsubscribeFromLobbyResourceRequest)) { if (_instance.OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent != null) { _instance.OnMultiplayerUnsubscribeFromLobbyResourceRequestEvent((MultiplayerModels.UnsubscribeFromLobbyResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UnsubscribeFromMatchResourceRequest)) { if (_instance.OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent != null) { _instance.OnMultiplayerUnsubscribeFromMatchmakingResourceRequestEvent((MultiplayerModels.UnsubscribeFromMatchResourceRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UntagContainerImageRequest)) { if (_instance.OnMultiplayerUntagContainerImageRequestEvent != null) { _instance.OnMultiplayerUntagContainerImageRequestEvent((MultiplayerModels.UntagContainerImageRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildAliasRequest)) { if (_instance.OnMultiplayerUpdateBuildAliasRequestEvent != null) { _instance.OnMultiplayerUpdateBuildAliasRequestEvent((MultiplayerModels.UpdateBuildAliasRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildNameRequest)) { if (_instance.OnMultiplayerUpdateBuildNameRequestEvent != null) { _instance.OnMultiplayerUpdateBuildNameRequestEvent((MultiplayerModels.UpdateBuildNameRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildRegionRequest)) { if (_instance.OnMultiplayerUpdateBuildRegionRequestEvent != null) { _instance.OnMultiplayerUpdateBuildRegionRequestEvent((MultiplayerModels.UpdateBuildRegionRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateBuildRegionsRequest)) { if (_instance.OnMultiplayerUpdateBuildRegionsRequestEvent != null) { _instance.OnMultiplayerUpdateBuildRegionsRequestEvent((MultiplayerModels.UpdateBuildRegionsRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UpdateLobbyRequest)) { if (_instance.OnMultiplayerUpdateLobbyRequestEvent != null) { _instance.OnMultiplayerUpdateLobbyRequestEvent((MultiplayerModels.UpdateLobbyRequest)e.Request); return; } } + if (type == typeof(MultiplayerModels.UploadCertificateRequest)) { if (_instance.OnMultiplayerUploadCertificateRequestEvent != null) { _instance.OnMultiplayerUploadCertificateRequestEvent((MultiplayerModels.UploadCertificateRequest)e.Request); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + if (type == typeof(ProfilesModels.GetGlobalPolicyRequest)) { if (_instance.OnProfilesGetGlobalPolicyRequestEvent != null) { _instance.OnProfilesGetGlobalPolicyRequestEvent((ProfilesModels.GetGlobalPolicyRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetEntityProfileRequest)) { if (_instance.OnProfilesGetProfileRequestEvent != null) { _instance.OnProfilesGetProfileRequestEvent((ProfilesModels.GetEntityProfileRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetEntityProfilesRequest)) { if (_instance.OnProfilesGetProfilesRequestEvent != null) { _instance.OnProfilesGetProfilesRequestEvent((ProfilesModels.GetEntityProfilesRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsRequest)) { if (_instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent != null) { _instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsRequestEvent((ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromXboxLiveIDsRequest)) { if (_instance.OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent != null) { _instance.OnProfilesGetTitlePlayersFromXboxLiveIDsRequestEvent((ProfilesModels.GetTitlePlayersFromXboxLiveIDsRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.SetGlobalPolicyRequest)) { if (_instance.OnProfilesSetGlobalPolicyRequestEvent != null) { _instance.OnProfilesSetGlobalPolicyRequestEvent((ProfilesModels.SetGlobalPolicyRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.SetProfileLanguageRequest)) { if (_instance.OnProfilesSetProfileLanguageRequestEvent != null) { _instance.OnProfilesSetProfileLanguageRequestEvent((ProfilesModels.SetProfileLanguageRequest)e.Request); return; } } + if (type == typeof(ProfilesModels.SetEntityProfilePolicyRequest)) { if (_instance.OnProfilesSetProfilePolicyRequestEvent != null) { _instance.OnProfilesSetProfilePolicyRequestEvent((ProfilesModels.SetEntityProfilePolicyRequest)e.Request); return; } } +#endif + + } + else + { + var type = e.Result.GetType(); +#if ENABLE_PLAYFABADMIN_API + + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminAbortTaskInstanceResultEvent != null) { _instance.OnAdminAbortTaskInstanceResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.AddLocalizedNewsResult)) { if (_instance.OnAdminAddLocalizedNewsResultEvent != null) { _instance.OnAdminAddLocalizedNewsResultEvent((AdminModels.AddLocalizedNewsResult)e.Result); return; } } + if (type == typeof(AdminModels.AddNewsResult)) { if (_instance.OnAdminAddNewsResultEvent != null) { _instance.OnAdminAddNewsResultEvent((AdminModels.AddNewsResult)e.Result); return; } } + if (type == typeof(AdminModels.AddPlayerTagResult)) { if (_instance.OnAdminAddPlayerTagResultEvent != null) { _instance.OnAdminAddPlayerTagResultEvent((AdminModels.AddPlayerTagResult)e.Result); return; } } + if (type == typeof(AdminModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnAdminAddUserVirtualCurrencyResultEvent != null) { _instance.OnAdminAddUserVirtualCurrencyResultEvent((AdminModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(AdminModels.BlankResult)) { if (_instance.OnAdminAddVirtualCurrencyTypesResultEvent != null) { _instance.OnAdminAddVirtualCurrencyTypesResultEvent((AdminModels.BlankResult)e.Result); return; } } + if (type == typeof(AdminModels.BanUsersResult)) { if (_instance.OnAdminBanUsersResultEvent != null) { _instance.OnAdminBanUsersResultEvent((AdminModels.BanUsersResult)e.Result); return; } } + if (type == typeof(AdminModels.CheckLimitedEditionItemAvailabilityResult)) { if (_instance.OnAdminCheckLimitedEditionItemAvailabilityResultEvent != null) { _instance.OnAdminCheckLimitedEditionItemAvailabilityResultEvent((AdminModels.CheckLimitedEditionItemAvailabilityResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateTaskResult)) { if (_instance.OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent != null) { _instance.OnAdminCreateActionsOnPlayersInSegmentTaskResultEvent((AdminModels.CreateTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateTaskResult)) { if (_instance.OnAdminCreateCloudScriptTaskResultEvent != null) { _instance.OnAdminCreateCloudScriptTaskResultEvent((AdminModels.CreateTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateTaskResult)) { if (_instance.OnAdminCreateInsightsScheduledScalingTaskResultEvent != null) { _instance.OnAdminCreateInsightsScheduledScalingTaskResultEvent((AdminModels.CreateTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminCreateOpenIdConnectionResultEvent != null) { _instance.OnAdminCreateOpenIdConnectionResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.CreatePlayerSharedSecretResult)) { if (_instance.OnAdminCreatePlayerSharedSecretResultEvent != null) { _instance.OnAdminCreatePlayerSharedSecretResultEvent((AdminModels.CreatePlayerSharedSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.CreatePlayerStatisticDefinitionResult)) { if (_instance.OnAdminCreatePlayerStatisticDefinitionResultEvent != null) { _instance.OnAdminCreatePlayerStatisticDefinitionResultEvent((AdminModels.CreatePlayerStatisticDefinitionResult)e.Result); return; } } + if (type == typeof(AdminModels.CreateSegmentResponse)) { if (_instance.OnAdminCreateSegmentResultEvent != null) { _instance.OnAdminCreateSegmentResultEvent((AdminModels.CreateSegmentResponse)e.Result); return; } } + if (type == typeof(AdminModels.BlankResult)) { if (_instance.OnAdminDeleteContentResultEvent != null) { _instance.OnAdminDeleteContentResultEvent((AdminModels.BlankResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteMasterPlayerAccountResult)) { if (_instance.OnAdminDeleteMasterPlayerAccountResultEvent != null) { _instance.OnAdminDeleteMasterPlayerAccountResultEvent((AdminModels.DeleteMasterPlayerAccountResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteMembershipSubscriptionResult)) { if (_instance.OnAdminDeleteMembershipSubscriptionResultEvent != null) { _instance.OnAdminDeleteMembershipSubscriptionResultEvent((AdminModels.DeleteMembershipSubscriptionResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminDeleteOpenIdConnectionResultEvent != null) { _instance.OnAdminDeleteOpenIdConnectionResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.DeletePlayerResult)) { if (_instance.OnAdminDeletePlayerResultEvent != null) { _instance.OnAdminDeletePlayerResultEvent((AdminModels.DeletePlayerResult)e.Result); return; } } + if (type == typeof(AdminModels.DeletePlayerSharedSecretResult)) { if (_instance.OnAdminDeletePlayerSharedSecretResultEvent != null) { _instance.OnAdminDeletePlayerSharedSecretResultEvent((AdminModels.DeletePlayerSharedSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteSegmentsResponse)) { if (_instance.OnAdminDeleteSegmentResultEvent != null) { _instance.OnAdminDeleteSegmentResultEvent((AdminModels.DeleteSegmentsResponse)e.Result); return; } } + if (type == typeof(AdminModels.DeleteStoreResult)) { if (_instance.OnAdminDeleteStoreResultEvent != null) { _instance.OnAdminDeleteStoreResultEvent((AdminModels.DeleteStoreResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminDeleteTaskResultEvent != null) { _instance.OnAdminDeleteTaskResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.DeleteTitleResult)) { if (_instance.OnAdminDeleteTitleResultEvent != null) { _instance.OnAdminDeleteTitleResultEvent((AdminModels.DeleteTitleResult)e.Result); return; } } + if (type == typeof(AdminModels.DeleteTitleDataOverrideResult)) { if (_instance.OnAdminDeleteTitleDataOverrideResultEvent != null) { _instance.OnAdminDeleteTitleDataOverrideResultEvent((AdminModels.DeleteTitleDataOverrideResult)e.Result); return; } } + if (type == typeof(AdminModels.ExportMasterPlayerDataResult)) { if (_instance.OnAdminExportMasterPlayerDataResultEvent != null) { _instance.OnAdminExportMasterPlayerDataResultEvent((AdminModels.ExportMasterPlayerDataResult)e.Result); return; } } + if (type == typeof(AdminModels.ExportPlayersInSegmentResult)) { if (_instance.OnAdminExportPlayersInSegmentResultEvent != null) { _instance.OnAdminExportPlayersInSegmentResultEvent((AdminModels.ExportPlayersInSegmentResult)e.Result); return; } } + if (type == typeof(AdminModels.GetActionsOnPlayersInSegmentTaskInstanceResult)) { if (_instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent != null) { _instance.OnAdminGetActionsOnPlayersInSegmentTaskInstanceResultEvent((AdminModels.GetActionsOnPlayersInSegmentTaskInstanceResult)e.Result); return; } } + if (type == typeof(AdminModels.GetAllSegmentsResult)) { if (_instance.OnAdminGetAllSegmentsResultEvent != null) { _instance.OnAdminGetAllSegmentsResultEvent((AdminModels.GetAllSegmentsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCatalogItemsResult)) { if (_instance.OnAdminGetCatalogItemsResultEvent != null) { _instance.OnAdminGetCatalogItemsResultEvent((AdminModels.GetCatalogItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCloudScriptRevisionResult)) { if (_instance.OnAdminGetCloudScriptRevisionResultEvent != null) { _instance.OnAdminGetCloudScriptRevisionResultEvent((AdminModels.GetCloudScriptRevisionResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCloudScriptTaskInstanceResult)) { if (_instance.OnAdminGetCloudScriptTaskInstanceResultEvent != null) { _instance.OnAdminGetCloudScriptTaskInstanceResultEvent((AdminModels.GetCloudScriptTaskInstanceResult)e.Result); return; } } + if (type == typeof(AdminModels.GetCloudScriptVersionsResult)) { if (_instance.OnAdminGetCloudScriptVersionsResultEvent != null) { _instance.OnAdminGetCloudScriptVersionsResultEvent((AdminModels.GetCloudScriptVersionsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetContentListResult)) { if (_instance.OnAdminGetContentListResultEvent != null) { _instance.OnAdminGetContentListResultEvent((AdminModels.GetContentListResult)e.Result); return; } } + if (type == typeof(AdminModels.GetContentUploadUrlResult)) { if (_instance.OnAdminGetContentUploadUrlResultEvent != null) { _instance.OnAdminGetContentUploadUrlResultEvent((AdminModels.GetContentUploadUrlResult)e.Result); return; } } + if (type == typeof(AdminModels.GetDataReportResult)) { if (_instance.OnAdminGetDataReportResultEvent != null) { _instance.OnAdminGetDataReportResultEvent((AdminModels.GetDataReportResult)e.Result); return; } } + if (type == typeof(AdminModels.GetMatchmakerGameInfoResult)) { if (_instance.OnAdminGetMatchmakerGameInfoResultEvent != null) { _instance.OnAdminGetMatchmakerGameInfoResultEvent((AdminModels.GetMatchmakerGameInfoResult)e.Result); return; } } + if (type == typeof(AdminModels.GetMatchmakerGameModesResult)) { if (_instance.OnAdminGetMatchmakerGameModesResultEvent != null) { _instance.OnAdminGetMatchmakerGameModesResultEvent((AdminModels.GetMatchmakerGameModesResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayedTitleListResult)) { if (_instance.OnAdminGetPlayedTitleListResultEvent != null) { _instance.OnAdminGetPlayedTitleListResultEvent((AdminModels.GetPlayedTitleListResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerIdFromAuthTokenResult)) { if (_instance.OnAdminGetPlayerIdFromAuthTokenResultEvent != null) { _instance.OnAdminGetPlayerIdFromAuthTokenResultEvent((AdminModels.GetPlayerIdFromAuthTokenResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerProfileResult)) { if (_instance.OnAdminGetPlayerProfileResultEvent != null) { _instance.OnAdminGetPlayerProfileResultEvent((AdminModels.GetPlayerProfileResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerSegmentsResult)) { if (_instance.OnAdminGetPlayerSegmentsResultEvent != null) { _instance.OnAdminGetPlayerSegmentsResultEvent((AdminModels.GetPlayerSegmentsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerSharedSecretsResult)) { if (_instance.OnAdminGetPlayerSharedSecretsResultEvent != null) { _instance.OnAdminGetPlayerSharedSecretsResultEvent((AdminModels.GetPlayerSharedSecretsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentResult)) { if (_instance.OnAdminGetPlayersInSegmentResultEvent != null) { _instance.OnAdminGetPlayersInSegmentResultEvent((AdminModels.GetPlayersInSegmentResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticDefinitionsResult)) { if (_instance.OnAdminGetPlayerStatisticDefinitionsResultEvent != null) { _instance.OnAdminGetPlayerStatisticDefinitionsResultEvent((AdminModels.GetPlayerStatisticDefinitionsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerStatisticVersionsResult)) { if (_instance.OnAdminGetPlayerStatisticVersionsResultEvent != null) { _instance.OnAdminGetPlayerStatisticVersionsResultEvent((AdminModels.GetPlayerStatisticVersionsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayerTagsResult)) { if (_instance.OnAdminGetPlayerTagsResultEvent != null) { _instance.OnAdminGetPlayerTagsResultEvent((AdminModels.GetPlayerTagsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPolicyResponse)) { if (_instance.OnAdminGetPolicyResultEvent != null) { _instance.OnAdminGetPolicyResultEvent((AdminModels.GetPolicyResponse)e.Result); return; } } + if (type == typeof(AdminModels.GetPublisherDataResult)) { if (_instance.OnAdminGetPublisherDataResultEvent != null) { _instance.OnAdminGetPublisherDataResultEvent((AdminModels.GetPublisherDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetRandomResultTablesResult)) { if (_instance.OnAdminGetRandomResultTablesResultEvent != null) { _instance.OnAdminGetRandomResultTablesResultEvent((AdminModels.GetRandomResultTablesResult)e.Result); return; } } + if (type == typeof(AdminModels.GetPlayersInSegmentExportResponse)) { if (_instance.OnAdminGetSegmentExportResultEvent != null) { _instance.OnAdminGetSegmentExportResultEvent((AdminModels.GetPlayersInSegmentExportResponse)e.Result); return; } } + if (type == typeof(AdminModels.GetSegmentsResponse)) { if (_instance.OnAdminGetSegmentsResultEvent != null) { _instance.OnAdminGetSegmentsResultEvent((AdminModels.GetSegmentsResponse)e.Result); return; } } + if (type == typeof(AdminModels.GetStoreItemsResult)) { if (_instance.OnAdminGetStoreItemsResultEvent != null) { _instance.OnAdminGetStoreItemsResultEvent((AdminModels.GetStoreItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTaskInstancesResult)) { if (_instance.OnAdminGetTaskInstancesResultEvent != null) { _instance.OnAdminGetTaskInstancesResultEvent((AdminModels.GetTaskInstancesResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTasksResult)) { if (_instance.OnAdminGetTasksResultEvent != null) { _instance.OnAdminGetTasksResultEvent((AdminModels.GetTasksResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTitleDataResult)) { if (_instance.OnAdminGetTitleDataResultEvent != null) { _instance.OnAdminGetTitleDataResultEvent((AdminModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetTitleDataResult)) { if (_instance.OnAdminGetTitleInternalDataResultEvent != null) { _instance.OnAdminGetTitleInternalDataResultEvent((AdminModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.LookupUserAccountInfoResult)) { if (_instance.OnAdminGetUserAccountInfoResultEvent != null) { _instance.OnAdminGetUserAccountInfoResultEvent((AdminModels.LookupUserAccountInfoResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserBansResult)) { if (_instance.OnAdminGetUserBansResultEvent != null) { _instance.OnAdminGetUserBansResultEvent((AdminModels.GetUserBansResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserDataResultEvent != null) { _instance.OnAdminGetUserDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserInternalDataResultEvent != null) { _instance.OnAdminGetUserInternalDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserInventoryResult)) { if (_instance.OnAdminGetUserInventoryResultEvent != null) { _instance.OnAdminGetUserInventoryResultEvent((AdminModels.GetUserInventoryResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserPublisherDataResultEvent != null) { _instance.OnAdminGetUserPublisherDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserPublisherInternalDataResultEvent != null) { _instance.OnAdminGetUserPublisherInternalDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserPublisherReadOnlyDataResultEvent != null) { _instance.OnAdminGetUserPublisherReadOnlyDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GetUserDataResult)) { if (_instance.OnAdminGetUserReadOnlyDataResultEvent != null) { _instance.OnAdminGetUserReadOnlyDataResultEvent((AdminModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.GrantItemsToUsersResult)) { if (_instance.OnAdminGrantItemsToUsersResultEvent != null) { _instance.OnAdminGrantItemsToUsersResultEvent((AdminModels.GrantItemsToUsersResult)e.Result); return; } } + if (type == typeof(AdminModels.IncrementLimitedEditionItemAvailabilityResult)) { if (_instance.OnAdminIncrementLimitedEditionItemAvailabilityResultEvent != null) { _instance.OnAdminIncrementLimitedEditionItemAvailabilityResultEvent((AdminModels.IncrementLimitedEditionItemAvailabilityResult)e.Result); return; } } + if (type == typeof(AdminModels.IncrementPlayerStatisticVersionResult)) { if (_instance.OnAdminIncrementPlayerStatisticVersionResultEvent != null) { _instance.OnAdminIncrementPlayerStatisticVersionResultEvent((AdminModels.IncrementPlayerStatisticVersionResult)e.Result); return; } } + if (type == typeof(AdminModels.ListOpenIdConnectionResponse)) { if (_instance.OnAdminListOpenIdConnectionResultEvent != null) { _instance.OnAdminListOpenIdConnectionResultEvent((AdminModels.ListOpenIdConnectionResponse)e.Result); return; } } + if (type == typeof(AdminModels.ListVirtualCurrencyTypesResult)) { if (_instance.OnAdminListVirtualCurrencyTypesResultEvent != null) { _instance.OnAdminListVirtualCurrencyTypesResultEvent((AdminModels.ListVirtualCurrencyTypesResult)e.Result); return; } } + if (type == typeof(AdminModels.ModifyServerBuildResult)) { if (_instance.OnAdminModifyServerBuildResultEvent != null) { _instance.OnAdminModifyServerBuildResultEvent((AdminModels.ModifyServerBuildResult)e.Result); return; } } + if (type == typeof(AdminModels.RefundPurchaseResponse)) { if (_instance.OnAdminRefundPurchaseResultEvent != null) { _instance.OnAdminRefundPurchaseResultEvent((AdminModels.RefundPurchaseResponse)e.Result); return; } } + if (type == typeof(AdminModels.RemovePlayerTagResult)) { if (_instance.OnAdminRemovePlayerTagResultEvent != null) { _instance.OnAdminRemovePlayerTagResultEvent((AdminModels.RemovePlayerTagResult)e.Result); return; } } + if (type == typeof(AdminModels.BlankResult)) { if (_instance.OnAdminRemoveVirtualCurrencyTypesResultEvent != null) { _instance.OnAdminRemoveVirtualCurrencyTypesResultEvent((AdminModels.BlankResult)e.Result); return; } } + if (type == typeof(AdminModels.ResetCharacterStatisticsResult)) { if (_instance.OnAdminResetCharacterStatisticsResultEvent != null) { _instance.OnAdminResetCharacterStatisticsResultEvent((AdminModels.ResetCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(AdminModels.ResetPasswordResult)) { if (_instance.OnAdminResetPasswordResultEvent != null) { _instance.OnAdminResetPasswordResultEvent((AdminModels.ResetPasswordResult)e.Result); return; } } + if (type == typeof(AdminModels.ResetUserStatisticsResult)) { if (_instance.OnAdminResetUserStatisticsResultEvent != null) { _instance.OnAdminResetUserStatisticsResultEvent((AdminModels.ResetUserStatisticsResult)e.Result); return; } } + if (type == typeof(AdminModels.ResolvePurchaseDisputeResponse)) { if (_instance.OnAdminResolvePurchaseDisputeResultEvent != null) { _instance.OnAdminResolvePurchaseDisputeResultEvent((AdminModels.ResolvePurchaseDisputeResponse)e.Result); return; } } + if (type == typeof(AdminModels.RevokeAllBansForUserResult)) { if (_instance.OnAdminRevokeAllBansForUserResultEvent != null) { _instance.OnAdminRevokeAllBansForUserResultEvent((AdminModels.RevokeAllBansForUserResult)e.Result); return; } } + if (type == typeof(AdminModels.RevokeBansResult)) { if (_instance.OnAdminRevokeBansResultEvent != null) { _instance.OnAdminRevokeBansResultEvent((AdminModels.RevokeBansResult)e.Result); return; } } + if (type == typeof(AdminModels.RevokeInventoryResult)) { if (_instance.OnAdminRevokeInventoryItemResultEvent != null) { _instance.OnAdminRevokeInventoryItemResultEvent((AdminModels.RevokeInventoryResult)e.Result); return; } } + if (type == typeof(AdminModels.RevokeInventoryItemsResult)) { if (_instance.OnAdminRevokeInventoryItemsResultEvent != null) { _instance.OnAdminRevokeInventoryItemsResultEvent((AdminModels.RevokeInventoryItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.RunTaskResult)) { if (_instance.OnAdminRunTaskResultEvent != null) { _instance.OnAdminRunTaskResultEvent((AdminModels.RunTaskResult)e.Result); return; } } + if (type == typeof(AdminModels.SendAccountRecoveryEmailResult)) { if (_instance.OnAdminSendAccountRecoveryEmailResultEvent != null) { _instance.OnAdminSendAccountRecoveryEmailResultEvent((AdminModels.SendAccountRecoveryEmailResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsResult)) { if (_instance.OnAdminSetCatalogItemsResultEvent != null) { _instance.OnAdminSetCatalogItemsResultEvent((AdminModels.UpdateCatalogItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.SetMembershipOverrideResult)) { if (_instance.OnAdminSetMembershipOverrideResultEvent != null) { _instance.OnAdminSetMembershipOverrideResultEvent((AdminModels.SetMembershipOverrideResult)e.Result); return; } } + if (type == typeof(AdminModels.SetPlayerSecretResult)) { if (_instance.OnAdminSetPlayerSecretResultEvent != null) { _instance.OnAdminSetPlayerSecretResultEvent((AdminModels.SetPlayerSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.SetPublishedRevisionResult)) { if (_instance.OnAdminSetPublishedRevisionResultEvent != null) { _instance.OnAdminSetPublishedRevisionResultEvent((AdminModels.SetPublishedRevisionResult)e.Result); return; } } + if (type == typeof(AdminModels.SetPublisherDataResult)) { if (_instance.OnAdminSetPublisherDataResultEvent != null) { _instance.OnAdminSetPublisherDataResultEvent((AdminModels.SetPublisherDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsResult)) { if (_instance.OnAdminSetStoreItemsResultEvent != null) { _instance.OnAdminSetStoreItemsResultEvent((AdminModels.UpdateStoreItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.SetTitleDataResult)) { if (_instance.OnAdminSetTitleDataResultEvent != null) { _instance.OnAdminSetTitleDataResultEvent((AdminModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.SetTitleDataAndOverridesResult)) { if (_instance.OnAdminSetTitleDataAndOverridesResultEvent != null) { _instance.OnAdminSetTitleDataAndOverridesResultEvent((AdminModels.SetTitleDataAndOverridesResult)e.Result); return; } } + if (type == typeof(AdminModels.SetTitleDataResult)) { if (_instance.OnAdminSetTitleInternalDataResultEvent != null) { _instance.OnAdminSetTitleInternalDataResultEvent((AdminModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(AdminModels.SetupPushNotificationResult)) { if (_instance.OnAdminSetupPushNotificationResultEvent != null) { _instance.OnAdminSetupPushNotificationResultEvent((AdminModels.SetupPushNotificationResult)e.Result); return; } } + if (type == typeof(AdminModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnAdminSubtractUserVirtualCurrencyResultEvent != null) { _instance.OnAdminSubtractUserVirtualCurrencyResultEvent((AdminModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateBansResult)) { if (_instance.OnAdminUpdateBansResultEvent != null) { _instance.OnAdminUpdateBansResultEvent((AdminModels.UpdateBansResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateCatalogItemsResult)) { if (_instance.OnAdminUpdateCatalogItemsResultEvent != null) { _instance.OnAdminUpdateCatalogItemsResultEvent((AdminModels.UpdateCatalogItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateCloudScriptResult)) { if (_instance.OnAdminUpdateCloudScriptResultEvent != null) { _instance.OnAdminUpdateCloudScriptResultEvent((AdminModels.UpdateCloudScriptResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminUpdateOpenIdConnectionResultEvent != null) { _instance.OnAdminUpdateOpenIdConnectionResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdatePlayerSharedSecretResult)) { if (_instance.OnAdminUpdatePlayerSharedSecretResultEvent != null) { _instance.OnAdminUpdatePlayerSharedSecretResultEvent((AdminModels.UpdatePlayerSharedSecretResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdatePlayerStatisticDefinitionResult)) { if (_instance.OnAdminUpdatePlayerStatisticDefinitionResultEvent != null) { _instance.OnAdminUpdatePlayerStatisticDefinitionResultEvent((AdminModels.UpdatePlayerStatisticDefinitionResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdatePolicyResponse)) { if (_instance.OnAdminUpdatePolicyResultEvent != null) { _instance.OnAdminUpdatePolicyResultEvent((AdminModels.UpdatePolicyResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdateRandomResultTablesResult)) { if (_instance.OnAdminUpdateRandomResultTablesResultEvent != null) { _instance.OnAdminUpdateRandomResultTablesResultEvent((AdminModels.UpdateRandomResultTablesResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateSegmentResponse)) { if (_instance.OnAdminUpdateSegmentResultEvent != null) { _instance.OnAdminUpdateSegmentResultEvent((AdminModels.UpdateSegmentResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdateStoreItemsResult)) { if (_instance.OnAdminUpdateStoreItemsResultEvent != null) { _instance.OnAdminUpdateStoreItemsResultEvent((AdminModels.UpdateStoreItemsResult)e.Result); return; } } + if (type == typeof(AdminModels.EmptyResponse)) { if (_instance.OnAdminUpdateTaskResultEvent != null) { _instance.OnAdminUpdateTaskResultEvent((AdminModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserDataResultEvent != null) { _instance.OnAdminUpdateUserDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserInternalDataResultEvent != null) { _instance.OnAdminUpdateUserInternalDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserPublisherDataResultEvent != null) { _instance.OnAdminUpdateUserPublisherDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserPublisherInternalDataResultEvent != null) { _instance.OnAdminUpdateUserPublisherInternalDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserPublisherReadOnlyDataResultEvent != null) { _instance.OnAdminUpdateUserPublisherReadOnlyDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserDataResult)) { if (_instance.OnAdminUpdateUserReadOnlyDataResultEvent != null) { _instance.OnAdminUpdateUserReadOnlyDataResultEvent((AdminModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(AdminModels.UpdateUserTitleDisplayNameResult)) { if (_instance.OnAdminUpdateUserTitleDisplayNameResultEvent != null) { _instance.OnAdminUpdateUserTitleDisplayNameResultEvent((AdminModels.UpdateUserTitleDisplayNameResult)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABCLIENT_API + if (type == typeof(ClientModels.LoginResult)) { if (_instance.OnLoginResultEvent != null) { _instance.OnLoginResultEvent((ClientModels.LoginResult)e.Result); return; } } + + if (type == typeof(ClientModels.AcceptTradeResponse)) { if (_instance.OnAcceptTradeResultEvent != null) { _instance.OnAcceptTradeResultEvent((ClientModels.AcceptTradeResponse)e.Result); return; } } + if (type == typeof(ClientModels.AddFriendResult)) { if (_instance.OnAddFriendResultEvent != null) { _instance.OnAddFriendResultEvent((ClientModels.AddFriendResult)e.Result); return; } } + if (type == typeof(ClientModels.AddGenericIDResult)) { if (_instance.OnAddGenericIDResultEvent != null) { _instance.OnAddGenericIDResultEvent((ClientModels.AddGenericIDResult)e.Result); return; } } + if (type == typeof(ClientModels.AddOrUpdateContactEmailResult)) { if (_instance.OnAddOrUpdateContactEmailResultEvent != null) { _instance.OnAddOrUpdateContactEmailResultEvent((ClientModels.AddOrUpdateContactEmailResult)e.Result); return; } } + if (type == typeof(ClientModels.AddSharedGroupMembersResult)) { if (_instance.OnAddSharedGroupMembersResultEvent != null) { _instance.OnAddSharedGroupMembersResultEvent((ClientModels.AddSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ClientModels.AddUsernamePasswordResult)) { if (_instance.OnAddUsernamePasswordResultEvent != null) { _instance.OnAddUsernamePasswordResultEvent((ClientModels.AddUsernamePasswordResult)e.Result); return; } } + if (type == typeof(ClientModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnAddUserVirtualCurrencyResultEvent != null) { _instance.OnAddUserVirtualCurrencyResultEvent((ClientModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ClientModels.AndroidDevicePushNotificationRegistrationResult)) { if (_instance.OnAndroidDevicePushNotificationRegistrationResultEvent != null) { _instance.OnAndroidDevicePushNotificationRegistrationResultEvent((ClientModels.AndroidDevicePushNotificationRegistrationResult)e.Result); return; } } + if (type == typeof(ClientModels.AttributeInstallResult)) { if (_instance.OnAttributeInstallResultEvent != null) { _instance.OnAttributeInstallResultEvent((ClientModels.AttributeInstallResult)e.Result); return; } } + if (type == typeof(ClientModels.CancelTradeResponse)) { if (_instance.OnCancelTradeResultEvent != null) { _instance.OnCancelTradeResultEvent((ClientModels.CancelTradeResponse)e.Result); return; } } + if (type == typeof(ClientModels.ConfirmPurchaseResult)) { if (_instance.OnConfirmPurchaseResultEvent != null) { _instance.OnConfirmPurchaseResultEvent((ClientModels.ConfirmPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumeItemResult)) { if (_instance.OnConsumeItemResultEvent != null) { _instance.OnConsumeItemResultEvent((ClientModels.ConsumeItemResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumeMicrosoftStoreEntitlementsResponse)) { if (_instance.OnConsumeMicrosoftStoreEntitlementsResultEvent != null) { _instance.OnConsumeMicrosoftStoreEntitlementsResultEvent((ClientModels.ConsumeMicrosoftStoreEntitlementsResponse)e.Result); return; } } + if (type == typeof(ClientModels.ConsumePS5EntitlementsResult)) { if (_instance.OnConsumePS5EntitlementsResultEvent != null) { _instance.OnConsumePS5EntitlementsResultEvent((ClientModels.ConsumePS5EntitlementsResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumePSNEntitlementsResult)) { if (_instance.OnConsumePSNEntitlementsResultEvent != null) { _instance.OnConsumePSNEntitlementsResultEvent((ClientModels.ConsumePSNEntitlementsResult)e.Result); return; } } + if (type == typeof(ClientModels.ConsumeXboxEntitlementsResult)) { if (_instance.OnConsumeXboxEntitlementsResultEvent != null) { _instance.OnConsumeXboxEntitlementsResultEvent((ClientModels.ConsumeXboxEntitlementsResult)e.Result); return; } } + if (type == typeof(ClientModels.CreateSharedGroupResult)) { if (_instance.OnCreateSharedGroupResultEvent != null) { _instance.OnCreateSharedGroupResultEvent((ClientModels.CreateSharedGroupResult)e.Result); return; } } + if (type == typeof(ClientModels.ExecuteCloudScriptResult)) { if (_instance.OnExecuteCloudScriptResultEvent != null) { _instance.OnExecuteCloudScriptResultEvent((ClientModels.ExecuteCloudScriptResult)e.Result); return; } } + if (type == typeof(ClientModels.GetAccountInfoResult)) { if (_instance.OnGetAccountInfoResultEvent != null) { _instance.OnGetAccountInfoResultEvent((ClientModels.GetAccountInfoResult)e.Result); return; } } + if (type == typeof(ClientModels.GetAdPlacementsResult)) { if (_instance.OnGetAdPlacementsResultEvent != null) { _instance.OnGetAdPlacementsResultEvent((ClientModels.GetAdPlacementsResult)e.Result); return; } } + if (type == typeof(ClientModels.ListUsersCharactersResult)) { if (_instance.OnGetAllUsersCharactersResultEvent != null) { _instance.OnGetAllUsersCharactersResultEvent((ClientModels.ListUsersCharactersResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCatalogItemsResult)) { if (_instance.OnGetCatalogItemsResultEvent != null) { _instance.OnGetCatalogItemsResultEvent((ClientModels.GetCatalogItemsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterDataResult)) { if (_instance.OnGetCharacterDataResultEvent != null) { _instance.OnGetCharacterDataResultEvent((ClientModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterInventoryResult)) { if (_instance.OnGetCharacterInventoryResultEvent != null) { _instance.OnGetCharacterInventoryResultEvent((ClientModels.GetCharacterInventoryResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterLeaderboardResult)) { if (_instance.OnGetCharacterLeaderboardResultEvent != null) { _instance.OnGetCharacterLeaderboardResultEvent((ClientModels.GetCharacterLeaderboardResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterDataResult)) { if (_instance.OnGetCharacterReadOnlyDataResultEvent != null) { _instance.OnGetCharacterReadOnlyDataResultEvent((ClientModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetCharacterStatisticsResult)) { if (_instance.OnGetCharacterStatisticsResultEvent != null) { _instance.OnGetCharacterStatisticsResultEvent((ClientModels.GetCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetContentDownloadUrlResult)) { if (_instance.OnGetContentDownloadUrlResultEvent != null) { _instance.OnGetContentDownloadUrlResultEvent((ClientModels.GetContentDownloadUrlResult)e.Result); return; } } + if (type == typeof(ClientModels.CurrentGamesResult)) { if (_instance.OnGetCurrentGamesResultEvent != null) { _instance.OnGetCurrentGamesResultEvent((ClientModels.CurrentGamesResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardResult)) { if (_instance.OnGetFriendLeaderboardResultEvent != null) { _instance.OnGetFriendLeaderboardResultEvent((ClientModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ClientModels.GetFriendLeaderboardAroundPlayerResult)) { if (_instance.OnGetFriendLeaderboardAroundPlayerResultEvent != null) { _instance.OnGetFriendLeaderboardAroundPlayerResultEvent((ClientModels.GetFriendLeaderboardAroundPlayerResult)e.Result); return; } } + if (type == typeof(ClientModels.GetFriendsListResult)) { if (_instance.OnGetFriendsListResultEvent != null) { _instance.OnGetFriendsListResultEvent((ClientModels.GetFriendsListResult)e.Result); return; } } + if (type == typeof(ClientModels.GameServerRegionsResult)) { if (_instance.OnGetGameServerRegionsResultEvent != null) { _instance.OnGetGameServerRegionsResultEvent((ClientModels.GameServerRegionsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardResult)) { if (_instance.OnGetLeaderboardResultEvent != null) { _instance.OnGetLeaderboardResultEvent((ClientModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundCharacterResult)) { if (_instance.OnGetLeaderboardAroundCharacterResultEvent != null) { _instance.OnGetLeaderboardAroundCharacterResultEvent((ClientModels.GetLeaderboardAroundCharacterResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardAroundPlayerResult)) { if (_instance.OnGetLeaderboardAroundPlayerResultEvent != null) { _instance.OnGetLeaderboardAroundPlayerResultEvent((ClientModels.GetLeaderboardAroundPlayerResult)e.Result); return; } } + if (type == typeof(ClientModels.GetLeaderboardForUsersCharactersResult)) { if (_instance.OnGetLeaderboardForUserCharactersResultEvent != null) { _instance.OnGetLeaderboardForUserCharactersResultEvent((ClientModels.GetLeaderboardForUsersCharactersResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPaymentTokenResult)) { if (_instance.OnGetPaymentTokenResultEvent != null) { _instance.OnGetPaymentTokenResultEvent((ClientModels.GetPaymentTokenResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPhotonAuthenticationTokenResult)) { if (_instance.OnGetPhotonAuthenticationTokenResultEvent != null) { _instance.OnGetPhotonAuthenticationTokenResultEvent((ClientModels.GetPhotonAuthenticationTokenResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerCombinedInfoResult)) { if (_instance.OnGetPlayerCombinedInfoResultEvent != null) { _instance.OnGetPlayerCombinedInfoResultEvent((ClientModels.GetPlayerCombinedInfoResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerProfileResult)) { if (_instance.OnGetPlayerProfileResultEvent != null) { _instance.OnGetPlayerProfileResultEvent((ClientModels.GetPlayerProfileResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerSegmentsResult)) { if (_instance.OnGetPlayerSegmentsResultEvent != null) { _instance.OnGetPlayerSegmentsResultEvent((ClientModels.GetPlayerSegmentsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticsResult)) { if (_instance.OnGetPlayerStatisticsResultEvent != null) { _instance.OnGetPlayerStatisticsResultEvent((ClientModels.GetPlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerStatisticVersionsResult)) { if (_instance.OnGetPlayerStatisticVersionsResultEvent != null) { _instance.OnGetPlayerStatisticVersionsResultEvent((ClientModels.GetPlayerStatisticVersionsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerTagsResult)) { if (_instance.OnGetPlayerTagsResultEvent != null) { _instance.OnGetPlayerTagsResultEvent((ClientModels.GetPlayerTagsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayerTradesResponse)) { if (_instance.OnGetPlayerTradesResultEvent != null) { _instance.OnGetPlayerTradesResultEvent((ClientModels.GetPlayerTradesResponse)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookIDsResult)) { if (_instance.OnGetPlayFabIDsFromFacebookIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromFacebookIDsResultEvent((ClientModels.GetPlayFabIDsFromFacebookIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)) { if (_instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { _instance.OnGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent((ClientModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGameCenterIDsResult)) { if (_instance.OnGetPlayFabIDsFromGameCenterIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGameCenterIDsResultEvent((ClientModels.GetPlayFabIDsFromGameCenterIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGenericIDsResult)) { if (_instance.OnGetPlayFabIDsFromGenericIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGenericIDsResultEvent((ClientModels.GetPlayFabIDsFromGenericIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGoogleIDsResult)) { if (_instance.OnGetPlayFabIDsFromGoogleIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGoogleIDsResultEvent((ClientModels.GetPlayFabIDsFromGoogleIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult)) { if (_instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromGooglePlayGamesPlayerIDsResultEvent((ClientModels.GetPlayFabIDsFromGooglePlayGamesPlayerIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromKongregateIDsResult)) { if (_instance.OnGetPlayFabIDsFromKongregateIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromKongregateIDsResultEvent((ClientModels.GetPlayFabIDsFromKongregateIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)) { if (_instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { _instance.OnGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent((ClientModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)) { if (_instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { _instance.OnGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent((ClientModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromPSNAccountIDsResult)) { if (_instance.OnGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromPSNAccountIDsResultEvent((ClientModels.GetPlayFabIDsFromPSNAccountIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromSteamIDsResult)) { if (_instance.OnGetPlayFabIDsFromSteamIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromSteamIDsResultEvent((ClientModels.GetPlayFabIDsFromSteamIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromTwitchIDsResult)) { if (_instance.OnGetPlayFabIDsFromTwitchIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromTwitchIDsResultEvent((ClientModels.GetPlayFabIDsFromTwitchIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPlayFabIDsFromXboxLiveIDsResult)) { if (_instance.OnGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { _instance.OnGetPlayFabIDsFromXboxLiveIDsResultEvent((ClientModels.GetPlayFabIDsFromXboxLiveIDsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPublisherDataResult)) { if (_instance.OnGetPublisherDataResultEvent != null) { _instance.OnGetPublisherDataResultEvent((ClientModels.GetPublisherDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetPurchaseResult)) { if (_instance.OnGetPurchaseResultEvent != null) { _instance.OnGetPurchaseResultEvent((ClientModels.GetPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.GetSharedGroupDataResult)) { if (_instance.OnGetSharedGroupDataResultEvent != null) { _instance.OnGetSharedGroupDataResultEvent((ClientModels.GetSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetStoreItemsResult)) { if (_instance.OnGetStoreItemsResultEvent != null) { _instance.OnGetStoreItemsResultEvent((ClientModels.GetStoreItemsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTimeResult)) { if (_instance.OnGetTimeResultEvent != null) { _instance.OnGetTimeResultEvent((ClientModels.GetTimeResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTitleDataResult)) { if (_instance.OnGetTitleDataResultEvent != null) { _instance.OnGetTitleDataResultEvent((ClientModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTitleNewsResult)) { if (_instance.OnGetTitleNewsResultEvent != null) { _instance.OnGetTitleNewsResultEvent((ClientModels.GetTitleNewsResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTitlePublicKeyResult)) { if (_instance.OnGetTitlePublicKeyResultEvent != null) { _instance.OnGetTitlePublicKeyResultEvent((ClientModels.GetTitlePublicKeyResult)e.Result); return; } } + if (type == typeof(ClientModels.GetTradeStatusResponse)) { if (_instance.OnGetTradeStatusResultEvent != null) { _instance.OnGetTradeStatusResultEvent((ClientModels.GetTradeStatusResponse)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserDataResultEvent != null) { _instance.OnGetUserDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserInventoryResult)) { if (_instance.OnGetUserInventoryResultEvent != null) { _instance.OnGetUserInventoryResultEvent((ClientModels.GetUserInventoryResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserPublisherDataResultEvent != null) { _instance.OnGetUserPublisherDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserPublisherReadOnlyDataResultEvent != null) { _instance.OnGetUserPublisherReadOnlyDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GetUserDataResult)) { if (_instance.OnGetUserReadOnlyDataResultEvent != null) { _instance.OnGetUserReadOnlyDataResultEvent((ClientModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.GrantCharacterToUserResult)) { if (_instance.OnGrantCharacterToUserResultEvent != null) { _instance.OnGrantCharacterToUserResultEvent((ClientModels.GrantCharacterToUserResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkAndroidDeviceIDResult)) { if (_instance.OnLinkAndroidDeviceIDResultEvent != null) { _instance.OnLinkAndroidDeviceIDResultEvent((ClientModels.LinkAndroidDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResult)) { if (_instance.OnLinkAppleResultEvent != null) { _instance.OnLinkAppleResultEvent((ClientModels.EmptyResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkCustomIDResult)) { if (_instance.OnLinkCustomIDResultEvent != null) { _instance.OnLinkCustomIDResultEvent((ClientModels.LinkCustomIDResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkFacebookAccountResult)) { if (_instance.OnLinkFacebookAccountResultEvent != null) { _instance.OnLinkFacebookAccountResultEvent((ClientModels.LinkFacebookAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkFacebookInstantGamesIdResult)) { if (_instance.OnLinkFacebookInstantGamesIdResultEvent != null) { _instance.OnLinkFacebookInstantGamesIdResultEvent((ClientModels.LinkFacebookInstantGamesIdResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkGameCenterAccountResult)) { if (_instance.OnLinkGameCenterAccountResultEvent != null) { _instance.OnLinkGameCenterAccountResultEvent((ClientModels.LinkGameCenterAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkGoogleAccountResult)) { if (_instance.OnLinkGoogleAccountResultEvent != null) { _instance.OnLinkGoogleAccountResultEvent((ClientModels.LinkGoogleAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkGooglePlayGamesServicesAccountResult)) { if (_instance.OnLinkGooglePlayGamesServicesAccountResultEvent != null) { _instance.OnLinkGooglePlayGamesServicesAccountResultEvent((ClientModels.LinkGooglePlayGamesServicesAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkIOSDeviceIDResult)) { if (_instance.OnLinkIOSDeviceIDResultEvent != null) { _instance.OnLinkIOSDeviceIDResultEvent((ClientModels.LinkIOSDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkKongregateAccountResult)) { if (_instance.OnLinkKongregateResultEvent != null) { _instance.OnLinkKongregateResultEvent((ClientModels.LinkKongregateAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResult)) { if (_instance.OnLinkNintendoServiceAccountResultEvent != null) { _instance.OnLinkNintendoServiceAccountResultEvent((ClientModels.EmptyResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkNintendoSwitchDeviceIdResult)) { if (_instance.OnLinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnLinkNintendoSwitchDeviceIdResultEvent((ClientModels.LinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResult)) { if (_instance.OnLinkOpenIdConnectResultEvent != null) { _instance.OnLinkOpenIdConnectResultEvent((ClientModels.EmptyResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkPSNAccountResult)) { if (_instance.OnLinkPSNAccountResultEvent != null) { _instance.OnLinkPSNAccountResultEvent((ClientModels.LinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkSteamAccountResult)) { if (_instance.OnLinkSteamAccountResultEvent != null) { _instance.OnLinkSteamAccountResultEvent((ClientModels.LinkSteamAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkTwitchAccountResult)) { if (_instance.OnLinkTwitchResultEvent != null) { _instance.OnLinkTwitchResultEvent((ClientModels.LinkTwitchAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.LinkXboxAccountResult)) { if (_instance.OnLinkXboxAccountResultEvent != null) { _instance.OnLinkXboxAccountResultEvent((ClientModels.LinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.MatchmakeResult)) { if (_instance.OnMatchmakeResultEvent != null) { _instance.OnMatchmakeResultEvent((ClientModels.MatchmakeResult)e.Result); return; } } + if (type == typeof(ClientModels.OpenTradeResponse)) { if (_instance.OnOpenTradeResultEvent != null) { _instance.OnOpenTradeResultEvent((ClientModels.OpenTradeResponse)e.Result); return; } } + if (type == typeof(ClientModels.PayForPurchaseResult)) { if (_instance.OnPayForPurchaseResultEvent != null) { _instance.OnPayForPurchaseResultEvent((ClientModels.PayForPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.PurchaseItemResult)) { if (_instance.OnPurchaseItemResultEvent != null) { _instance.OnPurchaseItemResultEvent((ClientModels.PurchaseItemResult)e.Result); return; } } + if (type == typeof(ClientModels.RedeemCouponResult)) { if (_instance.OnRedeemCouponResultEvent != null) { _instance.OnRedeemCouponResultEvent((ClientModels.RedeemCouponResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnRefreshPSNAuthTokenResultEvent != null) { _instance.OnRefreshPSNAuthTokenResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.RegisterForIOSPushNotificationResult)) { if (_instance.OnRegisterForIOSPushNotificationResultEvent != null) { _instance.OnRegisterForIOSPushNotificationResultEvent((ClientModels.RegisterForIOSPushNotificationResult)e.Result); return; } } + if (type == typeof(ClientModels.RegisterPlayFabUserResult)) { if (_instance.OnRegisterPlayFabUserResultEvent != null) { _instance.OnRegisterPlayFabUserResultEvent((ClientModels.RegisterPlayFabUserResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveContactEmailResult)) { if (_instance.OnRemoveContactEmailResultEvent != null) { _instance.OnRemoveContactEmailResultEvent((ClientModels.RemoveContactEmailResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveFriendResult)) { if (_instance.OnRemoveFriendResultEvent != null) { _instance.OnRemoveFriendResultEvent((ClientModels.RemoveFriendResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveGenericIDResult)) { if (_instance.OnRemoveGenericIDResultEvent != null) { _instance.OnRemoveGenericIDResultEvent((ClientModels.RemoveGenericIDResult)e.Result); return; } } + if (type == typeof(ClientModels.RemoveSharedGroupMembersResult)) { if (_instance.OnRemoveSharedGroupMembersResultEvent != null) { _instance.OnRemoveSharedGroupMembersResultEvent((ClientModels.RemoveSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ClientModels.ReportAdActivityResult)) { if (_instance.OnReportAdActivityResultEvent != null) { _instance.OnReportAdActivityResultEvent((ClientModels.ReportAdActivityResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnReportDeviceInfoResultEvent != null) { _instance.OnReportDeviceInfoResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.ReportPlayerClientResult)) { if (_instance.OnReportPlayerResultEvent != null) { _instance.OnReportPlayerResultEvent((ClientModels.ReportPlayerClientResult)e.Result); return; } } + if (type == typeof(ClientModels.RestoreIOSPurchasesResult)) { if (_instance.OnRestoreIOSPurchasesResultEvent != null) { _instance.OnRestoreIOSPurchasesResultEvent((ClientModels.RestoreIOSPurchasesResult)e.Result); return; } } + if (type == typeof(ClientModels.RewardAdActivityResult)) { if (_instance.OnRewardAdActivityResultEvent != null) { _instance.OnRewardAdActivityResultEvent((ClientModels.RewardAdActivityResult)e.Result); return; } } + if (type == typeof(ClientModels.SendAccountRecoveryEmailResult)) { if (_instance.OnSendAccountRecoveryEmailResultEvent != null) { _instance.OnSendAccountRecoveryEmailResultEvent((ClientModels.SendAccountRecoveryEmailResult)e.Result); return; } } + if (type == typeof(ClientModels.SetFriendTagsResult)) { if (_instance.OnSetFriendTagsResultEvent != null) { _instance.OnSetFriendTagsResultEvent((ClientModels.SetFriendTagsResult)e.Result); return; } } + if (type == typeof(ClientModels.SetPlayerSecretResult)) { if (_instance.OnSetPlayerSecretResultEvent != null) { _instance.OnSetPlayerSecretResultEvent((ClientModels.SetPlayerSecretResult)e.Result); return; } } + if (type == typeof(ClientModels.StartPurchaseResult)) { if (_instance.OnStartPurchaseResultEvent != null) { _instance.OnStartPurchaseResultEvent((ClientModels.StartPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnSubtractUserVirtualCurrencyResultEvent != null) { _instance.OnSubtractUserVirtualCurrencyResultEvent((ClientModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkAndroidDeviceIDResult)) { if (_instance.OnUnlinkAndroidDeviceIDResultEvent != null) { _instance.OnUnlinkAndroidDeviceIDResultEvent((ClientModels.UnlinkAndroidDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUnlinkAppleResultEvent != null) { _instance.OnUnlinkAppleResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkCustomIDResult)) { if (_instance.OnUnlinkCustomIDResultEvent != null) { _instance.OnUnlinkCustomIDResultEvent((ClientModels.UnlinkCustomIDResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkFacebookAccountResult)) { if (_instance.OnUnlinkFacebookAccountResultEvent != null) { _instance.OnUnlinkFacebookAccountResultEvent((ClientModels.UnlinkFacebookAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkFacebookInstantGamesIdResult)) { if (_instance.OnUnlinkFacebookInstantGamesIdResultEvent != null) { _instance.OnUnlinkFacebookInstantGamesIdResultEvent((ClientModels.UnlinkFacebookInstantGamesIdResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkGameCenterAccountResult)) { if (_instance.OnUnlinkGameCenterAccountResultEvent != null) { _instance.OnUnlinkGameCenterAccountResultEvent((ClientModels.UnlinkGameCenterAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkGoogleAccountResult)) { if (_instance.OnUnlinkGoogleAccountResultEvent != null) { _instance.OnUnlinkGoogleAccountResultEvent((ClientModels.UnlinkGoogleAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkGooglePlayGamesServicesAccountResult)) { if (_instance.OnUnlinkGooglePlayGamesServicesAccountResultEvent != null) { _instance.OnUnlinkGooglePlayGamesServicesAccountResultEvent((ClientModels.UnlinkGooglePlayGamesServicesAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkIOSDeviceIDResult)) { if (_instance.OnUnlinkIOSDeviceIDResultEvent != null) { _instance.OnUnlinkIOSDeviceIDResultEvent((ClientModels.UnlinkIOSDeviceIDResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkKongregateAccountResult)) { if (_instance.OnUnlinkKongregateResultEvent != null) { _instance.OnUnlinkKongregateResultEvent((ClientModels.UnlinkKongregateAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUnlinkNintendoServiceAccountResultEvent != null) { _instance.OnUnlinkNintendoServiceAccountResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkNintendoSwitchDeviceIdResult)) { if (_instance.OnUnlinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnUnlinkNintendoSwitchDeviceIdResultEvent((ClientModels.UnlinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUnlinkOpenIdConnectResultEvent != null) { _instance.OnUnlinkOpenIdConnectResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkPSNAccountResult)) { if (_instance.OnUnlinkPSNAccountResultEvent != null) { _instance.OnUnlinkPSNAccountResultEvent((ClientModels.UnlinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkSteamAccountResult)) { if (_instance.OnUnlinkSteamAccountResultEvent != null) { _instance.OnUnlinkSteamAccountResultEvent((ClientModels.UnlinkSteamAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkTwitchAccountResult)) { if (_instance.OnUnlinkTwitchResultEvent != null) { _instance.OnUnlinkTwitchResultEvent((ClientModels.UnlinkTwitchAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlinkXboxAccountResult)) { if (_instance.OnUnlinkXboxAccountResultEvent != null) { _instance.OnUnlinkXboxAccountResultEvent((ClientModels.UnlinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlockContainerItemResult)) { if (_instance.OnUnlockContainerInstanceResultEvent != null) { _instance.OnUnlockContainerInstanceResultEvent((ClientModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ClientModels.UnlockContainerItemResult)) { if (_instance.OnUnlockContainerItemResultEvent != null) { _instance.OnUnlockContainerItemResultEvent((ClientModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ClientModels.EmptyResponse)) { if (_instance.OnUpdateAvatarUrlResultEvent != null) { _instance.OnUpdateAvatarUrlResultEvent((ClientModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ClientModels.UpdateCharacterDataResult)) { if (_instance.OnUpdateCharacterDataResultEvent != null) { _instance.OnUpdateCharacterDataResultEvent((ClientModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateCharacterStatisticsResult)) { if (_instance.OnUpdateCharacterStatisticsResultEvent != null) { _instance.OnUpdateCharacterStatisticsResultEvent((ClientModels.UpdateCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdatePlayerStatisticsResult)) { if (_instance.OnUpdatePlayerStatisticsResultEvent != null) { _instance.OnUpdatePlayerStatisticsResultEvent((ClientModels.UpdatePlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateSharedGroupDataResult)) { if (_instance.OnUpdateSharedGroupDataResultEvent != null) { _instance.OnUpdateSharedGroupDataResultEvent((ClientModels.UpdateSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateUserDataResult)) { if (_instance.OnUpdateUserDataResultEvent != null) { _instance.OnUpdateUserDataResultEvent((ClientModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateUserDataResult)) { if (_instance.OnUpdateUserPublisherDataResultEvent != null) { _instance.OnUpdateUserPublisherDataResultEvent((ClientModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ClientModels.UpdateUserTitleDisplayNameResult)) { if (_instance.OnUpdateUserTitleDisplayNameResultEvent != null) { _instance.OnUpdateUserTitleDisplayNameResultEvent((ClientModels.UpdateUserTitleDisplayNameResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateAmazonReceiptResult)) { if (_instance.OnValidateAmazonIAPReceiptResultEvent != null) { _instance.OnValidateAmazonIAPReceiptResultEvent((ClientModels.ValidateAmazonReceiptResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateGooglePlayPurchaseResult)) { if (_instance.OnValidateGooglePlayPurchaseResultEvent != null) { _instance.OnValidateGooglePlayPurchaseResultEvent((ClientModels.ValidateGooglePlayPurchaseResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateIOSReceiptResult)) { if (_instance.OnValidateIOSReceiptResultEvent != null) { _instance.OnValidateIOSReceiptResultEvent((ClientModels.ValidateIOSReceiptResult)e.Result); return; } } + if (type == typeof(ClientModels.ValidateWindowsReceiptResult)) { if (_instance.OnValidateWindowsStoreReceiptResultEvent != null) { _instance.OnValidateWindowsStoreReceiptResultEvent((ClientModels.ValidateWindowsReceiptResult)e.Result); return; } } + if (type == typeof(ClientModels.WriteEventResponse)) { if (_instance.OnWriteCharacterEventResultEvent != null) { _instance.OnWriteCharacterEventResultEvent((ClientModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ClientModels.WriteEventResponse)) { if (_instance.OnWritePlayerEventResultEvent != null) { _instance.OnWritePlayerEventResultEvent((ClientModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ClientModels.WriteEventResponse)) { if (_instance.OnWriteTitleEventResultEvent != null) { _instance.OnWriteTitleEventResultEvent((ClientModels.WriteEventResponse)e.Result); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API + + if (type == typeof(MatchmakerModels.AuthUserResponse)) { if (_instance.OnMatchmakerAuthUserResultEvent != null) { _instance.OnMatchmakerAuthUserResultEvent((MatchmakerModels.AuthUserResponse)e.Result); return; } } + if (type == typeof(MatchmakerModels.PlayerJoinedResponse)) { if (_instance.OnMatchmakerPlayerJoinedResultEvent != null) { _instance.OnMatchmakerPlayerJoinedResultEvent((MatchmakerModels.PlayerJoinedResponse)e.Result); return; } } + if (type == typeof(MatchmakerModels.PlayerLeftResponse)) { if (_instance.OnMatchmakerPlayerLeftResultEvent != null) { _instance.OnMatchmakerPlayerLeftResultEvent((MatchmakerModels.PlayerLeftResponse)e.Result); return; } } + if (type == typeof(MatchmakerModels.UserInfoResponse)) { if (_instance.OnMatchmakerUserInfoResultEvent != null) { _instance.OnMatchmakerUserInfoResultEvent((MatchmakerModels.UserInfoResponse)e.Result); return; } } +#endif +#if ENABLE_PLAYFABSERVER_API + + if (type == typeof(ServerModels.ModifyCharacterVirtualCurrencyResult)) { if (_instance.OnServerAddCharacterVirtualCurrencyResultEvent != null) { _instance.OnServerAddCharacterVirtualCurrencyResultEvent((ServerModels.ModifyCharacterVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerAddFriendResultEvent != null) { _instance.OnServerAddFriendResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResult)) { if (_instance.OnServerAddGenericIDResultEvent != null) { _instance.OnServerAddGenericIDResultEvent((ServerModels.EmptyResult)e.Result); return; } } + if (type == typeof(ServerModels.AddPlayerTagResult)) { if (_instance.OnServerAddPlayerTagResultEvent != null) { _instance.OnServerAddPlayerTagResultEvent((ServerModels.AddPlayerTagResult)e.Result); return; } } + if (type == typeof(ServerModels.AddSharedGroupMembersResult)) { if (_instance.OnServerAddSharedGroupMembersResultEvent != null) { _instance.OnServerAddSharedGroupMembersResultEvent((ServerModels.AddSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnServerAddUserVirtualCurrencyResultEvent != null) { _instance.OnServerAddUserVirtualCurrencyResultEvent((ServerModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.AuthenticateSessionTicketResult)) { if (_instance.OnServerAuthenticateSessionTicketResultEvent != null) { _instance.OnServerAuthenticateSessionTicketResultEvent((ServerModels.AuthenticateSessionTicketResult)e.Result); return; } } + if (type == typeof(ServerModels.AwardSteamAchievementResult)) { if (_instance.OnServerAwardSteamAchievementResultEvent != null) { _instance.OnServerAwardSteamAchievementResultEvent((ServerModels.AwardSteamAchievementResult)e.Result); return; } } + if (type == typeof(ServerModels.BanUsersResult)) { if (_instance.OnServerBanUsersResultEvent != null) { _instance.OnServerBanUsersResultEvent((ServerModels.BanUsersResult)e.Result); return; } } + if (type == typeof(ServerModels.ConsumeItemResult)) { if (_instance.OnServerConsumeItemResultEvent != null) { _instance.OnServerConsumeItemResultEvent((ServerModels.ConsumeItemResult)e.Result); return; } } + if (type == typeof(ServerModels.CreateSharedGroupResult)) { if (_instance.OnServerCreateSharedGroupResultEvent != null) { _instance.OnServerCreateSharedGroupResultEvent((ServerModels.CreateSharedGroupResult)e.Result); return; } } + if (type == typeof(ServerModels.DeleteCharacterFromUserResult)) { if (_instance.OnServerDeleteCharacterFromUserResultEvent != null) { _instance.OnServerDeleteCharacterFromUserResultEvent((ServerModels.DeleteCharacterFromUserResult)e.Result); return; } } + if (type == typeof(ServerModels.DeletePlayerResult)) { if (_instance.OnServerDeletePlayerResultEvent != null) { _instance.OnServerDeletePlayerResultEvent((ServerModels.DeletePlayerResult)e.Result); return; } } + if (type == typeof(ServerModels.DeletePushNotificationTemplateResult)) { if (_instance.OnServerDeletePushNotificationTemplateResultEvent != null) { _instance.OnServerDeletePushNotificationTemplateResultEvent((ServerModels.DeletePushNotificationTemplateResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerDeleteSharedGroupResultEvent != null) { _instance.OnServerDeleteSharedGroupResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.DeregisterGameResponse)) { if (_instance.OnServerDeregisterGameResultEvent != null) { _instance.OnServerDeregisterGameResultEvent((ServerModels.DeregisterGameResponse)e.Result); return; } } + if (type == typeof(ServerModels.EvaluateRandomResultTableResult)) { if (_instance.OnServerEvaluateRandomResultTableResultEvent != null) { _instance.OnServerEvaluateRandomResultTableResultEvent((ServerModels.EvaluateRandomResultTableResult)e.Result); return; } } + if (type == typeof(ServerModels.ExecuteCloudScriptResult)) { if (_instance.OnServerExecuteCloudScriptResultEvent != null) { _instance.OnServerExecuteCloudScriptResultEvent((ServerModels.ExecuteCloudScriptResult)e.Result); return; } } + if (type == typeof(ServerModels.GetAllSegmentsResult)) { if (_instance.OnServerGetAllSegmentsResultEvent != null) { _instance.OnServerGetAllSegmentsResultEvent((ServerModels.GetAllSegmentsResult)e.Result); return; } } + if (type == typeof(ServerModels.ListUsersCharactersResult)) { if (_instance.OnServerGetAllUsersCharactersResultEvent != null) { _instance.OnServerGetAllUsersCharactersResultEvent((ServerModels.ListUsersCharactersResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCatalogItemsResult)) { if (_instance.OnServerGetCatalogItemsResultEvent != null) { _instance.OnServerGetCatalogItemsResultEvent((ServerModels.GetCatalogItemsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterDataResult)) { if (_instance.OnServerGetCharacterDataResultEvent != null) { _instance.OnServerGetCharacterDataResultEvent((ServerModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterDataResult)) { if (_instance.OnServerGetCharacterInternalDataResultEvent != null) { _instance.OnServerGetCharacterInternalDataResultEvent((ServerModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterInventoryResult)) { if (_instance.OnServerGetCharacterInventoryResultEvent != null) { _instance.OnServerGetCharacterInventoryResultEvent((ServerModels.GetCharacterInventoryResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterLeaderboardResult)) { if (_instance.OnServerGetCharacterLeaderboardResultEvent != null) { _instance.OnServerGetCharacterLeaderboardResultEvent((ServerModels.GetCharacterLeaderboardResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterDataResult)) { if (_instance.OnServerGetCharacterReadOnlyDataResultEvent != null) { _instance.OnServerGetCharacterReadOnlyDataResultEvent((ServerModels.GetCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetCharacterStatisticsResult)) { if (_instance.OnServerGetCharacterStatisticsResultEvent != null) { _instance.OnServerGetCharacterStatisticsResultEvent((ServerModels.GetCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetContentDownloadUrlResult)) { if (_instance.OnServerGetContentDownloadUrlResultEvent != null) { _instance.OnServerGetContentDownloadUrlResultEvent((ServerModels.GetContentDownloadUrlResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardResult)) { if (_instance.OnServerGetFriendLeaderboardResultEvent != null) { _instance.OnServerGetFriendLeaderboardResultEvent((ServerModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ServerModels.GetFriendsListResult)) { if (_instance.OnServerGetFriendsListResultEvent != null) { _instance.OnServerGetFriendsListResultEvent((ServerModels.GetFriendsListResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardResult)) { if (_instance.OnServerGetLeaderboardResultEvent != null) { _instance.OnServerGetLeaderboardResultEvent((ServerModels.GetLeaderboardResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundCharacterResult)) { if (_instance.OnServerGetLeaderboardAroundCharacterResultEvent != null) { _instance.OnServerGetLeaderboardAroundCharacterResultEvent((ServerModels.GetLeaderboardAroundCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardAroundUserResult)) { if (_instance.OnServerGetLeaderboardAroundUserResultEvent != null) { _instance.OnServerGetLeaderboardAroundUserResultEvent((ServerModels.GetLeaderboardAroundUserResult)e.Result); return; } } + if (type == typeof(ServerModels.GetLeaderboardForUsersCharactersResult)) { if (_instance.OnServerGetLeaderboardForUserCharactersResultEvent != null) { _instance.OnServerGetLeaderboardForUserCharactersResultEvent((ServerModels.GetLeaderboardForUsersCharactersResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerCombinedInfoResult)) { if (_instance.OnServerGetPlayerCombinedInfoResultEvent != null) { _instance.OnServerGetPlayerCombinedInfoResultEvent((ServerModels.GetPlayerCombinedInfoResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerProfileResult)) { if (_instance.OnServerGetPlayerProfileResultEvent != null) { _instance.OnServerGetPlayerProfileResultEvent((ServerModels.GetPlayerProfileResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerSegmentsResult)) { if (_instance.OnServerGetPlayerSegmentsResultEvent != null) { _instance.OnServerGetPlayerSegmentsResultEvent((ServerModels.GetPlayerSegmentsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayersInSegmentResult)) { if (_instance.OnServerGetPlayersInSegmentResultEvent != null) { _instance.OnServerGetPlayersInSegmentResultEvent((ServerModels.GetPlayersInSegmentResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticsResult)) { if (_instance.OnServerGetPlayerStatisticsResultEvent != null) { _instance.OnServerGetPlayerStatisticsResultEvent((ServerModels.GetPlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerStatisticVersionsResult)) { if (_instance.OnServerGetPlayerStatisticVersionsResultEvent != null) { _instance.OnServerGetPlayerStatisticVersionsResultEvent((ServerModels.GetPlayerStatisticVersionsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayerTagsResult)) { if (_instance.OnServerGetPlayerTagsResultEvent != null) { _instance.OnServerGetPlayerTagsResultEvent((ServerModels.GetPlayerTagsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromFacebookIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookIDsResultEvent((ServerModels.GetPlayFabIDsFromFacebookIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)) { if (_instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromFacebookInstantGamesIdsResultEvent((ServerModels.GetPlayFabIDsFromFacebookInstantGamesIdsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromGenericIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromGenericIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromGenericIDsResultEvent((ServerModels.GetPlayFabIDsFromGenericIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)) { if (_instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoServiceAccountIdsResultEvent((ServerModels.GetPlayFabIDsFromNintendoServiceAccountIdsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)) { if (_instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromNintendoSwitchDeviceIdsResultEvent((ServerModels.GetPlayFabIDsFromNintendoSwitchDeviceIdsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromPSNAccountIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromPSNAccountIDsResultEvent((ServerModels.GetPlayFabIDsFromPSNAccountIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromSteamIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromSteamIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromSteamIDsResultEvent((ServerModels.GetPlayFabIDsFromSteamIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromTwitchIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromTwitchIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromTwitchIDsResultEvent((ServerModels.GetPlayFabIDsFromTwitchIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPlayFabIDsFromXboxLiveIDsResult)) { if (_instance.OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent != null) { _instance.OnServerGetPlayFabIDsFromXboxLiveIDsResultEvent((ServerModels.GetPlayFabIDsFromXboxLiveIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetPublisherDataResult)) { if (_instance.OnServerGetPublisherDataResultEvent != null) { _instance.OnServerGetPublisherDataResultEvent((ServerModels.GetPublisherDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetRandomResultTablesResult)) { if (_instance.OnServerGetRandomResultTablesResultEvent != null) { _instance.OnServerGetRandomResultTablesResultEvent((ServerModels.GetRandomResultTablesResult)e.Result); return; } } + if (type == typeof(ServerModels.GetServerCustomIDsFromPlayFabIDsResult)) { if (_instance.OnServerGetServerCustomIDsFromPlayFabIDsResultEvent != null) { _instance.OnServerGetServerCustomIDsFromPlayFabIDsResultEvent((ServerModels.GetServerCustomIDsFromPlayFabIDsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetSharedGroupDataResult)) { if (_instance.OnServerGetSharedGroupDataResultEvent != null) { _instance.OnServerGetSharedGroupDataResultEvent((ServerModels.GetSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetStoreItemsResult)) { if (_instance.OnServerGetStoreItemsResultEvent != null) { _instance.OnServerGetStoreItemsResultEvent((ServerModels.GetStoreItemsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTimeResult)) { if (_instance.OnServerGetTimeResultEvent != null) { _instance.OnServerGetTimeResultEvent((ServerModels.GetTimeResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTitleDataResult)) { if (_instance.OnServerGetTitleDataResultEvent != null) { _instance.OnServerGetTitleDataResultEvent((ServerModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTitleDataResult)) { if (_instance.OnServerGetTitleInternalDataResultEvent != null) { _instance.OnServerGetTitleInternalDataResultEvent((ServerModels.GetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetTitleNewsResult)) { if (_instance.OnServerGetTitleNewsResultEvent != null) { _instance.OnServerGetTitleNewsResultEvent((ServerModels.GetTitleNewsResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserAccountInfoResult)) { if (_instance.OnServerGetUserAccountInfoResultEvent != null) { _instance.OnServerGetUserAccountInfoResultEvent((ServerModels.GetUserAccountInfoResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserBansResult)) { if (_instance.OnServerGetUserBansResultEvent != null) { _instance.OnServerGetUserBansResultEvent((ServerModels.GetUserBansResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserDataResultEvent != null) { _instance.OnServerGetUserDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserInternalDataResultEvent != null) { _instance.OnServerGetUserInternalDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserInventoryResult)) { if (_instance.OnServerGetUserInventoryResultEvent != null) { _instance.OnServerGetUserInventoryResultEvent((ServerModels.GetUserInventoryResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserPublisherDataResultEvent != null) { _instance.OnServerGetUserPublisherDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserPublisherInternalDataResultEvent != null) { _instance.OnServerGetUserPublisherInternalDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserPublisherReadOnlyDataResultEvent != null) { _instance.OnServerGetUserPublisherReadOnlyDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GetUserDataResult)) { if (_instance.OnServerGetUserReadOnlyDataResultEvent != null) { _instance.OnServerGetUserReadOnlyDataResultEvent((ServerModels.GetUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantCharacterToUserResult)) { if (_instance.OnServerGrantCharacterToUserResultEvent != null) { _instance.OnServerGrantCharacterToUserResultEvent((ServerModels.GrantCharacterToUserResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantItemsToCharacterResult)) { if (_instance.OnServerGrantItemsToCharacterResultEvent != null) { _instance.OnServerGrantItemsToCharacterResultEvent((ServerModels.GrantItemsToCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantItemsToUserResult)) { if (_instance.OnServerGrantItemsToUserResultEvent != null) { _instance.OnServerGrantItemsToUserResultEvent((ServerModels.GrantItemsToUserResult)e.Result); return; } } + if (type == typeof(ServerModels.GrantItemsToUsersResult)) { if (_instance.OnServerGrantItemsToUsersResultEvent != null) { _instance.OnServerGrantItemsToUsersResultEvent((ServerModels.GrantItemsToUsersResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResult)) { if (_instance.OnServerLinkNintendoServiceAccountResultEvent != null) { _instance.OnServerLinkNintendoServiceAccountResultEvent((ServerModels.EmptyResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkNintendoSwitchDeviceIdResult)) { if (_instance.OnServerLinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnServerLinkNintendoSwitchDeviceIdResultEvent((ServerModels.LinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkPSNAccountResult)) { if (_instance.OnServerLinkPSNAccountResultEvent != null) { _instance.OnServerLinkPSNAccountResultEvent((ServerModels.LinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkServerCustomIdResult)) { if (_instance.OnServerLinkServerCustomIdResultEvent != null) { _instance.OnServerLinkServerCustomIdResultEvent((ServerModels.LinkServerCustomIdResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkSteamIdResult)) { if (_instance.OnServerLinkSteamIdResultEvent != null) { _instance.OnServerLinkSteamIdResultEvent((ServerModels.LinkSteamIdResult)e.Result); return; } } + if (type == typeof(ServerModels.LinkXboxAccountResult)) { if (_instance.OnServerLinkXboxAccountResultEvent != null) { _instance.OnServerLinkXboxAccountResultEvent((ServerModels.LinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithServerCustomIdResultEvent != null) { _instance.OnServerLoginWithServerCustomIdResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithSteamIdResultEvent != null) { _instance.OnServerLoginWithSteamIdResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithXboxResultEvent != null) { _instance.OnServerLoginWithXboxResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ServerLoginResult)) { if (_instance.OnServerLoginWithXboxIdResultEvent != null) { _instance.OnServerLoginWithXboxIdResultEvent((ServerModels.ServerLoginResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyItemUsesResult)) { if (_instance.OnServerModifyItemUsesResultEvent != null) { _instance.OnServerModifyItemUsesResultEvent((ServerModels.ModifyItemUsesResult)e.Result); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromCharacterResult)) { if (_instance.OnServerMoveItemToCharacterFromCharacterResultEvent != null) { _instance.OnServerMoveItemToCharacterFromCharacterResultEvent((ServerModels.MoveItemToCharacterFromCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.MoveItemToCharacterFromUserResult)) { if (_instance.OnServerMoveItemToCharacterFromUserResultEvent != null) { _instance.OnServerMoveItemToCharacterFromUserResultEvent((ServerModels.MoveItemToCharacterFromUserResult)e.Result); return; } } + if (type == typeof(ServerModels.MoveItemToUserFromCharacterResult)) { if (_instance.OnServerMoveItemToUserFromCharacterResultEvent != null) { _instance.OnServerMoveItemToUserFromCharacterResultEvent((ServerModels.MoveItemToUserFromCharacterResult)e.Result); return; } } + if (type == typeof(ServerModels.NotifyMatchmakerPlayerLeftResult)) { if (_instance.OnServerNotifyMatchmakerPlayerLeftResultEvent != null) { _instance.OnServerNotifyMatchmakerPlayerLeftResultEvent((ServerModels.NotifyMatchmakerPlayerLeftResult)e.Result); return; } } + if (type == typeof(ServerModels.RedeemCouponResult)) { if (_instance.OnServerRedeemCouponResultEvent != null) { _instance.OnServerRedeemCouponResultEvent((ServerModels.RedeemCouponResult)e.Result); return; } } + if (type == typeof(ServerModels.RedeemMatchmakerTicketResult)) { if (_instance.OnServerRedeemMatchmakerTicketResultEvent != null) { _instance.OnServerRedeemMatchmakerTicketResultEvent((ServerModels.RedeemMatchmakerTicketResult)e.Result); return; } } + if (type == typeof(ServerModels.RefreshGameServerInstanceHeartbeatResult)) { if (_instance.OnServerRefreshGameServerInstanceHeartbeatResultEvent != null) { _instance.OnServerRefreshGameServerInstanceHeartbeatResultEvent((ServerModels.RefreshGameServerInstanceHeartbeatResult)e.Result); return; } } + if (type == typeof(ServerModels.RegisterGameResponse)) { if (_instance.OnServerRegisterGameResultEvent != null) { _instance.OnServerRegisterGameResultEvent((ServerModels.RegisterGameResponse)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerRemoveFriendResultEvent != null) { _instance.OnServerRemoveFriendResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResult)) { if (_instance.OnServerRemoveGenericIDResultEvent != null) { _instance.OnServerRemoveGenericIDResultEvent((ServerModels.EmptyResult)e.Result); return; } } + if (type == typeof(ServerModels.RemovePlayerTagResult)) { if (_instance.OnServerRemovePlayerTagResultEvent != null) { _instance.OnServerRemovePlayerTagResultEvent((ServerModels.RemovePlayerTagResult)e.Result); return; } } + if (type == typeof(ServerModels.RemoveSharedGroupMembersResult)) { if (_instance.OnServerRemoveSharedGroupMembersResultEvent != null) { _instance.OnServerRemoveSharedGroupMembersResultEvent((ServerModels.RemoveSharedGroupMembersResult)e.Result); return; } } + if (type == typeof(ServerModels.ReportPlayerServerResult)) { if (_instance.OnServerReportPlayerResultEvent != null) { _instance.OnServerReportPlayerResultEvent((ServerModels.ReportPlayerServerResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeAllBansForUserResult)) { if (_instance.OnServerRevokeAllBansForUserResultEvent != null) { _instance.OnServerRevokeAllBansForUserResultEvent((ServerModels.RevokeAllBansForUserResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeBansResult)) { if (_instance.OnServerRevokeBansResultEvent != null) { _instance.OnServerRevokeBansResultEvent((ServerModels.RevokeBansResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeInventoryResult)) { if (_instance.OnServerRevokeInventoryItemResultEvent != null) { _instance.OnServerRevokeInventoryItemResultEvent((ServerModels.RevokeInventoryResult)e.Result); return; } } + if (type == typeof(ServerModels.RevokeInventoryItemsResult)) { if (_instance.OnServerRevokeInventoryItemsResultEvent != null) { _instance.OnServerRevokeInventoryItemsResultEvent((ServerModels.RevokeInventoryItemsResult)e.Result); return; } } + if (type == typeof(ServerModels.SavePushNotificationTemplateResult)) { if (_instance.OnServerSavePushNotificationTemplateResultEvent != null) { _instance.OnServerSavePushNotificationTemplateResultEvent((ServerModels.SavePushNotificationTemplateResult)e.Result); return; } } + if (type == typeof(ServerModels.SendCustomAccountRecoveryEmailResult)) { if (_instance.OnServerSendCustomAccountRecoveryEmailResultEvent != null) { _instance.OnServerSendCustomAccountRecoveryEmailResultEvent((ServerModels.SendCustomAccountRecoveryEmailResult)e.Result); return; } } + if (type == typeof(ServerModels.SendEmailFromTemplateResult)) { if (_instance.OnServerSendEmailFromTemplateResultEvent != null) { _instance.OnServerSendEmailFromTemplateResultEvent((ServerModels.SendEmailFromTemplateResult)e.Result); return; } } + if (type == typeof(ServerModels.SendPushNotificationResult)) { if (_instance.OnServerSendPushNotificationResultEvent != null) { _instance.OnServerSendPushNotificationResultEvent((ServerModels.SendPushNotificationResult)e.Result); return; } } + if (type == typeof(ServerModels.SendPushNotificationResult)) { if (_instance.OnServerSendPushNotificationFromTemplateResultEvent != null) { _instance.OnServerSendPushNotificationFromTemplateResultEvent((ServerModels.SendPushNotificationResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerSetFriendTagsResultEvent != null) { _instance.OnServerSetFriendTagsResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.SetGameServerInstanceDataResult)) { if (_instance.OnServerSetGameServerInstanceDataResultEvent != null) { _instance.OnServerSetGameServerInstanceDataResultEvent((ServerModels.SetGameServerInstanceDataResult)e.Result); return; } } + if (type == typeof(ServerModels.SetGameServerInstanceStateResult)) { if (_instance.OnServerSetGameServerInstanceStateResultEvent != null) { _instance.OnServerSetGameServerInstanceStateResultEvent((ServerModels.SetGameServerInstanceStateResult)e.Result); return; } } + if (type == typeof(ServerModels.SetGameServerInstanceTagsResult)) { if (_instance.OnServerSetGameServerInstanceTagsResultEvent != null) { _instance.OnServerSetGameServerInstanceTagsResultEvent((ServerModels.SetGameServerInstanceTagsResult)e.Result); return; } } + if (type == typeof(ServerModels.SetPlayerSecretResult)) { if (_instance.OnServerSetPlayerSecretResultEvent != null) { _instance.OnServerSetPlayerSecretResultEvent((ServerModels.SetPlayerSecretResult)e.Result); return; } } + if (type == typeof(ServerModels.SetPublisherDataResult)) { if (_instance.OnServerSetPublisherDataResultEvent != null) { _instance.OnServerSetPublisherDataResultEvent((ServerModels.SetPublisherDataResult)e.Result); return; } } + if (type == typeof(ServerModels.SetTitleDataResult)) { if (_instance.OnServerSetTitleDataResultEvent != null) { _instance.OnServerSetTitleDataResultEvent((ServerModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.SetTitleDataResult)) { if (_instance.OnServerSetTitleInternalDataResultEvent != null) { _instance.OnServerSetTitleInternalDataResultEvent((ServerModels.SetTitleDataResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyCharacterVirtualCurrencyResult)) { if (_instance.OnServerSubtractCharacterVirtualCurrencyResultEvent != null) { _instance.OnServerSubtractCharacterVirtualCurrencyResultEvent((ServerModels.ModifyCharacterVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.ModifyUserVirtualCurrencyResult)) { if (_instance.OnServerSubtractUserVirtualCurrencyResultEvent != null) { _instance.OnServerSubtractUserVirtualCurrencyResultEvent((ServerModels.ModifyUserVirtualCurrencyResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerUnlinkNintendoServiceAccountResultEvent != null) { _instance.OnServerUnlinkNintendoServiceAccountResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkNintendoSwitchDeviceIdResult)) { if (_instance.OnServerUnlinkNintendoSwitchDeviceIdResultEvent != null) { _instance.OnServerUnlinkNintendoSwitchDeviceIdResultEvent((ServerModels.UnlinkNintendoSwitchDeviceIdResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkPSNAccountResult)) { if (_instance.OnServerUnlinkPSNAccountResultEvent != null) { _instance.OnServerUnlinkPSNAccountResultEvent((ServerModels.UnlinkPSNAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkServerCustomIdResult)) { if (_instance.OnServerUnlinkServerCustomIdResultEvent != null) { _instance.OnServerUnlinkServerCustomIdResultEvent((ServerModels.UnlinkServerCustomIdResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkSteamIdResult)) { if (_instance.OnServerUnlinkSteamIdResultEvent != null) { _instance.OnServerUnlinkSteamIdResultEvent((ServerModels.UnlinkSteamIdResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlinkXboxAccountResult)) { if (_instance.OnServerUnlinkXboxAccountResultEvent != null) { _instance.OnServerUnlinkXboxAccountResultEvent((ServerModels.UnlinkXboxAccountResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlockContainerItemResult)) { if (_instance.OnServerUnlockContainerInstanceResultEvent != null) { _instance.OnServerUnlockContainerInstanceResultEvent((ServerModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ServerModels.UnlockContainerItemResult)) { if (_instance.OnServerUnlockContainerItemResultEvent != null) { _instance.OnServerUnlockContainerItemResultEvent((ServerModels.UnlockContainerItemResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerUpdateAvatarUrlResultEvent != null) { _instance.OnServerUpdateAvatarUrlResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.UpdateBansResult)) { if (_instance.OnServerUpdateBansResultEvent != null) { _instance.OnServerUpdateBansResultEvent((ServerModels.UpdateBansResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataResult)) { if (_instance.OnServerUpdateCharacterDataResultEvent != null) { _instance.OnServerUpdateCharacterDataResultEvent((ServerModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataResult)) { if (_instance.OnServerUpdateCharacterInternalDataResultEvent != null) { _instance.OnServerUpdateCharacterInternalDataResultEvent((ServerModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterDataResult)) { if (_instance.OnServerUpdateCharacterReadOnlyDataResultEvent != null) { _instance.OnServerUpdateCharacterReadOnlyDataResultEvent((ServerModels.UpdateCharacterDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateCharacterStatisticsResult)) { if (_instance.OnServerUpdateCharacterStatisticsResultEvent != null) { _instance.OnServerUpdateCharacterStatisticsResultEvent((ServerModels.UpdateCharacterStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdatePlayerStatisticsResult)) { if (_instance.OnServerUpdatePlayerStatisticsResultEvent != null) { _instance.OnServerUpdatePlayerStatisticsResultEvent((ServerModels.UpdatePlayerStatisticsResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateSharedGroupDataResult)) { if (_instance.OnServerUpdateSharedGroupDataResultEvent != null) { _instance.OnServerUpdateSharedGroupDataResultEvent((ServerModels.UpdateSharedGroupDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserDataResultEvent != null) { _instance.OnServerUpdateUserDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserInternalDataResultEvent != null) { _instance.OnServerUpdateUserInternalDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.EmptyResponse)) { if (_instance.OnServerUpdateUserInventoryItemCustomDataResultEvent != null) { _instance.OnServerUpdateUserInventoryItemCustomDataResultEvent((ServerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserPublisherDataResultEvent != null) { _instance.OnServerUpdateUserPublisherDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserPublisherInternalDataResultEvent != null) { _instance.OnServerUpdateUserPublisherInternalDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserPublisherReadOnlyDataResultEvent != null) { _instance.OnServerUpdateUserPublisherReadOnlyDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.UpdateUserDataResult)) { if (_instance.OnServerUpdateUserReadOnlyDataResultEvent != null) { _instance.OnServerUpdateUserReadOnlyDataResultEvent((ServerModels.UpdateUserDataResult)e.Result); return; } } + if (type == typeof(ServerModels.WriteEventResponse)) { if (_instance.OnServerWriteCharacterEventResultEvent != null) { _instance.OnServerWriteCharacterEventResultEvent((ServerModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ServerModels.WriteEventResponse)) { if (_instance.OnServerWritePlayerEventResultEvent != null) { _instance.OnServerWritePlayerEventResultEvent((ServerModels.WriteEventResponse)e.Result); return; } } + if (type == typeof(ServerModels.WriteEventResponse)) { if (_instance.OnServerWriteTitleEventResultEvent != null) { _instance.OnServerWriteTitleEventResultEvent((ServerModels.WriteEventResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(AuthenticationModels.AuthenticateCustomIdResult)) { if (_instance.OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent != null) { _instance.OnAuthenticationAuthenticateGameServerWithCustomIdResultEvent((AuthenticationModels.AuthenticateCustomIdResult)e.Result); return; } } + if (type == typeof(AuthenticationModels.EmptyResponse)) { if (_instance.OnAuthenticationDeleteResultEvent != null) { _instance.OnAuthenticationDeleteResultEvent((AuthenticationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(AuthenticationModels.GetEntityTokenResponse)) { if (_instance.OnAuthenticationGetEntityTokenResultEvent != null) { _instance.OnAuthenticationGetEntityTokenResultEvent((AuthenticationModels.GetEntityTokenResponse)e.Result); return; } } + if (type == typeof(AuthenticationModels.ValidateEntityTokenResponse)) { if (_instance.OnAuthenticationValidateEntityTokenResultEvent != null) { _instance.OnAuthenticationValidateEntityTokenResultEvent((AuthenticationModels.ValidateEntityTokenResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(CloudScriptModels.ExecuteCloudScriptResult)) { if (_instance.OnCloudScriptExecuteEntityCloudScriptResultEvent != null) { _instance.OnCloudScriptExecuteEntityCloudScriptResultEvent((CloudScriptModels.ExecuteCloudScriptResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ExecuteFunctionResult)) { if (_instance.OnCloudScriptExecuteFunctionResultEvent != null) { _instance.OnCloudScriptExecuteFunctionResultEvent((CloudScriptModels.ExecuteFunctionResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.GetFunctionResult)) { if (_instance.OnCloudScriptGetFunctionResultEvent != null) { _instance.OnCloudScriptGetFunctionResultEvent((CloudScriptModels.GetFunctionResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ListFunctionsResult)) { if (_instance.OnCloudScriptListFunctionsResultEvent != null) { _instance.OnCloudScriptListFunctionsResultEvent((CloudScriptModels.ListFunctionsResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ListHttpFunctionsResult)) { if (_instance.OnCloudScriptListHttpFunctionsResultEvent != null) { _instance.OnCloudScriptListHttpFunctionsResultEvent((CloudScriptModels.ListHttpFunctionsResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.ListQueuedFunctionsResult)) { if (_instance.OnCloudScriptListQueuedFunctionsResultEvent != null) { _instance.OnCloudScriptListQueuedFunctionsResultEvent((CloudScriptModels.ListQueuedFunctionsResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForEntityTriggeredActionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForFunctionExecutionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForPlayerTriggeredActionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptPostFunctionResultForScheduledTaskResultEvent != null) { _instance.OnCloudScriptPostFunctionResultForScheduledTaskResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptRegisterHttpFunctionResultEvent != null) { _instance.OnCloudScriptRegisterHttpFunctionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptRegisterQueuedFunctionResultEvent != null) { _instance.OnCloudScriptRegisterQueuedFunctionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } + if (type == typeof(CloudScriptModels.EmptyResult)) { if (_instance.OnCloudScriptUnregisterFunctionResultEvent != null) { _instance.OnCloudScriptUnregisterFunctionResultEvent((CloudScriptModels.EmptyResult)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(DataModels.AbortFileUploadsResponse)) { if (_instance.OnDataAbortFileUploadsResultEvent != null) { _instance.OnDataAbortFileUploadsResultEvent((DataModels.AbortFileUploadsResponse)e.Result); return; } } + if (type == typeof(DataModels.DeleteFilesResponse)) { if (_instance.OnDataDeleteFilesResultEvent != null) { _instance.OnDataDeleteFilesResultEvent((DataModels.DeleteFilesResponse)e.Result); return; } } + if (type == typeof(DataModels.FinalizeFileUploadsResponse)) { if (_instance.OnDataFinalizeFileUploadsResultEvent != null) { _instance.OnDataFinalizeFileUploadsResultEvent((DataModels.FinalizeFileUploadsResponse)e.Result); return; } } + if (type == typeof(DataModels.GetFilesResponse)) { if (_instance.OnDataGetFilesResultEvent != null) { _instance.OnDataGetFilesResultEvent((DataModels.GetFilesResponse)e.Result); return; } } + if (type == typeof(DataModels.GetObjectsResponse)) { if (_instance.OnDataGetObjectsResultEvent != null) { _instance.OnDataGetObjectsResultEvent((DataModels.GetObjectsResponse)e.Result); return; } } + if (type == typeof(DataModels.InitiateFileUploadsResponse)) { if (_instance.OnDataInitiateFileUploadsResultEvent != null) { _instance.OnDataInitiateFileUploadsResultEvent((DataModels.InitiateFileUploadsResponse)e.Result); return; } } + if (type == typeof(DataModels.SetObjectsResponse)) { if (_instance.OnDataSetObjectsResultEvent != null) { _instance.OnDataSetObjectsResultEvent((DataModels.SetObjectsResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(EconomyModels.AddInventoryItemsResponse)) { if (_instance.OnEconomyAddInventoryItemsResultEvent != null) { _instance.OnEconomyAddInventoryItemsResultEvent((EconomyModels.AddInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.CreateDraftItemResponse)) { if (_instance.OnEconomyCreateDraftItemResultEvent != null) { _instance.OnEconomyCreateDraftItemResultEvent((EconomyModels.CreateDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.CreateUploadUrlsResponse)) { if (_instance.OnEconomyCreateUploadUrlsResultEvent != null) { _instance.OnEconomyCreateUploadUrlsResultEvent((EconomyModels.CreateUploadUrlsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteEntityItemReviewsResponse)) { if (_instance.OnEconomyDeleteEntityItemReviewsResultEvent != null) { _instance.OnEconomyDeleteEntityItemReviewsResultEvent((EconomyModels.DeleteEntityItemReviewsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteInventoryCollectionResponse)) { if (_instance.OnEconomyDeleteInventoryCollectionResultEvent != null) { _instance.OnEconomyDeleteInventoryCollectionResultEvent((EconomyModels.DeleteInventoryCollectionResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteInventoryItemsResponse)) { if (_instance.OnEconomyDeleteInventoryItemsResultEvent != null) { _instance.OnEconomyDeleteInventoryItemsResultEvent((EconomyModels.DeleteInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.DeleteItemResponse)) { if (_instance.OnEconomyDeleteItemResultEvent != null) { _instance.OnEconomyDeleteItemResultEvent((EconomyModels.DeleteItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ExecuteInventoryOperationsResponse)) { if (_instance.OnEconomyExecuteInventoryOperationsResultEvent != null) { _instance.OnEconomyExecuteInventoryOperationsResultEvent((EconomyModels.ExecuteInventoryOperationsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetCatalogConfigResponse)) { if (_instance.OnEconomyGetCatalogConfigResultEvent != null) { _instance.OnEconomyGetCatalogConfigResultEvent((EconomyModels.GetCatalogConfigResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetDraftItemResponse)) { if (_instance.OnEconomyGetDraftItemResultEvent != null) { _instance.OnEconomyGetDraftItemResultEvent((EconomyModels.GetDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetDraftItemsResponse)) { if (_instance.OnEconomyGetDraftItemsResultEvent != null) { _instance.OnEconomyGetDraftItemsResultEvent((EconomyModels.GetDraftItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetEntityDraftItemsResponse)) { if (_instance.OnEconomyGetEntityDraftItemsResultEvent != null) { _instance.OnEconomyGetEntityDraftItemsResultEvent((EconomyModels.GetEntityDraftItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetEntityItemReviewResponse)) { if (_instance.OnEconomyGetEntityItemReviewResultEvent != null) { _instance.OnEconomyGetEntityItemReviewResultEvent((EconomyModels.GetEntityItemReviewResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetInventoryCollectionIdsResponse)) { if (_instance.OnEconomyGetInventoryCollectionIdsResultEvent != null) { _instance.OnEconomyGetInventoryCollectionIdsResultEvent((EconomyModels.GetInventoryCollectionIdsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetInventoryItemsResponse)) { if (_instance.OnEconomyGetInventoryItemsResultEvent != null) { _instance.OnEconomyGetInventoryItemsResultEvent((EconomyModels.GetInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemResponse)) { if (_instance.OnEconomyGetItemResultEvent != null) { _instance.OnEconomyGetItemResultEvent((EconomyModels.GetItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemContainersResponse)) { if (_instance.OnEconomyGetItemContainersResultEvent != null) { _instance.OnEconomyGetItemContainersResultEvent((EconomyModels.GetItemContainersResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemModerationStateResponse)) { if (_instance.OnEconomyGetItemModerationStateResultEvent != null) { _instance.OnEconomyGetItemModerationStateResultEvent((EconomyModels.GetItemModerationStateResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemPublishStatusResponse)) { if (_instance.OnEconomyGetItemPublishStatusResultEvent != null) { _instance.OnEconomyGetItemPublishStatusResultEvent((EconomyModels.GetItemPublishStatusResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemReviewsResponse)) { if (_instance.OnEconomyGetItemReviewsResultEvent != null) { _instance.OnEconomyGetItemReviewsResultEvent((EconomyModels.GetItemReviewsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemReviewSummaryResponse)) { if (_instance.OnEconomyGetItemReviewSummaryResultEvent != null) { _instance.OnEconomyGetItemReviewSummaryResultEvent((EconomyModels.GetItemReviewSummaryResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetItemsResponse)) { if (_instance.OnEconomyGetItemsResultEvent != null) { _instance.OnEconomyGetItemsResultEvent((EconomyModels.GetItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetMicrosoftStoreAccessTokensResponse)) { if (_instance.OnEconomyGetMicrosoftStoreAccessTokensResultEvent != null) { _instance.OnEconomyGetMicrosoftStoreAccessTokensResultEvent((EconomyModels.GetMicrosoftStoreAccessTokensResponse)e.Result); return; } } + if (type == typeof(EconomyModels.GetTransactionHistoryResponse)) { if (_instance.OnEconomyGetTransactionHistoryResultEvent != null) { _instance.OnEconomyGetTransactionHistoryResultEvent((EconomyModels.GetTransactionHistoryResponse)e.Result); return; } } + if (type == typeof(EconomyModels.PublishDraftItemResponse)) { if (_instance.OnEconomyPublishDraftItemResultEvent != null) { _instance.OnEconomyPublishDraftItemResultEvent((EconomyModels.PublishDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.PurchaseInventoryItemsResponse)) { if (_instance.OnEconomyPurchaseInventoryItemsResultEvent != null) { _instance.OnEconomyPurchaseInventoryItemsResultEvent((EconomyModels.PurchaseInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemAppleAppStoreInventoryItemsResponse)) { if (_instance.OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemAppleAppStoreInventoryItemsResultEvent((EconomyModels.RedeemAppleAppStoreInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemGooglePlayInventoryItemsResponse)) { if (_instance.OnEconomyRedeemGooglePlayInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemGooglePlayInventoryItemsResultEvent((EconomyModels.RedeemGooglePlayInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemMicrosoftStoreInventoryItemsResponse)) { if (_instance.OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemMicrosoftStoreInventoryItemsResultEvent((EconomyModels.RedeemMicrosoftStoreInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemNintendoEShopInventoryItemsResponse)) { if (_instance.OnEconomyRedeemNintendoEShopInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemNintendoEShopInventoryItemsResultEvent((EconomyModels.RedeemNintendoEShopInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemPlayStationStoreInventoryItemsResponse)) { if (_instance.OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemPlayStationStoreInventoryItemsResultEvent((EconomyModels.RedeemPlayStationStoreInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.RedeemSteamInventoryItemsResponse)) { if (_instance.OnEconomyRedeemSteamInventoryItemsResultEvent != null) { _instance.OnEconomyRedeemSteamInventoryItemsResultEvent((EconomyModels.RedeemSteamInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ReportItemResponse)) { if (_instance.OnEconomyReportItemResultEvent != null) { _instance.OnEconomyReportItemResultEvent((EconomyModels.ReportItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ReportItemReviewResponse)) { if (_instance.OnEconomyReportItemReviewResultEvent != null) { _instance.OnEconomyReportItemReviewResultEvent((EconomyModels.ReportItemReviewResponse)e.Result); return; } } + if (type == typeof(EconomyModels.ReviewItemResponse)) { if (_instance.OnEconomyReviewItemResultEvent != null) { _instance.OnEconomyReviewItemResultEvent((EconomyModels.ReviewItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SearchItemsResponse)) { if (_instance.OnEconomySearchItemsResultEvent != null) { _instance.OnEconomySearchItemsResultEvent((EconomyModels.SearchItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SetItemModerationStateResponse)) { if (_instance.OnEconomySetItemModerationStateResultEvent != null) { _instance.OnEconomySetItemModerationStateResultEvent((EconomyModels.SetItemModerationStateResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SubmitItemReviewVoteResponse)) { if (_instance.OnEconomySubmitItemReviewVoteResultEvent != null) { _instance.OnEconomySubmitItemReviewVoteResultEvent((EconomyModels.SubmitItemReviewVoteResponse)e.Result); return; } } + if (type == typeof(EconomyModels.SubtractInventoryItemsResponse)) { if (_instance.OnEconomySubtractInventoryItemsResultEvent != null) { _instance.OnEconomySubtractInventoryItemsResultEvent((EconomyModels.SubtractInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.TakedownItemReviewsResponse)) { if (_instance.OnEconomyTakedownItemReviewsResultEvent != null) { _instance.OnEconomyTakedownItemReviewsResultEvent((EconomyModels.TakedownItemReviewsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.TransferInventoryItemsResponse)) { if (_instance.OnEconomyTransferInventoryItemsResultEvent != null) { _instance.OnEconomyTransferInventoryItemsResultEvent((EconomyModels.TransferInventoryItemsResponse)e.Result); return; } } + if (type == typeof(EconomyModels.UpdateCatalogConfigResponse)) { if (_instance.OnEconomyUpdateCatalogConfigResultEvent != null) { _instance.OnEconomyUpdateCatalogConfigResultEvent((EconomyModels.UpdateCatalogConfigResponse)e.Result); return; } } + if (type == typeof(EconomyModels.UpdateDraftItemResponse)) { if (_instance.OnEconomyUpdateDraftItemResultEvent != null) { _instance.OnEconomyUpdateDraftItemResultEvent((EconomyModels.UpdateDraftItemResponse)e.Result); return; } } + if (type == typeof(EconomyModels.UpdateInventoryItemsResponse)) { if (_instance.OnEconomyUpdateInventoryItemsResultEvent != null) { _instance.OnEconomyUpdateInventoryItemsResultEvent((EconomyModels.UpdateInventoryItemsResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(EventsModels.WriteEventsResponse)) { if (_instance.OnEventsWriteEventsResultEvent != null) { _instance.OnEventsWriteEventsResultEvent((EventsModels.WriteEventsResponse)e.Result); return; } } + if (type == typeof(EventsModels.WriteEventsResponse)) { if (_instance.OnEventsWriteTelemetryEventsResultEvent != null) { _instance.OnEventsWriteTelemetryEventsResultEvent((EventsModels.WriteEventsResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(ExperimentationModels.CreateExclusionGroupResult)) { if (_instance.OnExperimentationCreateExclusionGroupResultEvent != null) { _instance.OnExperimentationCreateExclusionGroupResultEvent((ExperimentationModels.CreateExclusionGroupResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.CreateExperimentResult)) { if (_instance.OnExperimentationCreateExperimentResultEvent != null) { _instance.OnExperimentationCreateExperimentResultEvent((ExperimentationModels.CreateExperimentResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationDeleteExclusionGroupResultEvent != null) { _instance.OnExperimentationDeleteExclusionGroupResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationDeleteExperimentResultEvent != null) { _instance.OnExperimentationDeleteExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupsResult)) { if (_instance.OnExperimentationGetExclusionGroupsResultEvent != null) { _instance.OnExperimentationGetExclusionGroupsResultEvent((ExperimentationModels.GetExclusionGroupsResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetExclusionGroupTrafficResult)) { if (_instance.OnExperimentationGetExclusionGroupTrafficResultEvent != null) { _instance.OnExperimentationGetExclusionGroupTrafficResultEvent((ExperimentationModels.GetExclusionGroupTrafficResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetExperimentsResult)) { if (_instance.OnExperimentationGetExperimentsResultEvent != null) { _instance.OnExperimentationGetExperimentsResultEvent((ExperimentationModels.GetExperimentsResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetLatestScorecardResult)) { if (_instance.OnExperimentationGetLatestScorecardResultEvent != null) { _instance.OnExperimentationGetLatestScorecardResultEvent((ExperimentationModels.GetLatestScorecardResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.GetTreatmentAssignmentResult)) { if (_instance.OnExperimentationGetTreatmentAssignmentResultEvent != null) { _instance.OnExperimentationGetTreatmentAssignmentResultEvent((ExperimentationModels.GetTreatmentAssignmentResult)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationStartExperimentResultEvent != null) { _instance.OnExperimentationStartExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationStopExperimentResultEvent != null) { _instance.OnExperimentationStopExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationUpdateExclusionGroupResultEvent != null) { _instance.OnExperimentationUpdateExclusionGroupResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } + if (type == typeof(ExperimentationModels.EmptyResponse)) { if (_instance.OnExperimentationUpdateExperimentResultEvent != null) { _instance.OnExperimentationUpdateExperimentResultEvent((ExperimentationModels.EmptyResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(InsightsModels.InsightsGetDetailsResponse)) { if (_instance.OnInsightsGetDetailsResultEvent != null) { _instance.OnInsightsGetDetailsResultEvent((InsightsModels.InsightsGetDetailsResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsGetLimitsResponse)) { if (_instance.OnInsightsGetLimitsResultEvent != null) { _instance.OnInsightsGetLimitsResultEvent((InsightsModels.InsightsGetLimitsResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsGetOperationStatusResponse)) { if (_instance.OnInsightsGetOperationStatusResultEvent != null) { _instance.OnInsightsGetOperationStatusResultEvent((InsightsModels.InsightsGetOperationStatusResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsGetPendingOperationsResponse)) { if (_instance.OnInsightsGetPendingOperationsResultEvent != null) { _instance.OnInsightsGetPendingOperationsResultEvent((InsightsModels.InsightsGetPendingOperationsResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsOperationResponse)) { if (_instance.OnInsightsSetPerformanceResultEvent != null) { _instance.OnInsightsSetPerformanceResultEvent((InsightsModels.InsightsOperationResponse)e.Result); return; } } + if (type == typeof(InsightsModels.InsightsOperationResponse)) { if (_instance.OnInsightsSetStorageRetentionResultEvent != null) { _instance.OnInsightsSetStorageRetentionResultEvent((InsightsModels.InsightsOperationResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsAcceptGroupApplicationResultEvent != null) { _instance.OnGroupsAcceptGroupApplicationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsAcceptGroupInvitationResultEvent != null) { _instance.OnGroupsAcceptGroupInvitationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsAddMembersResultEvent != null) { _instance.OnGroupsAddMembersResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ApplyToGroupResponse)) { if (_instance.OnGroupsApplyToGroupResultEvent != null) { _instance.OnGroupsApplyToGroupResultEvent((GroupsModels.ApplyToGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsBlockEntityResultEvent != null) { _instance.OnGroupsBlockEntityResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsChangeMemberRoleResultEvent != null) { _instance.OnGroupsChangeMemberRoleResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.CreateGroupResponse)) { if (_instance.OnGroupsCreateGroupResultEvent != null) { _instance.OnGroupsCreateGroupResultEvent((GroupsModels.CreateGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.CreateGroupRoleResponse)) { if (_instance.OnGroupsCreateRoleResultEvent != null) { _instance.OnGroupsCreateRoleResultEvent((GroupsModels.CreateGroupRoleResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsDeleteGroupResultEvent != null) { _instance.OnGroupsDeleteGroupResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsDeleteRoleResultEvent != null) { _instance.OnGroupsDeleteRoleResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.GetGroupResponse)) { if (_instance.OnGroupsGetGroupResultEvent != null) { _instance.OnGroupsGetGroupResultEvent((GroupsModels.GetGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.InviteToGroupResponse)) { if (_instance.OnGroupsInviteToGroupResultEvent != null) { _instance.OnGroupsInviteToGroupResultEvent((GroupsModels.InviteToGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.IsMemberResponse)) { if (_instance.OnGroupsIsMemberResultEvent != null) { _instance.OnGroupsIsMemberResultEvent((GroupsModels.IsMemberResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupApplicationsResponse)) { if (_instance.OnGroupsListGroupApplicationsResultEvent != null) { _instance.OnGroupsListGroupApplicationsResultEvent((GroupsModels.ListGroupApplicationsResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupBlocksResponse)) { if (_instance.OnGroupsListGroupBlocksResultEvent != null) { _instance.OnGroupsListGroupBlocksResultEvent((GroupsModels.ListGroupBlocksResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupInvitationsResponse)) { if (_instance.OnGroupsListGroupInvitationsResultEvent != null) { _instance.OnGroupsListGroupInvitationsResultEvent((GroupsModels.ListGroupInvitationsResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListGroupMembersResponse)) { if (_instance.OnGroupsListGroupMembersResultEvent != null) { _instance.OnGroupsListGroupMembersResultEvent((GroupsModels.ListGroupMembersResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListMembershipResponse)) { if (_instance.OnGroupsListMembershipResultEvent != null) { _instance.OnGroupsListMembershipResultEvent((GroupsModels.ListMembershipResponse)e.Result); return; } } + if (type == typeof(GroupsModels.ListMembershipOpportunitiesResponse)) { if (_instance.OnGroupsListMembershipOpportunitiesResultEvent != null) { _instance.OnGroupsListMembershipOpportunitiesResultEvent((GroupsModels.ListMembershipOpportunitiesResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsRemoveGroupApplicationResultEvent != null) { _instance.OnGroupsRemoveGroupApplicationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsRemoveGroupInvitationResultEvent != null) { _instance.OnGroupsRemoveGroupInvitationResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsRemoveMembersResultEvent != null) { _instance.OnGroupsRemoveMembersResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.EmptyResponse)) { if (_instance.OnGroupsUnblockEntityResultEvent != null) { _instance.OnGroupsUnblockEntityResultEvent((GroupsModels.EmptyResponse)e.Result); return; } } + if (type == typeof(GroupsModels.UpdateGroupResponse)) { if (_instance.OnGroupsUpdateGroupResultEvent != null) { _instance.OnGroupsUpdateGroupResultEvent((GroupsModels.UpdateGroupResponse)e.Result); return; } } + if (type == typeof(GroupsModels.UpdateGroupRoleResponse)) { if (_instance.OnGroupsUpdateRoleResultEvent != null) { _instance.OnGroupsUpdateRoleResultEvent((GroupsModels.UpdateGroupRoleResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(LocalizationModels.GetLanguageListResponse)) { if (_instance.OnLocalizationGetLanguageListResultEvent != null) { _instance.OnLocalizationGetLanguageListResultEvent((LocalizationModels.GetLanguageListResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(MultiplayerModels.CancelAllMatchmakingTicketsForPlayerResult)) { if (_instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerCancelAllMatchmakingTicketsForPlayerResultEvent((MultiplayerModels.CancelAllMatchmakingTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CancelAllServerBackfillTicketsForPlayerResult)) { if (_instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerCancelAllServerBackfillTicketsForPlayerResultEvent((MultiplayerModels.CancelAllServerBackfillTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CancelMatchmakingTicketResult)) { if (_instance.OnMultiplayerCancelMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerCancelMatchmakingTicketResultEvent((MultiplayerModels.CancelMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CancelServerBackfillTicketResult)) { if (_instance.OnMultiplayerCancelServerBackfillTicketResultEvent != null) { _instance.OnMultiplayerCancelServerBackfillTicketResultEvent((MultiplayerModels.CancelServerBackfillTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.BuildAliasDetailsResponse)) { if (_instance.OnMultiplayerCreateBuildAliasResultEvent != null) { _instance.OnMultiplayerCreateBuildAliasResultEvent((MultiplayerModels.BuildAliasDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithCustomContainerResponse)) { if (_instance.OnMultiplayerCreateBuildWithCustomContainerResultEvent != null) { _instance.OnMultiplayerCreateBuildWithCustomContainerResultEvent((MultiplayerModels.CreateBuildWithCustomContainerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithManagedContainerResponse)) { if (_instance.OnMultiplayerCreateBuildWithManagedContainerResultEvent != null) { _instance.OnMultiplayerCreateBuildWithManagedContainerResultEvent((MultiplayerModels.CreateBuildWithManagedContainerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateBuildWithProcessBasedServerResponse)) { if (_instance.OnMultiplayerCreateBuildWithProcessBasedServerResultEvent != null) { _instance.OnMultiplayerCreateBuildWithProcessBasedServerResultEvent((MultiplayerModels.CreateBuildWithProcessBasedServerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateLobbyResult)) { if (_instance.OnMultiplayerCreateLobbyResultEvent != null) { _instance.OnMultiplayerCreateLobbyResultEvent((MultiplayerModels.CreateLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateMatchmakingTicketResult)) { if (_instance.OnMultiplayerCreateMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerCreateMatchmakingTicketResultEvent((MultiplayerModels.CreateMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateRemoteUserResponse)) { if (_instance.OnMultiplayerCreateRemoteUserResultEvent != null) { _instance.OnMultiplayerCreateRemoteUserResultEvent((MultiplayerModels.CreateRemoteUserResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateServerBackfillTicketResult)) { if (_instance.OnMultiplayerCreateServerBackfillTicketResultEvent != null) { _instance.OnMultiplayerCreateServerBackfillTicketResultEvent((MultiplayerModels.CreateServerBackfillTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateMatchmakingTicketResult)) { if (_instance.OnMultiplayerCreateServerMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerCreateServerMatchmakingTicketResultEvent((MultiplayerModels.CreateMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeResponse)) { if (_instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent != null) { _instance.OnMultiplayerCreateTitleMultiplayerServersQuotaChangeResultEvent((MultiplayerModels.CreateTitleMultiplayerServersQuotaChangeResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteAssetResultEvent != null) { _instance.OnMultiplayerDeleteAssetResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteBuildResultEvent != null) { _instance.OnMultiplayerDeleteBuildResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteBuildAliasResultEvent != null) { _instance.OnMultiplayerDeleteBuildAliasResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteBuildRegionResultEvent != null) { _instance.OnMultiplayerDeleteBuildRegionResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteCertificateResultEvent != null) { _instance.OnMultiplayerDeleteCertificateResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteContainerImageRepositoryResultEvent != null) { _instance.OnMultiplayerDeleteContainerImageRepositoryResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerDeleteLobbyResultEvent != null) { _instance.OnMultiplayerDeleteLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerDeleteRemoteUserResultEvent != null) { _instance.OnMultiplayerDeleteRemoteUserResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EnableMultiplayerServersForTitleResponse)) { if (_instance.OnMultiplayerEnableMultiplayerServersForTitleResultEvent != null) { _instance.OnMultiplayerEnableMultiplayerServersForTitleResultEvent((MultiplayerModels.EnableMultiplayerServersForTitleResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.FindFriendLobbiesResult)) { if (_instance.OnMultiplayerFindFriendLobbiesResultEvent != null) { _instance.OnMultiplayerFindFriendLobbiesResultEvent((MultiplayerModels.FindFriendLobbiesResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.FindLobbiesResult)) { if (_instance.OnMultiplayerFindLobbiesResultEvent != null) { _instance.OnMultiplayerFindLobbiesResultEvent((MultiplayerModels.FindLobbiesResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetAssetDownloadUrlResponse)) { if (_instance.OnMultiplayerGetAssetDownloadUrlResultEvent != null) { _instance.OnMultiplayerGetAssetDownloadUrlResultEvent((MultiplayerModels.GetAssetDownloadUrlResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetAssetUploadUrlResponse)) { if (_instance.OnMultiplayerGetAssetUploadUrlResultEvent != null) { _instance.OnMultiplayerGetAssetUploadUrlResultEvent((MultiplayerModels.GetAssetUploadUrlResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetBuildResponse)) { if (_instance.OnMultiplayerGetBuildResultEvent != null) { _instance.OnMultiplayerGetBuildResultEvent((MultiplayerModels.GetBuildResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.BuildAliasDetailsResponse)) { if (_instance.OnMultiplayerGetBuildAliasResultEvent != null) { _instance.OnMultiplayerGetBuildAliasResultEvent((MultiplayerModels.BuildAliasDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetContainerRegistryCredentialsResponse)) { if (_instance.OnMultiplayerGetContainerRegistryCredentialsResultEvent != null) { _instance.OnMultiplayerGetContainerRegistryCredentialsResultEvent((MultiplayerModels.GetContainerRegistryCredentialsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetLobbyResult)) { if (_instance.OnMultiplayerGetLobbyResultEvent != null) { _instance.OnMultiplayerGetLobbyResultEvent((MultiplayerModels.GetLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMatchResult)) { if (_instance.OnMultiplayerGetMatchResultEvent != null) { _instance.OnMultiplayerGetMatchResultEvent((MultiplayerModels.GetMatchResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingQueueResult)) { if (_instance.OnMultiplayerGetMatchmakingQueueResultEvent != null) { _instance.OnMultiplayerGetMatchmakingQueueResultEvent((MultiplayerModels.GetMatchmakingQueueResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMatchmakingTicketResult)) { if (_instance.OnMultiplayerGetMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerGetMatchmakingTicketResultEvent((MultiplayerModels.GetMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerDetailsResponse)) { if (_instance.OnMultiplayerGetMultiplayerServerDetailsResultEvent != null) { _instance.OnMultiplayerGetMultiplayerServerDetailsResultEvent((MultiplayerModels.GetMultiplayerServerDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerLogsResponse)) { if (_instance.OnMultiplayerGetMultiplayerServerLogsResultEvent != null) { _instance.OnMultiplayerGetMultiplayerServerLogsResultEvent((MultiplayerModels.GetMultiplayerServerLogsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetMultiplayerServerLogsResponse)) { if (_instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent != null) { _instance.OnMultiplayerGetMultiplayerSessionLogsBySessionIdResultEvent((MultiplayerModels.GetMultiplayerServerLogsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetQueueStatisticsResult)) { if (_instance.OnMultiplayerGetQueueStatisticsResultEvent != null) { _instance.OnMultiplayerGetQueueStatisticsResultEvent((MultiplayerModels.GetQueueStatisticsResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetRemoteLoginEndpointResponse)) { if (_instance.OnMultiplayerGetRemoteLoginEndpointResultEvent != null) { _instance.OnMultiplayerGetRemoteLoginEndpointResultEvent((MultiplayerModels.GetRemoteLoginEndpointResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetServerBackfillTicketResult)) { if (_instance.OnMultiplayerGetServerBackfillTicketResultEvent != null) { _instance.OnMultiplayerGetServerBackfillTicketResultEvent((MultiplayerModels.GetServerBackfillTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusResponse)) { if (_instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent != null) { _instance.OnMultiplayerGetTitleEnabledForMultiplayerServersStatusResultEvent((MultiplayerModels.GetTitleEnabledForMultiplayerServersStatusResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotaChangeResponse)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotaChangeResultEvent((MultiplayerModels.GetTitleMultiplayerServersQuotaChangeResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.GetTitleMultiplayerServersQuotasResponse)) { if (_instance.OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent != null) { _instance.OnMultiplayerGetTitleMultiplayerServersQuotasResultEvent((MultiplayerModels.GetTitleMultiplayerServersQuotasResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerInviteToLobbyResultEvent != null) { _instance.OnMultiplayerInviteToLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyResult)) { if (_instance.OnMultiplayerJoinArrangedLobbyResultEvent != null) { _instance.OnMultiplayerJoinArrangedLobbyResultEvent((MultiplayerModels.JoinLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.JoinLobbyResult)) { if (_instance.OnMultiplayerJoinLobbyResultEvent != null) { _instance.OnMultiplayerJoinLobbyResultEvent((MultiplayerModels.JoinLobbyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.JoinMatchmakingTicketResult)) { if (_instance.OnMultiplayerJoinMatchmakingTicketResultEvent != null) { _instance.OnMultiplayerJoinMatchmakingTicketResultEvent((MultiplayerModels.JoinMatchmakingTicketResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerLeaveLobbyResultEvent != null) { _instance.OnMultiplayerLeaveLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersResponse)) { if (_instance.OnMultiplayerListArchivedMultiplayerServersResultEvent != null) { _instance.OnMultiplayerListArchivedMultiplayerServersResultEvent((MultiplayerModels.ListMultiplayerServersResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListAssetSummariesResponse)) { if (_instance.OnMultiplayerListAssetSummariesResultEvent != null) { _instance.OnMultiplayerListAssetSummariesResultEvent((MultiplayerModels.ListAssetSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListBuildAliasesResponse)) { if (_instance.OnMultiplayerListBuildAliasesResultEvent != null) { _instance.OnMultiplayerListBuildAliasesResultEvent((MultiplayerModels.ListBuildAliasesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListBuildSummariesResponse)) { if (_instance.OnMultiplayerListBuildSummariesV2ResultEvent != null) { _instance.OnMultiplayerListBuildSummariesV2ResultEvent((MultiplayerModels.ListBuildSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListCertificateSummariesResponse)) { if (_instance.OnMultiplayerListCertificateSummariesResultEvent != null) { _instance.OnMultiplayerListCertificateSummariesResultEvent((MultiplayerModels.ListCertificateSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListContainerImagesResponse)) { if (_instance.OnMultiplayerListContainerImagesResultEvent != null) { _instance.OnMultiplayerListContainerImagesResultEvent((MultiplayerModels.ListContainerImagesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListContainerImageTagsResponse)) { if (_instance.OnMultiplayerListContainerImageTagsResultEvent != null) { _instance.OnMultiplayerListContainerImageTagsResultEvent((MultiplayerModels.ListContainerImageTagsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingQueuesResult)) { if (_instance.OnMultiplayerListMatchmakingQueuesResultEvent != null) { _instance.OnMultiplayerListMatchmakingQueuesResultEvent((MultiplayerModels.ListMatchmakingQueuesResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMatchmakingTicketsForPlayerResult)) { if (_instance.OnMultiplayerListMatchmakingTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerListMatchmakingTicketsForPlayerResultEvent((MultiplayerModels.ListMatchmakingTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListMultiplayerServersResponse)) { if (_instance.OnMultiplayerListMultiplayerServersResultEvent != null) { _instance.OnMultiplayerListMultiplayerServersResultEvent((MultiplayerModels.ListMultiplayerServersResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListPartyQosServersResponse)) { if (_instance.OnMultiplayerListPartyQosServersResultEvent != null) { _instance.OnMultiplayerListPartyQosServersResultEvent((MultiplayerModels.ListPartyQosServersResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListQosServersForTitleResponse)) { if (_instance.OnMultiplayerListQosServersForTitleResultEvent != null) { _instance.OnMultiplayerListQosServersForTitleResultEvent((MultiplayerModels.ListQosServersForTitleResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListServerBackfillTicketsForPlayerResult)) { if (_instance.OnMultiplayerListServerBackfillTicketsForPlayerResultEvent != null) { _instance.OnMultiplayerListServerBackfillTicketsForPlayerResultEvent((MultiplayerModels.ListServerBackfillTicketsForPlayerResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListTitleMultiplayerServersQuotaChangesResponse)) { if (_instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent != null) { _instance.OnMultiplayerListTitleMultiplayerServersQuotaChangesResultEvent((MultiplayerModels.ListTitleMultiplayerServersQuotaChangesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.ListVirtualMachineSummariesResponse)) { if (_instance.OnMultiplayerListVirtualMachineSummariesResultEvent != null) { _instance.OnMultiplayerListVirtualMachineSummariesResultEvent((MultiplayerModels.ListVirtualMachineSummariesResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.RemoveMatchmakingQueueResult)) { if (_instance.OnMultiplayerRemoveMatchmakingQueueResultEvent != null) { _instance.OnMultiplayerRemoveMatchmakingQueueResultEvent((MultiplayerModels.RemoveMatchmakingQueueResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerRemoveMemberResultEvent != null) { _instance.OnMultiplayerRemoveMemberResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.RequestMultiplayerServerResponse)) { if (_instance.OnMultiplayerRequestMultiplayerServerResultEvent != null) { _instance.OnMultiplayerRequestMultiplayerServerResultEvent((MultiplayerModels.RequestMultiplayerServerResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.RolloverContainerRegistryCredentialsResponse)) { if (_instance.OnMultiplayerRolloverContainerRegistryCredentialsResultEvent != null) { _instance.OnMultiplayerRolloverContainerRegistryCredentialsResultEvent((MultiplayerModels.RolloverContainerRegistryCredentialsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.SetMatchmakingQueueResult)) { if (_instance.OnMultiplayerSetMatchmakingQueueResultEvent != null) { _instance.OnMultiplayerSetMatchmakingQueueResultEvent((MultiplayerModels.SetMatchmakingQueueResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerShutdownMultiplayerServerResultEvent != null) { _instance.OnMultiplayerShutdownMultiplayerServerResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.SubscribeToLobbyResourceResult)) { if (_instance.OnMultiplayerSubscribeToLobbyResourceResultEvent != null) { _instance.OnMultiplayerSubscribeToLobbyResourceResultEvent((MultiplayerModels.SubscribeToLobbyResourceResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.SubscribeToMatchResourceResult)) { if (_instance.OnMultiplayerSubscribeToMatchmakingResourceResultEvent != null) { _instance.OnMultiplayerSubscribeToMatchmakingResourceResultEvent((MultiplayerModels.SubscribeToMatchResourceResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerUnsubscribeFromLobbyResourceResultEvent != null) { _instance.OnMultiplayerUnsubscribeFromLobbyResourceResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.UnsubscribeFromMatchResourceResult)) { if (_instance.OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent != null) { _instance.OnMultiplayerUnsubscribeFromMatchmakingResourceResultEvent((MultiplayerModels.UnsubscribeFromMatchResourceResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUntagContainerImageResultEvent != null) { _instance.OnMultiplayerUntagContainerImageResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.BuildAliasDetailsResponse)) { if (_instance.OnMultiplayerUpdateBuildAliasResultEvent != null) { _instance.OnMultiplayerUpdateBuildAliasResultEvent((MultiplayerModels.BuildAliasDetailsResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUpdateBuildNameResultEvent != null) { _instance.OnMultiplayerUpdateBuildNameResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUpdateBuildRegionResultEvent != null) { _instance.OnMultiplayerUpdateBuildRegionResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUpdateBuildRegionsResultEvent != null) { _instance.OnMultiplayerUpdateBuildRegionsResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } + if (type == typeof(MultiplayerModels.LobbyEmptyResult)) { if (_instance.OnMultiplayerUpdateLobbyResultEvent != null) { _instance.OnMultiplayerUpdateLobbyResultEvent((MultiplayerModels.LobbyEmptyResult)e.Result); return; } } + if (type == typeof(MultiplayerModels.EmptyResponse)) { if (_instance.OnMultiplayerUploadCertificateResultEvent != null) { _instance.OnMultiplayerUploadCertificateResultEvent((MultiplayerModels.EmptyResponse)e.Result); return; } } +#endif +#if !DISABLE_PLAYFABENTITY_API + + if (type == typeof(ProfilesModels.GetGlobalPolicyResponse)) { if (_instance.OnProfilesGetGlobalPolicyResultEvent != null) { _instance.OnProfilesGetGlobalPolicyResultEvent((ProfilesModels.GetGlobalPolicyResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetEntityProfileResponse)) { if (_instance.OnProfilesGetProfileResultEvent != null) { _instance.OnProfilesGetProfileResultEvent((ProfilesModels.GetEntityProfileResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetEntityProfilesResponse)) { if (_instance.OnProfilesGetProfilesResultEvent != null) { _instance.OnProfilesGetProfilesResultEvent((ProfilesModels.GetEntityProfilesResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsResponse)) { if (_instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent != null) { _instance.OnProfilesGetTitlePlayersFromMasterPlayerAccountIdsResultEvent((ProfilesModels.GetTitlePlayersFromMasterPlayerAccountIdsResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.GetTitlePlayersFromProviderIDsResponse)) { if (_instance.OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent != null) { _instance.OnProfilesGetTitlePlayersFromXboxLiveIDsResultEvent((ProfilesModels.GetTitlePlayersFromProviderIDsResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.SetGlobalPolicyResponse)) { if (_instance.OnProfilesSetGlobalPolicyResultEvent != null) { _instance.OnProfilesSetGlobalPolicyResultEvent((ProfilesModels.SetGlobalPolicyResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.SetProfileLanguageResponse)) { if (_instance.OnProfilesSetProfileLanguageResultEvent != null) { _instance.OnProfilesSetProfileLanguageResultEvent((ProfilesModels.SetProfileLanguageResponse)e.Result); return; } } + if (type == typeof(ProfilesModels.SetEntityProfilePolicyResponse)) { if (_instance.OnProfilesSetProfilePolicyResultEvent != null) { _instance.OnProfilesSetProfilePolicyResultEvent((ProfilesModels.SetEntityProfilePolicyResponse)e.Result); return; } } +#endif + + } + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta new file mode 100644 index 00000000..1eedf00a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabEvents.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 059603d7e53649849b7f08d3b99af79c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs new file mode 100644 index 00000000..d0d23f0e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs @@ -0,0 +1,270 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Net; +using System.Text; +using System.Threading; +using PlayFab.Internal; +using UnityEngine; + +namespace PlayFab.Public +{ +#if !UNITY_WSA && !UNITY_WP8 && !NETFX_CORE + public interface IPlayFabLogger + { + IPAddress ip { get; set; } + int port { get; set; } + string url { get; set; } + + // Unity MonoBehaviour callbacks + void OnEnable(); + void OnDisable(); + void OnDestroy(); + } + + /// + /// This is some unity-log capturing logic, and threading tools that allow logging to be caught and processed on another thread + /// + public abstract class PlayFabLoggerBase : IPlayFabLogger + { + private static readonly StringBuilder Sb = new StringBuilder(); + private readonly Queue LogMessageQueue = new Queue(); + private const int LOG_CACHE_INTERVAL_MS = 10000; + + private Thread _writeLogThread; + private readonly object _threadLock = new object(); + private static readonly TimeSpan _threadKillTimeout = TimeSpan.FromSeconds(60); + private DateTime _threadKillTime = DateTime.UtcNow + _threadKillTimeout; // Kill the thread after 1 minute of inactivity + private bool _isApplicationPlaying = true; + private int _pendingLogsCount; + + public IPAddress ip { get; set; } + public int port { get; set; } + public string url { get; set; } + + protected PlayFabLoggerBase() + { + var gatherer = new PlayFabDataGatherer(); + var message = gatherer.GenerateReport(); + lock (LogMessageQueue) + { + LogMessageQueue.Enqueue(message); + } + } + + public virtual void OnEnable() + { + PlayFabHttp.instance.StartCoroutine(RegisterLogger()); // Coroutine helper to set up log-callbacks + } + + private IEnumerator RegisterLogger() + { + yield return new WaitForEndOfFrame(); // Effectively just a short wait before activating this registration + if (!string.IsNullOrEmpty(PlayFabSettings.LoggerHost)) + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + Application.logMessageReceivedThreaded += HandleUnityLog; +#else + Application.RegisterLogCallback(HandleUnityLog); +#endif + } + } + + public virtual void OnDisable() + { + if (!string.IsNullOrEmpty(PlayFabSettings.LoggerHost)) + { +#if UNITY_5 || UNITY_5_3_OR_NEWER + Application.logMessageReceivedThreaded -= HandleUnityLog; +#else + Application.RegisterLogCallback(null); +#endif + } + } + + public virtual void OnDestroy() + { + _isApplicationPlaying = false; + } + + /// + /// Logs are cached and written in bursts + /// BeginUploadLog is called at the begining of each burst + /// + protected abstract void BeginUploadLog(); + /// + /// Logs are cached and written in bursts + /// UploadLog is called for each cached log, between BeginUploadLog and EndUploadLog + /// + protected abstract void UploadLog(string message); + /// + /// Logs are cached and written in bursts + /// EndUploadLog is called at the end of each burst + /// + protected abstract void EndUploadLog(); + + /// + /// Handler to process Unity logs into our logging system + /// + /// + /// + /// + private void HandleUnityLog(string message, string stacktrace, LogType type) + { + if (!PlayFabSettings.EnableRealTimeLogging) + return; + + Sb.Length = 0; + if (type == LogType.Log || type == LogType.Warning) + { + Sb.Append(type).Append(": ").Append(message); + message = Sb.ToString(); + lock (LogMessageQueue) + { + LogMessageQueue.Enqueue(message); + } + } + else if (type == LogType.Error || type == LogType.Exception) + { + Sb.Append(type).Append(": ").Append(message).Append("\n").Append(stacktrace).Append(StackTraceUtility.ExtractStackTrace()); + message = Sb.ToString(); + lock (LogMessageQueue) + { + LogMessageQueue.Enqueue(message); + } + } + ActivateThreadWorker(); + } + + private void ActivateThreadWorker() + { + lock (_threadLock) + { + if (_writeLogThread != null) + { + return; + } + _writeLogThread = new Thread(WriteLogThreadWorker); + _writeLogThread.Start(); + } + } + + private void WriteLogThreadWorker() + { + try + { + bool active; + lock (_threadLock) + { + // Kill the thread after 1 minute of inactivity + _threadKillTime = DateTime.UtcNow + _threadKillTimeout; + } + + var localLogQueue = new Queue(); + do + { + lock (LogMessageQueue) + { + _pendingLogsCount = LogMessageQueue.Count; + while (LogMessageQueue.Count > 0) // Transfer the messages to the local queue + localLogQueue.Enqueue(LogMessageQueue.Dequeue()); + } + + BeginUploadLog(); + while (localLogQueue.Count > 0) // Transfer the messages to the local queue + UploadLog(localLogQueue.Dequeue()); + EndUploadLog(); + + #region Expire Thread. + // Check if we've been inactive + lock (_threadLock) + { + var now = DateTime.UtcNow; + if (_pendingLogsCount > 0 && _isApplicationPlaying) + { + // Still active, reset the _threadKillTime + _threadKillTime = now + _threadKillTimeout; + } + // Kill the thread after 1 minute of inactivity + active = now <= _threadKillTime; + if (!active) + { + _writeLogThread = null; + } + // This thread will be stopped, so null this now, inside lock (_threadLock) + } + #endregion + + Thread.Sleep(LOG_CACHE_INTERVAL_MS); + } while (active); + + } + catch (Exception e) + { + Debug.LogException(e); + _writeLogThread = null; + } + } + } +#else + public interface IPlayFabLogger + { + string ip { get; set; } + int port { get; set; } + string url { get; set; } + + // Unity MonoBehaviour callbacks + void OnEnable(); + void OnDisable(); + void OnDestroy(); + } + + /// + /// This is just a placeholder. WP8 doesn't support direct threading, but instead makes you use the await command. + /// + public abstract class PlayFabLoggerBase : IPlayFabLogger + { + public string ip { get; set; } + public int port { get; set; } + public string url { get; set; } + + // Unity MonoBehaviour callbacks + public void OnEnable() { } + public void OnDisable() { } + public void OnDestroy() { } + + protected abstract void BeginUploadLog(); + protected abstract void UploadLog(string message); + protected abstract void EndUploadLog(); + } +#endif + + /// + /// This translates the logs up to the PlayFab service via a PlayFab restful API + /// TODO: PLAYFAB - attach these to the PlayFab API + /// + public class PlayFabLogger : PlayFabLoggerBase + { + /// + /// Logs are cached and written in bursts + /// BeginUploadLog is called at the begining of each burst + /// + protected override void BeginUploadLog() + { + } + /// + /// Logs are cached and written in bursts + /// UploadLog is called for each cached log, between BeginUploadLog and EndUploadLog + /// + protected override void UploadLog(string message) + { + } + /// + /// Logs are cached and written in bursts + /// EndUploadLog is called at the end of each burst + /// + protected override void EndUploadLog() + { + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta new file mode 100644 index 00000000..18ec9f00 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabLogger.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 65702fe1cdebb8e4783afb157a614161 +timeCreated: 1465847308 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs new file mode 100644 index 00000000..ca44f50f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs @@ -0,0 +1,222 @@ +using PlayFab.Internal; +using System; +using System.Collections.Generic; +using System.Text; +using UnityEngine; + +namespace PlayFab +{ + public enum WebRequestType + { +#if !UNITY_2018_2_OR_NEWER // Unity has deprecated Www + UnityWww, // High compatability Unity api calls +#endif + UnityWebRequest, // Modern unity HTTP component + HttpWebRequest, // High performance multi-threaded api calls + CustomHttp //If this is used, you must set the Http to an IPlayFabHttp object. + } + + [Flags] + public enum PlayFabLogLevel + { + None = 0, + Debug = 1 << 0, + Info = 1 << 1, + Warning = 1 << 2, + Error = 1 << 3, + All = Debug | Info | Warning | Error, + } + + public static class PlayFabSettings + { + static PlayFabSettings() { } + + private static PlayFabSharedSettings _playFabShared = null; + private static PlayFabSharedSettings PlayFabSharedPrivate { get { if (_playFabShared == null) _playFabShared = GetSharedSettingsObjectPrivate(); return _playFabShared; } } + + /// + /// Global settings used by all static API classes, and as the default for all instance API classes + /// + public static readonly PlayFabApiSettings staticSettings = new PlayFabSettingsRedirect(() => { return PlayFabSharedPrivate; }); + /// + /// Global user for all static API classes + /// + public static readonly PlayFabAuthenticationContext staticPlayer = new PlayFabAuthenticationContext(); + + public const string SdkVersion = "2.166.230512"; + public const string BuildIdentifier = "adobuild_unitysdk_167"; + public const string VersionString = "UnitySDK-2.166.230512"; + + public const string DefaultPlayFabApiUrl = "playfabapi.com"; + + private static PlayFabSharedSettings GetSharedSettingsObjectPrivate() + { + var settingsList = Resources.LoadAll("PlayFabSharedSettings"); + if (settingsList.Length != 1) + { + Debug.LogWarning("The number of PlayFabSharedSettings objects should be 1: " + settingsList.Length); + Debug.LogWarning("If you are upgrading your SDK, you can ignore this warning as PlayFabSharedSettings will be imported soon. If you are not upgrading your SDK and you see this message, you should re-download the latest PlayFab source code."); + } + return settingsList[0]; + } + + public static string DeviceUniqueIdentifier + { + get + { + var deviceId = ""; +#if UNITY_ANDROID && !UNITY_EDITOR + AndroidJavaClass up = new AndroidJavaClass ("com.unity3d.player.UnityPlayer"); + AndroidJavaObject currentActivity = up.GetStatic ("currentActivity"); + AndroidJavaObject contentResolver = currentActivity.Call ("getContentResolver"); + AndroidJavaClass secure = new AndroidJavaClass ("android.provider.Settings$Secure"); + deviceId = secure.CallStatic ("getString", contentResolver, "android_id"); +#else + deviceId = SystemInfo.deviceUniqueIdentifier; +#endif + return deviceId; + } + } + + /// + /// These are variables which can differ from one PlayFab API Instance to another + /// + #region staticSettings Redirects + // You must set this value for PlayFabSdk to work properly (Found in the Game Manager for your title, at the PlayFab Website) + public static string TitleId { get { return staticSettings.TitleId; } set { staticSettings.TitleId = value; } } + + /// The name of a customer vertical. This is only for customers running a private cluster. Generally you shouldn't touch this + internal static string VerticalName { get { return staticSettings.VerticalName; } set { staticSettings.VerticalName = value; } } +#if ENABLE_PLAYFABSERVER_API || ENABLE_PLAYFABADMIN_API || UNITY_EDITOR || ENABLE_PLAYFAB_SECRETKEY + public static string DeveloperSecretKey { get { return staticSettings.DeveloperSecretKey; } set { staticSettings.DeveloperSecretKey = value; } } +#endif + /// Set this to true to prevent hardware information from leaving the device + public static bool DisableDeviceInfo { get { return staticSettings.DisableDeviceInfo; } set { staticSettings.DisableDeviceInfo = value; } } + /// Set this to true to prevent focus change information from leaving the device + public static bool DisableFocusTimeCollection { get { return staticSettings.DisableFocusTimeCollection; } set { staticSettings.DisableFocusTimeCollection = value; } } + #endregion staticSettings Redirects + + /// + /// These are variables which are always singleton global + /// + #region PlayFabSharedSettings Redirects + [ObsoleteAttribute("LogLevel has been deprecated, please use UnityEngine.Debug.Log for your logging needs.")] + public static PlayFabLogLevel LogLevel { get { return PlayFabSharedPrivate.LogLevel; } set { PlayFabSharedPrivate.LogLevel = value; } } + public static WebRequestType RequestType { get { return PlayFabSharedPrivate.RequestType; } set { PlayFabSharedPrivate.RequestType = value; } } + public static int RequestTimeout { get { return PlayFabSharedPrivate.RequestTimeout; } set { PlayFabSharedPrivate.RequestTimeout = value; } } + public static bool RequestKeepAlive { get { return PlayFabSharedPrivate.RequestKeepAlive; } set { PlayFabSharedPrivate.RequestKeepAlive = value; } } + public static string LoggerHost { get { return PlayFabSharedPrivate.LoggerHost; } set { PlayFabSharedPrivate.LoggerHost = value; } } + public static int LoggerPort { get { return PlayFabSharedPrivate.LoggerPort; } set { PlayFabSharedPrivate.LoggerPort = value; } } + public static bool EnableRealTimeLogging { get { return PlayFabSharedPrivate.EnableRealTimeLogging; } set { PlayFabSharedPrivate.EnableRealTimeLogging = value; } } + public static int LogCapLimit { get { return PlayFabSharedPrivate.LogCapLimit; } set { PlayFabSharedPrivate.LogCapLimit = value; } } + #endregion PlayFabSharedSettings Redirects + + private static string _localApiServer; + public static string LocalApiServer + { + get + { +#if UNITY_2017_1_OR_NEWER + return _localApiServer ?? PlayFabUtil.GetLocalSettingsFileProperty("LocalApiServer"); +#else + return _localApiServer; +#endif + } + + set + { + _localApiServer = value; + } + } + + [ThreadStatic] + private static StringBuilder _cachedStringBuilder; + + private static StringBuilder AcquireStringBuilder() + { + if (_cachedStringBuilder == null) + { + _cachedStringBuilder = new StringBuilder(1000); + } + + _cachedStringBuilder.Clear(); + return _cachedStringBuilder; + } + + public static string GetFullUrl(string apiCall, Dictionary getParams, PlayFabApiSettings apiSettings = null) + { + StringBuilder sb = AcquireStringBuilder(); + + string productionEnvironmentUrl = null, verticalName = null, titleId = null; + + if (apiSettings != null) + { + + if (!string.IsNullOrEmpty(apiSettings.ProductionEnvironmentUrl)) + { + productionEnvironmentUrl = apiSettings.ProductionEnvironmentUrl; + } + if (!string.IsNullOrEmpty(apiSettings.VerticalName)) + { + verticalName = apiSettings.VerticalName; + } + if (!string.IsNullOrEmpty(apiSettings.TitleId)) + { + titleId = apiSettings.TitleId; + } + + } + + + + if (productionEnvironmentUrl == null) + { + productionEnvironmentUrl = !string.IsNullOrEmpty(PlayFabSharedPrivate.ProductionEnvironmentUrl) ? PlayFabSharedPrivate.ProductionEnvironmentUrl : DefaultPlayFabApiUrl; + } + if (verticalName == null && apiSettings != null && !string.IsNullOrEmpty(apiSettings.VerticalName)) + { + verticalName = apiSettings.VerticalName; + } + if (titleId == null) + { + titleId = PlayFabSharedPrivate.TitleId; + } + + var baseUrl = productionEnvironmentUrl; + if (!baseUrl.StartsWith("http")) + { + sb.Append("https://"); + if (!string.IsNullOrEmpty(titleId)) + { + sb.Append(titleId).Append("."); + } + if (!string.IsNullOrEmpty(verticalName)) + { + sb.Append(verticalName).Append("."); + } + } + + sb.Append(baseUrl).Append(apiCall); + + if (getParams != null) + { + bool firstParam = true; + foreach (var paramPair in getParams) + { + if (firstParam) + { + sb.Append("?"); + firstParam = false; + } + else + { + sb.Append("&"); + } + sb.Append(paramPair.Key).Append("=").Append(paramPair.Value); + } + } + + return sb.ToString(); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta new file mode 100644 index 00000000..96dbc65f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PlayFabSettings.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: aa223f24327e645d39b48f0ca9615e68 +timeCreated: 1462682372 +licenseType: Pro +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs new file mode 100644 index 00000000..f961c82b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs @@ -0,0 +1,8 @@ +namespace PlayFab +{ + public enum PluginContract + { + PlayFab_Serializer, + PlayFab_Transport + } +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta new file mode 100644 index 00000000..db1d69db --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContract.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2e25ec8533eb4fe4fa7d39cc8dcda24c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs new file mode 100644 index 00000000..70e2892e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs @@ -0,0 +1,23 @@ +using System.Collections.Generic; + +namespace PlayFab +{ + public struct PluginContractKey + { + public PluginContract _pluginContract; + public string _pluginName; + } + + public class PluginContractKeyComparator : EqualityComparer + { + public override bool Equals(PluginContractKey x, PluginContractKey y) + { + return x._pluginContract == y._pluginContract && x._pluginName.Equals(y._pluginName); + } + + public override int GetHashCode(PluginContractKey obj) + { + return (int)obj._pluginContract + obj._pluginName.GetHashCode(); + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta new file mode 100644 index 00000000..7b4f3419 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginContractKey.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c74eb9de26e70e7489002fb92b96af0f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs new file mode 100644 index 00000000..94ba346b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Concurrent; +using PlayFab.Internal; + +namespace PlayFab +{ + public class PluginManager + { + private ConcurrentDictionary plugins = new ConcurrentDictionary(new PluginContractKeyComparator()); + + /// + /// The singleton instance of plugin manager. + /// + private static readonly PluginManager Instance = new PluginManager(); + + private PluginManager() + { + } + + /// + /// Gets a plugin. + /// If a plugin with specified contract and optional instance name does not exist, it will create a new one. + /// + /// The plugin contract. + /// The optional plugin instance name. Instance names allow to have mulptiple plugins with the same contract. + /// The plugin instance. + public static T GetPlugin(PluginContract contract, string instanceName = "") where T : IPlayFabPlugin + { + return (T)Instance.GetPluginInternal(contract, instanceName); + } + + /// + /// Sets a custom plugin. + /// If a plugin with specified contract and optional instance name already exists, it will be replaced with specified instance. + /// + /// The plugin instance. + /// The app contract of plugin. + /// The optional plugin instance name. Instance names allow to have mulptiple plugins with the same contract. + public static void SetPlugin(IPlayFabPlugin plugin, PluginContract contract, string instanceName = "") + { + Instance.SetPluginInternal(plugin, contract, instanceName); + } + + private IPlayFabPlugin GetPluginInternal(PluginContract contract, string instanceName) + { + var key = new PluginContractKey { _pluginContract = contract, _pluginName = instanceName }; + IPlayFabPlugin plugin; + if (!this.plugins.TryGetValue(key, out plugin)) + { + // Requested plugin is not in the cache, create the default one + switch (contract) + { + case PluginContract.PlayFab_Serializer: + plugin = this.CreatePlugin(); + break; + case PluginContract.PlayFab_Transport: + plugin = this.CreatePlayFabTransportPlugin(); + break; + default: + throw new ArgumentException("This contract is not supported", "contract"); + } + + this.plugins[key] = plugin; + } + + return plugin; + } + + private void SetPluginInternal(IPlayFabPlugin plugin, PluginContract contract, string instanceName) + { + if (plugin == null) + { + throw new ArgumentNullException("plugin", "Plugin instance cannot be null"); + } + + var key = new PluginContractKey { _pluginContract = contract, _pluginName = instanceName }; + this.plugins[key] = plugin; + } + + private IPlayFabPlugin CreatePlugin() where T : IPlayFabPlugin, new() + { + return (IPlayFabPlugin)System.Activator.CreateInstance(typeof(T)); + } + + private ITransportPlugin CreatePlayFabTransportPlugin() + { + ITransportPlugin transport = null; +#if !UNITY_WSA && !UNITY_WP8 + if (PlayFabSettings.RequestType == WebRequestType.HttpWebRequest) + transport = new PlayFabWebRequest(); +#endif + +#if UNITY_2018_2_OR_NEWER // PlayFabWww will throw warnings as Unity has deprecated Www + if (transport == null) + transport = new PlayFabUnityHttp(); +#elif UNITY_2017_2_OR_NEWER + if (PlayFabSettings.RequestType == WebRequestType.UnityWww) + transport = new PlayFabWww(); + + if (transport == null) + transport = new PlayFabUnityHttp(); +#else + if (transport == null) + transport = new PlayFabWww(); +#endif + + return transport; + } + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta new file mode 100644 index 00000000..3a175b54 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/PluginManager.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 408cd48212db9ae46b9100b1d3fef3b1 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources.meta new file mode 100644 index 00000000..ae16aefd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: c770a70afd8f88f40bb0f25e3b0dbb55 +folderAsset: yes +timeCreated: 1468086149 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset new file mode 100644 index 00000000..8c72054b --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset @@ -0,0 +1,27 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 093286084a3d1994a9c28281a1c38b1d, type: 3} + m_Name: PlayFabSharedSettings + m_EditorClassIdentifier: + TitleId: A7570 + DeveloperSecretKey: 9Q7OA61M3QQEDDU76BZMT566KZBOS8W1TQNEY66NAGJGUNTXCM + ProductionEnvironmentUrl: + RequestType: 2 + DisableDeviceInfo: 0 + DisableFocusTimeCollection: 0 + RequestTimeout: 2000 + RequestKeepAlive: 1 + LogLevel: 12 + LoggerHost: + LoggerPort: 0 + EnableRealTimeLogging: 0 + LogCapLimit: 30 diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset.meta new file mode 100644 index 00000000..9c2c024f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/Shared/Public/Resources/PlayFabSharedSettings.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 698b2db098268c640929a7b8090a31eb +timeCreated: 1532637394 +licenseType: Pro +NativeFormatImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml new file mode 100644 index 00000000..765c16cf --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml.meta b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml.meta new file mode 100644 index 00000000..cd55d60f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/PlayFabSDK/link.xml.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dc2c3070dc174cc45a4aaf1a5e38263d +timeCreated: 1468524880 +licenseType: Pro +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/Resources.meta b/Samples/Unity/PlayFabEconomyV2/Assets/Resources.meta new file mode 100644 index 00000000..bd7edb15 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 517d219f35d7f9646bd1977f5ca3f2ec +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json b/Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json new file mode 100644 index 00000000..6f4bfb71 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json @@ -0,0 +1 @@ +{"androidStore":"GooglePlay"} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json.meta b/Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json.meta new file mode 100644 index 00000000..42d7d024 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/Resources/BillingMode.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b70aa03f49beb2944ae7df3b9195c1ee +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/Scenes.meta b/Samples/Unity/PlayFabEconomyV2/Assets/Scenes.meta new file mode 100644 index 00000000..7fe8e109 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/Scenes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 131a6b21c8605f84396be9f6751fb6e3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity b/Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity new file mode 100644 index 00000000..1d42427c --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity @@ -0,0 +1,253 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 0 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 500 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 500 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 2 + m_PVRDenoiserTypeDirect: 0 + m_PVRDenoiserTypeIndirect: 0 + m_PVRDenoiserTypeAO: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 0 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &519420028 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 519420032} + - component: {fileID: 519420031} + - component: {fileID: 519420029} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &519420029 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 +--- !u!20 &519420031 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 1 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 0 + m_HDR: 1 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &519420032 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 519420028} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1335145315 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1335145318} + - component: {fileID: 1335145317} + m_Layer: 0 + m_Name: Code + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1335145317 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1335145315} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0a84ea2cc254a5b4ab57e898fb31f9ea, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!4 &1335145318 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1335145315} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} diff --git a/Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity.meta b/Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity.meta new file mode 100644 index 00000000..c1e3c88e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Assets/Scenes/SampleScene.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2cda990e2423bbf4892e6590ba056729 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Samples/Unity/PlayFabEconomyV2/Logs/shadercompiler-UnityShaderCompiler.exe0.log b/Samples/Unity/PlayFabEconomyV2/Logs/shadercompiler-UnityShaderCompiler.exe0.log new file mode 100644 index 00000000..92180495 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/Logs/shadercompiler-UnityShaderCompiler.exe0.log @@ -0,0 +1,3 @@ +Base path: 'C:/Program Files/Unity/Hub/Editor/2021.3.26f1/Editor/Data', plugins path 'C:/Program Files/Unity/Hub/Editor/2021.3.26f1/Editor/Data/PlaybackEngines' +Cmd: initializeCompiler + diff --git a/Samples/Unity/PlayFabEconomyV2/PlayFabEconomyV2Sample_BurstDebugInformation_DoNotShip/tempburstlibs/arm64-v8a/lib_burst_generated.txt b/Samples/Unity/PlayFabEconomyV2/PlayFabEconomyV2Sample_BurstDebugInformation_DoNotShip/tempburstlibs/arm64-v8a/lib_burst_generated.txt new file mode 100644 index 00000000..e102cc9a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/PlayFabEconomyV2Sample_BurstDebugInformation_DoNotShip/tempburstlibs/arm64-v8a/lib_burst_generated.txt @@ -0,0 +1,182 @@ +Library: lib_burst_generated +--platform=Android +--backend=burst-llvm-11 +--target=ARMV8A_AARCH64 +--global-safety-checks-setting=Off +--dump=Function +--float-precision=Standard +--disable-warnings=BC1370 +--compilation-defines=UNITY_2021_3_26 +--compilation-defines=UNITY_2021_3 +--compilation-defines=UNITY_2021 +--compilation-defines=UNITY_5_3_OR_NEWER +--compilation-defines=UNITY_5_4_OR_NEWER +--compilation-defines=UNITY_5_5_OR_NEWER +--compilation-defines=UNITY_5_6_OR_NEWER +--compilation-defines=UNITY_2017_1_OR_NEWER +--compilation-defines=UNITY_2017_2_OR_NEWER +--compilation-defines=UNITY_2017_3_OR_NEWER +--compilation-defines=UNITY_2017_4_OR_NEWER +--compilation-defines=UNITY_2018_1_OR_NEWER +--compilation-defines=UNITY_2018_2_OR_NEWER +--compilation-defines=UNITY_2018_3_OR_NEWER +--compilation-defines=UNITY_2018_4_OR_NEWER +--compilation-defines=UNITY_2019_1_OR_NEWER +--compilation-defines=UNITY_2019_2_OR_NEWER +--compilation-defines=UNITY_2019_3_OR_NEWER +--compilation-defines=UNITY_2019_4_OR_NEWER +--compilation-defines=UNITY_2020_1_OR_NEWER +--compilation-defines=UNITY_2020_2_OR_NEWER +--compilation-defines=UNITY_2020_3_OR_NEWER +--compilation-defines=UNITY_2021_1_OR_NEWER +--compilation-defines=UNITY_2021_2_OR_NEWER +--compilation-defines=UNITY_2021_3_OR_NEWER +--compilation-defines=ENABLE_AR +--compilation-defines=ENABLE_AUDIO +--compilation-defines=ENABLE_CACHING +--compilation-defines=ENABLE_CLOTH +--compilation-defines=ENABLE_EVENT_QUEUE +--compilation-defines=ENABLE_MICROPHONE +--compilation-defines=ENABLE_MULTIPLE_DISPLAYS +--compilation-defines=ENABLE_PHYSICS +--compilation-defines=ENABLE_TEXTURE_STREAMING +--compilation-defines=ENABLE_UNET +--compilation-defines=ENABLE_LZMA +--compilation-defines=ENABLE_UNITYEVENTS +--compilation-defines=ENABLE_VR +--compilation-defines=ENABLE_WEBCAM +--compilation-defines=ENABLE_UNITYWEBREQUEST +--compilation-defines=ENABLE_WWW +--compilation-defines=ENABLE_CLOUD_SERVICES +--compilation-defines=ENABLE_CLOUD_SERVICES_COLLAB +--compilation-defines=ENABLE_CLOUD_SERVICES_COLLAB_SOFTLOCKS +--compilation-defines=ENABLE_CLOUD_SERVICES_ADS +--compilation-defines=ENABLE_CLOUD_SERVICES_USE_WEBREQUEST +--compilation-defines=ENABLE_CLOUD_SERVICES_CRASH_REPORTING +--compilation-defines=ENABLE_CLOUD_SERVICES_NATIVE_CRASH_REPORTING +--compilation-defines=ENABLE_CLOUD_SERVICES_PURCHASING +--compilation-defines=ENABLE_CLOUD_SERVICES_ANALYTICS +--compilation-defines=ENABLE_CLOUD_SERVICES_UNET +--compilation-defines=ENABLE_CLOUD_SERVICES_BUILD +--compilation-defines=ENABLE_CLOUD_LICENSE +--compilation-defines=ENABLE_EDITOR_HUB_LICENSE +--compilation-defines=ENABLE_WEBSOCKET_CLIENT +--compilation-defines=ENABLE_DIRECTOR_AUDIO +--compilation-defines=ENABLE_DIRECTOR_TEXTURE +--compilation-defines=ENABLE_MANAGED_JOBS +--compilation-defines=ENABLE_MANAGED_TRANSFORM_JOBS +--compilation-defines=ENABLE_MANAGED_ANIMATION_JOBS +--compilation-defines=ENABLE_MANAGED_AUDIO_JOBS +--compilation-defines=ENABLE_RUNTIME_PERMISSIONS +--compilation-defines=ENABLE_ENGINE_CODE_STRIPPING +--compilation-defines=ENABLE_ONSCREEN_KEYBOARD +--compilation-defines=ENABLE_MANAGED_UNITYTLS +--compilation-defines=INCLUDE_DYNAMIC_GI +--compilation-defines=ENABLE_SCRIPTING_GC_WBARRIERS +--compilation-defines=PLATFORM_SUPPORTS_MONO +--compilation-defines=ENABLE_VIDEO +--compilation-defines=ENABLE_ACCELERATOR_CLIENT_DEBUGGING +--compilation-defines=PLATFORM_ANDROID +--compilation-defines=TEXTCORE_1_0_OR_NEWER +--compilation-defines=UNITY_ANDROID +--compilation-defines=UNITY_ANDROID_API +--compilation-defines=ENABLE_EGL +--compilation-defines=ENABLE_NETWORK +--compilation-defines=ENABLE_RUNTIME_GI +--compilation-defines=ENABLE_CRUNCH_TEXTURE_COMPRESSION +--compilation-defines=UNITY_CAN_SHOW_SPLASH_SCREEN +--compilation-defines=UNITY_HAS_GOOGLEVR +--compilation-defines=UNITY_HAS_TANGO +--compilation-defines=ENABLE_SPATIALTRACKING +--compilation-defines=ENABLE_ETC_COMPRESSION +--compilation-defines=PLATFORM_EXTENDS_VULKAN_DEVICE +--compilation-defines=PLATFORM_HAS_MULTIPLE_SWAPCHAINS +--compilation-defines=UNITY_ANDROID_SUPPORTS_SHADOWFILES +--compilation-defines=PLATFORM_UPDATES_TIME_OUTSIDE_OF_PLAYER_LOOP +--compilation-defines=ENABLE_UNITYADS_RUNTIME +--compilation-defines=UNITY_UNITYADS_API +--compilation-defines=ENABLE_MONO +--compilation-defines=NET_STANDARD_2_0 +--compilation-defines=NET_STANDARD +--compilation-defines=NET_STANDARD_2_1 +--compilation-defines=NETSTANDARD +--compilation-defines=NETSTANDARD2_1 +--compilation-defines=DEVELOPMENT_BUILD +--compilation-defines=ENABLE_PROFILER +--compilation-defines=DEBUG +--compilation-defines=TRACE +--compilation-defines=UNITY_ASSERTIONS +--compilation-defines=UNITY_PRO_LICENSE +--compilation-defines=ENABLE_CUSTOM_RENDER_TEXTURE +--compilation-defines=ENABLE_DIRECTOR +--compilation-defines=ENABLE_LOCALIZATION +--compilation-defines=ENABLE_SPRITES +--compilation-defines=ENABLE_TERRAIN +--compilation-defines=ENABLE_TILEMAP +--compilation-defines=ENABLE_TIMELINE +--compilation-defines=ENABLE_LEGACY_INPUT_MANAGER +--compilation-defines=TEXTCORE_FONT_ENGINE_1_5_OR_NEWER +--compilation-defines=CSHARP_7_OR_LATER +--compilation-defines=CSHARP_7_3_OR_NEWER +--compilation-defines=MODULE_AI_EXISTS +--compilation-defines=MODULE_ANIMATION_EXISTS +--compilation-defines=MODULE_PHYSICS_EXISTS +--compilation-defines=MODULE_PHYSICS_2D_EXISTS +--compilation-defines=MODULE_PARTICLE_SYSTEM_EXISTS +--compilation-defines=PACKAGE_PHYSICS +--compilation-defines=PACKAGE_PHYSICS2D +--compilation-defines=PACKAGE_TILEMAP +--compilation-defines=PACKAGE_ANIMATION +--compilation-defines=PACKAGE_UITOOLKIT +--compilation-defines=ENABLE_ANIMATION_BURST +--compilation-defines=TIMELINE_FRAMEACCURATE +--compilation-defines=ENABLE_SPRITESHAPE_BURST +--generate-link-xml=Temp\burst.link.xml +--debug=Full +--output=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\tempburstlibs\arm64-v8a\lib_burst_generated +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.Stores.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.VisualScripting.Flow.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Mathematics.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.UI.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Telemetry.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.VisualScripting.State.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.VisualScripting.Core.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\PlayFab.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.WinRTCore.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.AppleCore.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Environments.Internal.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Burst.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.2D.Animation.Runtime.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.TextMeshPro.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Timeline.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.Security.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Environments.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Internal.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Analytics.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.2D.SpriteShape.Runtime.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Scheduler.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Purchasing.Common.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Registration.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.2D.PixelPerfect.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.2D.Common.Runtime.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.2D.IK.Runtime.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Device.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.SecurityCore.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.WinRTStub.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Threading.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.2D.Tilemap.Extras.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Networking.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.AppleMacosStub.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.Codeless.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.InternalAPIEngineBridge.001.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Unity.Services.Core.Configuration.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\Assembly-CSharp.dll +--root-assembly=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\UnityEngine.Purchasing.AppleStub.dll +--assembly-folder=C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2\Temp\StagingArea\Data\Managed\ +--pdb-search-paths=Temp/ManagedSymbols/ +--method=Unity.Burst.BurstCompiler+BurstCompilerHelper, Unity.Burst, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::IsBurstEnabled()--8c2be93e18276203cbd918daa2748a10 +--method=UnityEngine.U2D.Animation.BurstedSpriteSkinUtilities, Unity.2D.Animation.Runtime, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::ValidateBoneWeights(Unity.Collections.NativeSlice`1[[UnityEngine.BoneWeight, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)--5bf0a813706ef9287fcaa55dd0ccb876 +--method=Unity.Jobs.IJobExtensions+JobStruct`1[[UnityEngine.U2D.SpriteShapeGenerator, Unity.2D.SpriteShape.Runtime, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]], UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null::Execute(UnityEngine.U2D.SpriteShapeGenerator&, Unity.2D.SpriteShape.Runtime, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|System.IntPtr, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089|Unity.Jobs.LowLevel.Unsafe.JobRanges&, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null|System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089)--a185c62eba2497c95197140e5282b27a + diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/AudioManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/AudioManager.asset new file mode 100644 index 00000000..27287fec --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/BurstAotSettings_Android.json b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/BurstAotSettings_Android.json new file mode 100644 index 00000000..771d37b7 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/BurstAotSettings_Android.json @@ -0,0 +1,14 @@ +{ + "MonoBehaviour": { + "Version": 4, + "EnableBurstCompilation": true, + "EnableOptimisations": true, + "EnableSafetyChecks": false, + "EnableDebugInAllBuilds": false, + "CpuMinTargetX32": 0, + "CpuMaxTargetX32": 0, + "CpuMinTargetX64": 0, + "CpuMaxTargetX64": 0, + "OptimizeFor": 0 + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ClusterInputManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 00000000..e7886b26 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/CommonBurstAotSettings.json b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/CommonBurstAotSettings.json new file mode 100644 index 00000000..0293dafc --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/CommonBurstAotSettings.json @@ -0,0 +1,6 @@ +{ + "MonoBehaviour": { + "Version": 4, + "DisabledWarnings": "" + } +} diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/DynamicsManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/DynamicsManager.asset new file mode 100644 index 00000000..72d14303 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,37 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_DefaultMaxDepenetrationVelocity: 10 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0.1 + m_ClothInterCollisionStiffness: 0.2 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ClothGravity: {x: 0, y: -9.81, z: 0} + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_SolverType: 0 + m_DefaultMaxAngularSpeed: 50 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorBuildSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 00000000..82ab0f59 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,11 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Scenes/SampleScene.unity + guid: 2cda990e2423bbf4892e6590ba056729 + m_configObjects: {} diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorSettings.asset new file mode 100644 index 00000000..fa3ed494 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/EditorSettings.asset @@ -0,0 +1,40 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 1 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 4 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp + m_ProjectGenerationRootNamespace: + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_CachingShaderPreprocessor: 1 + m_PrefabModeAllowAutoSave: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_GameObjectNamingDigits: 1 + m_GameObjectNamingScheme: 0 + m_AssetNamingUsesSpace: 1 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 + m_DisableCookiesInLightmapper: 1 + m_AssetPipelineMode: 1 + m_CacheServerMode: 0 + m_CacheServerEndpoint: + m_CacheServerNamespacePrefix: default + m_CacheServerEnableDownload: 1 + m_CacheServerEnableUpload: 1 + m_CacheServerEnableAuth: 0 + m_CacheServerEnableTls: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/GraphicsSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 00000000..c165afb2 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,64 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_VideoShadersIncludeMode: 2 + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_DefaultRenderingLayerMask: 1 + m_LogWhenShaderIsCompiled: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/InputManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/InputManager.asset new file mode 100644 index 00000000..b16147e9 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/InputManager.asset @@ -0,0 +1,487 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: joystick button 8 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Enable Debug Button 2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: backspace + altNegativeButton: + altPositiveButton: joystick button 9 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Reset + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Next + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page down + altNegativeButton: + altPositiveButton: joystick button 5 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Previous + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: page up + altNegativeButton: + altPositiveButton: joystick button 4 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Validate + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Persistent + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: right shift + altNegativeButton: + altPositiveButton: joystick button 2 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Multiplier + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: joystick button 3 + gravity: 0 + dead: 0 + sensitivity: 0 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 6 + joyNum: 0 + - serializedVersion: 3 + m_Name: Debug Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 2 + axis: 5 + joyNum: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/MemorySettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/MemorySettings.asset new file mode 100644 index 00000000..5b5facec --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/NavMeshAreas.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 00000000..ad2654e0 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,93 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/NetworkManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/NetworkManager.asset new file mode 100644 index 00000000..5dc6a831 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/NetworkManager.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!149 &1 +NetworkManager: + m_ObjectHideFlags: 0 + m_DebugLevel: 0 + m_Sendrate: 15 + m_AssetToPrefab: {} diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/PackageManagerSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 00000000..b3a65dda --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,44 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_EnablePackageDependencies: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.com + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_ErrorMessage: + m_Original: + m_Id: + m_Name: + m_Url: + m_Scopes: [] + m_IsDefault: 0 + m_Capabilities: 0 + m_Modified: 0 + m_Name: + m_Url: + m_Scopes: + - + m_SelectedScopeIndex: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/Physics2DSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 00000000..6cfcddaa --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_SimulationMode: 0 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/PresetManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/PresetManager.asset new file mode 100644 index 00000000..67a94dae --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectSettings.asset new file mode 100644 index 00000000..aacd4f33 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,789 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 24 + productGUID: a51f2d62240d6ad4796d0b76de1db0ea + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: SPI Skylab + productName: PlayFabEconomyV2Sample + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + iosAllowHTTPDownload: 1 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 1 + androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 0 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 0 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 1048576 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 0 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + m_SupportedAspectRatios: + 4:3: 1 + 5:4: 1 + 16:10: 1 + 16:9: 1 + Others: 1 + bundleVersion: 0.0.1 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + useHDRDisplay: 0 + D3DHDRBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: + Android: com.spiskylab.playfabeconomyv2unityiap + Standalone: com.DefaultCompany.2DProject + buildNumber: + Standalone: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 1 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 33 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 1 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 12.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 12.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: 10ad67313f4034357812315f3c407484 + templatePackageId: com.unity.template.2d@6.1.2 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 2 + AndroidTargetDevices: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: C:/Users/derekreese/.android/upload.keystore + AndroidKeyaliasName: upload + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 1 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidMinifyWithR8: 0 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: + - m_BuildTarget: Android + m_Icons: + - m_Textures: [] + m_Width: 432 + m_Height: 432 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 324 + m_Height: 324 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 216 + m_Height: 216 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 162 + m_Height: 162 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 108 + m_Height: 108 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 81 + m_Height: 81 + m_Kind: 2 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 1 + m_SubKind: + - m_Textures: [] + m_Width: 192 + m_Height: 192 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 144 + m_Height: 144 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 96 + m_Height: 96 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 72 + m_Height: 72 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 48 + m_Height: 48 + m_Kind: 0 + m_SubKind: + - m_Textures: [] + m_Width: 36 + m_Height: 36 + m_Kind: 0 + m_SubKind: + m_BuildTargetBatching: [] + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 0 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 0 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 0 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 0 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: [] + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 1 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + m_BuildTargetVRSettings: [] + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: [] + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetNormalMapEncoding: [] + m_BuildTargetDefaultTextureCompressionFormat: + - m_BuildTarget: Android + m_Format: 3 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchUseGOLDLinker: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchPlayerConnectionEnabled: 1 + switchUseNewStyleFilepaths: 0 + switchUseLegacyFmodPriorities: 1 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 2 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: bi9UOuSpM2Tlh01vOzwvSikHFswuzleh + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 2 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 32 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 0 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLPowerPreference: 2 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: + Android: 1 + il2cppCompilerConfiguration: {} + managedStrippingLevel: + EmbeddedLinux: 1 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Lumin: 1 + Nintendo Switch: 1 + PS4: 1 + PS5: 1 + Stadia: 1 + WebGL: 1 + Windows Store Apps: 1 + XboxOne: 1 + iPhone: 1 + tvOS: 1 + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + enableRoslynAnalyzers: 1 + selectedPlatform: 2 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + assemblyVersionValidation: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: 2D_BuiltInRenderer + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: 2D_BuiltInRenderer + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: + Build: 0 + Collab: 0 + Game Performance: 0 + Purchasing: 1 + UDP: 0 + Unity Ads: 0 + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + apiCompatibilityLevel: 3 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 + cloudProjectId: b4c7ebec-4e19-4f37-9316-b7460c826436 + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: PlayFabEconomyV2 + organizationId: derekreesemicrosoft + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + playerDataPath: + forceSRGBBlit: 1 + virtualTexturingSupportEnabled: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectVersion.txt b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectVersion.txt new file mode 100644 index 00000000..77ebdac1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2021.3.26f1 +m_EditorVersionWithRevision: 2021.3.26f1 (a16dc32e0ff2) diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/QualitySettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/QualitySettings.asset new file mode 100644 index 00000000..c23e52d6 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/QualitySettings.asset @@ -0,0 +1,225 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + skinWeights: 255 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + customRenderPipeline: {fileID: 0} + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: {} diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/SceneTemplateSettings.json b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/SceneTemplateSettings.json new file mode 100644 index 00000000..6f3e60fd --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/SceneTemplateSettings.json @@ -0,0 +1,167 @@ +{ + "templatePinStates": [], + "dependencyTypeInfos": [ + { + "userAdded": false, + "type": "UnityEngine.AnimationClip", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Animations.AnimatorController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.AnimatorOverrideController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.Audio.AudioMixerController", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ComputeShader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Cubemap", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.GameObject", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.LightingDataAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.LightingSettings", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Material", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.MonoScript", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicMaterial", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.PhysicsMaterial2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Rendering.VolumeProfile", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEditor.SceneAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": false + }, + { + "userAdded": false, + "type": "UnityEngine.Shader", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.ShaderVariantCollection", + "ignore": true, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Texture2D", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + }, + { + "userAdded": false, + "type": "UnityEngine.Timeline.TimelineAsset", + "ignore": false, + "defaultInstantiationMode": 0, + "supportsModification": true + } + ], + "defaultDependencyTypeInfo": { + "userAdded": false, + "type": "", + "ignore": false, + "defaultInstantiationMode": 1, + "supportsModification": true + }, + "newSceneOverride": 0 +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TagManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TagManager.asset new file mode 100644 index 00000000..1c92a784 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimeManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimeManager.asset new file mode 100644 index 00000000..558a017e --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimelineSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimelineSettings.asset new file mode 100644 index 00000000..cfaebd7a --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/TimelineSettings.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a287be6c49135cd4f9b2b8666c39d999, type: 3} + m_Name: + m_EditorClassIdentifier: + assetDefaultFramerate: 60 + m_DefaultFrameRate: 60 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/UnityConnectSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 00000000..b32825c1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 1 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity3d.com + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 1 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 0 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/VFXManager.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/VFXManager.asset new file mode 100644 index 00000000..46f38e16 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/VFXManager.asset @@ -0,0 +1,14 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 + m_CompiledVersion: 0 + m_RuntimeVersion: 0 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/VersionControlSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 00000000..dca28814 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/XRSettings.asset b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/XRSettings.asset new file mode 100644 index 00000000..482590c1 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file diff --git a/Samples/Unity/PlayFabEconomyV2/ProjectSettings/boot.config b/Samples/Unity/PlayFabEconomyV2/ProjectSettings/boot.config new file mode 100644 index 00000000..e69de29b diff --git a/Samples/Unity/PlayFabEconomyV2/UserSettings/EditorUserSettings.asset b/Samples/Unity/PlayFabEconomyV2/UserSettings/EditorUserSettings.asset new file mode 100644 index 00000000..d1857b5f --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/UserSettings/EditorUserSettings.asset @@ -0,0 +1,28 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!162 &1 +EditorUserSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_ConfigSettings: + RecentlyUsedSceneGuid-0: + value: 515250075c0c595e5f5a5e71122159444e4e4a2f7a7d7f602f284d66b4b76661 + flags: 0 + vcSharedLogLevel: + value: 0d5e400f0650 + flags: 0 + m_VCAutomaticAdd: 1 + m_VCDebugCom: 0 + m_VCDebugCmd: 0 + m_VCDebugOut: 0 + m_SemanticMergeMode: 2 + m_DesiredImportWorkerCount: 2 + m_StandbyImportWorkerCount: 2 + m_IdleImportWorkerShutdownDelay: 60000 + m_VCShowFailedCheckout: 1 + m_VCOverwriteFailedCheckoutAssets: 1 + m_VCProjectOverlayIcons: 1 + m_VCHierarchyOverlayIcons: 1 + m_VCOtherOverlayIcons: 1 + m_VCAllowAsyncUpdate: 1 + m_ArtifactGarbageCollection: 1 diff --git a/Samples/Unity/PlayFabEconomyV2/UserSettings/Layouts/default-2021.dwlt b/Samples/Unity/PlayFabEconomyV2/UserSettings/Layouts/default-2021.dwlt new file mode 100644 index 00000000..cf89aee4 --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/UserSettings/Layouts/default-2021.dwlt @@ -0,0 +1,1062 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12004, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PixelRect: + serializedVersion: 2 + x: 0 + y: 42 + width: 1620 + height: 990 + m_ShowMode: 4 + m_Title: Hierarchy + m_RootView: {fileID: 6} + m_MinSize: {x: 875, y: 300} + m_MaxSize: {x: 10000, y: 10000} + m_Maximized: 1 +--- !u!114 &2 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 9} + - {fileID: 3} + m_Position: + serializedVersion: 2 + x: 0 + y: 30 + width: 1620 + height: 940 + m_MinSize: {x: 300, y: 200} + m_MaxSize: {x: 24288, y: 16192} + vertical: 0 + controlID: 19 +--- !u!114 &3 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: ServicesEditorWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 1236.5 + y: 0 + width: 383.5 + height: 940 + m_MinSize: {x: 301, y: 171} + m_MaxSize: {x: 4001, y: 4021} + m_ActualView: {fileID: 12} + m_Panes: + - {fileID: 15} + - {fileID: 12} + m_Selected: 1 + m_LastSelected: 0 +--- !u!114 &4 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: SceneHierarchyWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 306 + height: 557 + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_ActualView: {fileID: 16} + m_Panes: + - {fileID: 16} + - {fileID: 13} + m_Selected: 0 + m_LastSelected: 1 +--- !u!114 &5 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: ConsoleWindow + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 557 + width: 1236.5 + height: 383 + m_MinSize: {x: 101, y: 121} + m_MaxSize: {x: 4001, y: 4021} + m_ActualView: {fileID: 19} + m_Panes: + - {fileID: 14} + - {fileID: 19} + m_Selected: 1 + m_LastSelected: 0 +--- !u!114 &6 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12008, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 7} + - {fileID: 2} + - {fileID: 8} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1620 + height: 990 + m_MinSize: {x: 875, y: 300} + m_MaxSize: {x: 10000, y: 10000} + m_UseTopView: 1 + m_TopViewHeight: 30 + m_UseBottomView: 1 + m_BottomViewHeight: 20 +--- !u!114 &7 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12011, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1620 + height: 30 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} + m_LastLoadedLayoutName: +--- !u!114 &8 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12042, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 0 + y: 970 + width: 1620 + height: 20 + m_MinSize: {x: 0, y: 0} + m_MaxSize: {x: 0, y: 0} +--- !u!114 &9 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 10} + - {fileID: 5} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1236.5 + height: 940 + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 16192, y: 16192} + vertical: 1 + controlID: 59 +--- !u!114 &10 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12010, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_Children: + - {fileID: 4} + - {fileID: 11} + m_Position: + serializedVersion: 2 + x: 0 + y: 0 + width: 1236.5 + height: 557 + m_MinSize: {x: 200, y: 100} + m_MaxSize: {x: 16192, y: 8096} + vertical: 0 + controlID: 60 +--- !u!114 &11 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0} + m_Name: GameView + m_EditorClassIdentifier: + m_Children: [] + m_Position: + serializedVersion: 2 + x: 306 + y: 0 + width: 930.5 + height: 557 + m_MinSize: {x: 202, y: 221} + m_MaxSize: {x: 4002, y: 4021} + m_ActualView: {fileID: 18} + m_Panes: + - {fileID: 17} + - {fileID: 18} + m_Selected: 1 + m_LastSelected: 0 +--- !u!114 &12 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 12402, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 300, y: 150} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Services + m_Image: {fileID: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 1236.5 + y: 72 + width: 382.5 + height: 919 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 +--- !u!114 &13 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1c7b3fb0903da7c48a812037b700de8b, type: 3} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 320, y: 0} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: PlayFab EdEx + m_Image: {fileID: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 72 + width: 305 + height: 536 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 +--- !u!114 &14 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12014, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 230, y: 250} + m_MaxSize: {x: 10000, y: 10000} + m_TitleContent: + m_Text: Project + m_Image: {fileID: -5179483145760003458, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 629 + width: 1235.5 + height: 362 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_SearchFilter: + m_NameFilter: + m_ClassNames: [] + m_AssetLabels: [] + m_AssetBundleNames: [] + m_VersionControlStates: [] + m_SoftLockControlStates: [] + m_ReferencingInstanceIDs: + m_SceneHandles: + m_ShowAllHits: 0 + m_SkipHidden: 0 + m_SearchArea: 1 + m_Folders: + - Assets + m_Globs: [] + m_OriginalText: + m_ViewMode: 1 + m_StartGridSize: 64 + m_LastFolders: + - Assets + m_LastFoldersGridSize: -1 + m_LastProjectPath: C:\Users\derekreese\Source\PlayFab-Samples\Samples\Unity\PlayFabEconomyV2 + m_LockTracker: + m_IsLocked: 0 + m_FolderTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: 7c630000 + m_LastClickedID: 25468 + m_ExpandedIDs: 000000007c630000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 0} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_AssetTreeState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: + m_LastClickedID: 0 + m_ExpandedIDs: 000000007c630000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 0} + m_SearchString: + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_ListAreaState: + m_SelectedInstanceIDs: 8c540000 + m_LastClickedInstanceID: 21644 + m_HadKeyboardFocusLastEvent: 1 + m_ExpandedInstanceIDs: c6230000 + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 1 + m_ClientGUIView: {fileID: 11} + m_CreateAssetUtility: + m_EndAction: {fileID: 0} + m_InstanceID: 0 + m_Path: + m_Icon: {fileID: 0} + m_ResourceFile: + m_NewAssetIndexInList: -1 + m_ScrollPosition: {x: 0, y: 0} + m_GridSize: 64 + m_SkipHiddenPackages: 0 + m_DirectoriesAreaWidth: 207 +--- !u!114 &15 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12019, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 275, y: 50} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Inspector + m_Image: {fileID: -440750813802333266, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 1237 + y: 72 + width: 382 + height: 919 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_ObjectsLockedBeforeSerialization: [] + m_InstanceIDsLockedBeforeSerialization: + m_PreviewResizer: + m_CachedPref: 160 + m_ControlHash: -371814159 + m_PrefName: Preview_InspectorPreview + m_LastInspectedObjectInstanceID: -1 + m_LastVerticalScrollValue: 0 + m_GlobalObjectId: + m_InspectorMode: 0 + m_LockTracker: + m_IsLocked: 0 + m_PreviewWindow: {fileID: 0} +--- !u!114 &16 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12061, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Hierarchy + m_Image: {fileID: -3734745235275155857, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 72 + width: 305 + height: 536 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_SceneHierarchy: + m_TreeViewState: + scrollPos: {x: 0, y: 0} + m_SelectedIDs: + m_LastClickedID: 0 + m_ExpandedIDs: 24fbffff + m_RenameOverlay: + m_UserAcceptedRename: 0 + m_Name: + m_OriginalName: + m_EditFieldRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 0 + height: 0 + m_UserData: 0 + m_IsWaitingForDelay: 0 + m_IsRenaming: 0 + m_OriginalEventType: 11 + m_IsRenamingFilename: 0 + m_ClientGUIView: {fileID: 4} + m_SearchString: + m_ExpandedScenes: [] + m_CurrenRootInstanceID: 0 + m_LockTracker: + m_IsLocked: 0 + m_CurrentSortingName: TransformSorting + m_WindowGUID: 4c969a2b90040154d917609493e03593 +--- !u!114 &17 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12013, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Scene + m_Image: {fileID: 8634526014445323508, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 306 + y: 72 + width: 928.5 + height: 536 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: + - dockPosition: 0 + containerId: overlay-toolbar__top + floating: 0 + collapsed: 0 + displayed: 1 + snapOffset: {x: -101, y: -26} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 3 + id: Tool Settings + index: 0 + layout: 1 + - dockPosition: 0 + containerId: overlay-toolbar__top + floating: 0 + collapsed: 0 + displayed: 1 + snapOffset: {x: -141, y: 149} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 1 + id: unity-grid-and-snap-toolbar + index: 1 + layout: 1 + - dockPosition: 1 + containerId: overlay-toolbar__top + floating: 0 + collapsed: 0 + displayed: 1 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: unity-scene-view-toolbar + index: 0 + layout: 1 + - dockPosition: 1 + containerId: overlay-toolbar__top + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 1 + id: unity-search-toolbar + index: 1 + layout: 1 + - dockPosition: 0 + containerId: overlay-container--left + floating: 0 + collapsed: 0 + displayed: 1 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: unity-transform-toolbar + index: 0 + layout: 2 + - dockPosition: 0 + containerId: overlay-container--left + floating: 0 + collapsed: 0 + displayed: 1 + snapOffset: {x: 0, y: 197} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: unity-component-tools + index: 1 + layout: 2 + - dockPosition: 0 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 1 + snapOffset: {x: 67.5, y: 86} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Orientation + index: 0 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Light Settings + index: 0 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Camera + index: 1 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Cloth Constraints + index: 2 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Cloth Collisions + index: 3 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Navmesh Display + index: 4 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Agent Display + index: 5 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Obstacle Display + index: 6 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Occlusion Culling + index: 7 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Physics Debugger + index: 8 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Scene Visibility + index: 9 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Particles + index: 10 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Tilemap + index: 11 + layout: 4 + - dockPosition: 1 + containerId: overlay-container--right + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Tilemap Palette Helper + index: 12 + layout: 4 + - dockPosition: 1 + containerId: overlay-toolbar__top + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Open Tile Palette + index: 2 + layout: 4 + - dockPosition: 1 + containerId: overlay-toolbar__top + floating: 0 + collapsed: 0 + displayed: 0 + snapOffset: {x: 0, y: 0} + snapOffsetDelta: {x: 0, y: 0} + snapCorner: 0 + id: Scene View/Tilemap Focus + index: 3 + layout: 4 + m_OverlaysVisible: 1 + m_WindowGUID: cc27987af1a868c49b0894db9c0f5429 + m_Gizmos: 1 + m_OverrideSceneCullingMask: 6917529027641081856 + m_SceneIsLit: 1 + m_SceneLighting: 1 + m_2DMode: 1 + m_isRotationLocked: 0 + m_PlayAudio: 0 + m_AudioPlay: 0 + m_Position: + m_Target: {x: 0, y: 0, z: 0} + speed: 2 + m_Value: {x: 0, y: 0, z: 0} + m_RenderMode: 0 + m_CameraMode: + drawMode: 0 + name: Shaded + section: Shading Mode + m_ValidateTrueMetals: 0 + m_DoValidateTrueMetals: 0 + m_ExposureSliderValue: 0 + m_SceneViewState: + m_AlwaysRefresh: 0 + showFog: 1 + showSkybox: 1 + showFlares: 1 + showImageEffects: 1 + showParticleSystems: 1 + showVisualEffectGraphs: 1 + m_FxEnabled: 1 + m_Grid: + xGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 0 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 0, y: 0} + yGrid: + m_Fade: + m_Target: 0 + speed: 2 + m_Value: 0 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 1, y: 1} + zGrid: + m_Fade: + m_Target: 1 + speed: 2 + m_Value: 1 + m_Color: {r: 0.5, g: 0.5, b: 0.5, a: 0.4} + m_Pivot: {x: 0, y: 0, z: 0} + m_Size: {x: 1, y: 1} + m_ShowGrid: 1 + m_GridAxis: 1 + m_gridOpacity: 0.5 + m_Rotation: + m_Target: {x: 0, y: 0, z: 0, w: 1} + speed: 2 + m_Value: {x: 0, y: 0, z: 0, w: 1} + m_Size: + m_Target: 10 + speed: 2 + m_Value: 10 + m_Ortho: + m_Target: 1 + speed: 2 + m_Value: 1 + m_CameraSettings: + m_Speed: 1 + m_SpeedNormalized: 0.5 + m_SpeedMin: 0.001 + m_SpeedMax: 2 + m_EasingEnabled: 1 + m_EasingDuration: 0.4 + m_AccelerationEnabled: 1 + m_FieldOfViewHorizontalOrVertical: 60 + m_NearClip: 0.03 + m_FarClip: 10000 + m_DynamicClip: 1 + m_OcclusionCulling: 0 + m_LastSceneViewRotation: {x: -0.08717229, y: 0.89959055, z: -0.21045254, w: -0.3726226} + m_LastSceneViewOrtho: 0 + m_ReplacementShader: {fileID: 0} + m_ReplacementString: + m_SceneVisActive: 1 + m_LastLockedObject: {fileID: 0} + m_ViewIsLockedToObject: 0 +--- !u!114 &18 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12015, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 200, y: 200} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Game + m_Image: {fileID: 4621777727084837110, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 306 + y: 72 + width: 928.5 + height: 536 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 + m_SerializedViewNames: [] + m_SerializedViewValues: [] + m_PlayModeViewName: GameView + m_ShowGizmos: 0 + m_TargetDisplay: 0 + m_ClearColor: {r: 0, g: 0, b: 0, a: 0} + m_TargetSize: {x: 1857, y: 1030} + m_TextureFilterMode: 0 + m_TextureHideFlags: 61 + m_RenderIMGUI: 1 + m_EnterPlayModeBehavior: 0 + m_UseMipMap: 0 + m_VSyncEnabled: 0 + m_Gizmos: 0 + m_Stats: 0 + m_SelectedSizes: 00000000000000000000000000000000000000000000000000000000000000000000000000000000 + m_ZoomArea: + m_HRangeLocked: 0 + m_VRangeLocked: 0 + hZoomLockedByDefault: 0 + vZoomLockedByDefault: 0 + m_HBaseRangeMin: -464.25 + m_HBaseRangeMax: 464.25 + m_VBaseRangeMin: -257.5 + m_VBaseRangeMax: 257.5 + m_HAllowExceedBaseRangeMin: 1 + m_HAllowExceedBaseRangeMax: 1 + m_VAllowExceedBaseRangeMin: 1 + m_VAllowExceedBaseRangeMax: 1 + m_ScaleWithWindow: 0 + m_HSlider: 0 + m_VSlider: 0 + m_IgnoreScrollWheelUntilClicked: 0 + m_EnableMouseInput: 1 + m_EnableSliderZoomHorizontal: 0 + m_EnableSliderZoomVertical: 0 + m_UniformScale: 1 + m_UpDirection: 1 + m_DrawArea: + serializedVersion: 2 + x: 0 + y: 21 + width: 928.5 + height: 515 + m_Scale: {x: 1, y: 1} + m_Translation: {x: 464.25, y: 257.5} + m_MarginLeft: 0 + m_MarginRight: 0 + m_MarginTop: 0 + m_MarginBottom: 0 + m_LastShownAreaInsideMargins: + serializedVersion: 2 + x: -464.25 + y: -257.5 + width: 928.5 + height: 515 + m_MinimalGUI: 1 + m_defaultScale: 1 + m_LastWindowPixelSize: {x: 1857, y: 1072} + m_ClearInEditMode: 1 + m_NoCameraWarning: 1 + m_LowResolutionForAspectRatios: 01000000000000000000 + m_XRRenderMode: 0 + m_RenderTexture: {fileID: 0} +--- !u!114 &19 +MonoBehaviour: + m_ObjectHideFlags: 52 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12003, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_MinSize: {x: 100, y: 100} + m_MaxSize: {x: 4000, y: 4000} + m_TitleContent: + m_Text: Console + m_Image: {fileID: -4950941429401207979, guid: 0000000000000000d000000000000000, type: 0} + m_Tooltip: + m_Pos: + serializedVersion: 2 + x: 0 + y: 629 + width: 1235.5 + height: 362 + m_ViewDataDictionary: {fileID: 0} + m_OverlayCanvas: + m_LastAppliedPresetName: Default + m_SaveData: [] + m_OverlaysVisible: 1 diff --git a/Samples/Unity/PlayFabEconomyV2/UserSettings/Search.settings b/Samples/Unity/PlayFabEconomyV2/UserSettings/Search.settings new file mode 100644 index 00000000..9e26dfee --- /dev/null +++ b/Samples/Unity/PlayFabEconomyV2/UserSettings/Search.settings @@ -0,0 +1 @@ +{} \ No newline at end of file

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%0A&fhv>|{B;9KW=HJQW&nTBV|2s!f0t4P8G&k}L{6 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