Pragma Engine 0.0.94

July 2023

Contents #

Summaries | Summarized release notes.

Full Notes | Full notes including descriptions and additional details.

Notes about this release:

  • We recommend using an older version of the README while we update our current version.
  • This release includes a large SDK migration. The SDK V2 migration guide is in Google Drive. Contact your Pragma support representative if you need access to this file or if you need support while upgrading.
  • You can optionally take the release in parts to make integrations easier by completing the following steps:
    1. Complete Unreal Phase 1 SDK V2 instructions.
    2. Upgrade to 0.0.94 and complete release notes.
    3. Complete Unreal Phase 2 SDK V2 instructions.

Summaries #

Features #

  • [Multiplayer] Added a new OnGameStart event to the Pragma SDK to communicate when a game is allocated. | full note
  • [Multiplayer] Added new Matchmaking and Match Lifecycle payloads and build functions to simplify matchmaking management.| full note
  • [Player Data] You can now access ext and inventory related data in a more clear and organized way in the new GameDataService.GetLoginDataV3 endpoint.| full note
  • [Player Data] You can now utilize login data in the default login data job InventoryGetLoginDataV2DependentJob. | full note
  • [Player Data] InstancedItemPluginResult now has a clearer and more organized structure for inventory modifications via the new InventoryModifications data class. | full note
  • [Player Data] You can now chain additional inventory operations during item deletion using the Instanced Item Plugin. | full note
  • [Player Data] You can now implement a Stackable Item Plugin. | full note
  • [Player Data] The Provider Entitlement feature now supports PlayStation 4. | full note
  • [Accounts] You can now permanently delete Pragma Social accounts. | full note
  • [Accounts] Added a new Account Plugin that allows for manipulating account data for the account lifecycle. | full note
  • [Infra & Tooling] You can now add custom routes to the platform. | full note
  • [Portal] New Rewards page now available. | full note
  • [Portal] Custom components can now be added to the top navigation bar. | full note
  • [Portal] Added support for multiple types of portlets. | full note

Deprecations #

  • [SDKs] sdk | If you’re using Unreal, rename RegisterService and GetService to RegisterApi and Api. | full note

Integrations #

  • [Multiplayer] platform, sdk | Follow the provided integration guide to update your multiplayer services. | full note
  • [Multiplayer] platform | If you use the SkeletonMatchLauncher.kt, StartProcessCommandStrategy.kt, or NoOpCommandStrategy.kt files, reach out to Pragma to migrate off them. | full note
  • [Player Data] sdk | Replace any references to GetLoginData with GetLoginDataV3. | full note
  • [Player Data] platform | Update any usages of the InventoryLoginData class by removing the inventoryData property. | full note
  • [Player Data] platform | Replace any uses of GetLoginDataServiceV1 with GetLoginDataServiceV2. | full note
  • [Player Data] platform | If you use the Instanced Item Plugin, update the InstancedItemPluginResult to reflect changes made with the new InventoryModifications data class. | full note
  • [Player Data] platform | If you use the Crafting Plugin, replace the CraftResult data class with InventoryModifications. | full note
  • [Player Data] platform | Replace usages of the InventoryOperationsPlugin.InventoryOperations data class with InventoryModifications. | full note
  • [Infra & Tooling] platform | If your 4-demo module is not automatically removed, manually delete it and remove all dependent references. | full note
  • [Infra & Tooling] other | Update your IntelliJ version to 2023.1.2. | full note
  • [Infra & Tooling] config | Revert version 0.0.93 updates to the PartnerClientConfig. | full note
  • [Infra & Tooling] config | Add the configuration file integrationtest.yml so you can customize integration tests without affecting your local development configuration. | full note
  • [SDKs] sdk | Follow the provided integration guide to update to SDK V2. | full note
  • [Portal] config, platform | Update Portal configurations to reflect their relocation to a routePlugins collection, and migrate any custom Portal Plugin to be a Route Plugin. | full note

Bugs and Fixes #

  • [SDKs] Unreal: Fields in DTOs with types int64, uint64, and double are no longer exposed to Blueprints to prevent compilation errors.
  • [Relase Note] The release notes launched during the 0.0.94 release did not include the order that pom files must be imported during IntelliJ setup. For a revised and improved ReadMe, see Pragma Engine ReadMe (0.0.94) or any future release notes.

Docs #

  • [New Concepts] Added a new page on the Account Plugin.
  • [Updated Concepts] Updated the Configuration customization page to contain information about priority, dynamic configuration, and using Homebase API to encrypt and decrypt secret configuration values.
  • [Updated Concepts] Renamed the concept of “Game Flow” to “Multiplayer” to better communicate the features and reflect industry standards.
  • [Updated Concepts] Added information about account deletion to the Account Data page.
  • [Updated Concepts] Added information about onDelete to the Instanced Items page.
  • [Updated Concepts] Updated the Instanced Items page to reflect changes to Instanced Item Plugin.
  • [Updated Concepts] Updated the Crafting page to reflect changes to the Crafting Plugin.
  • [Updated Concepts] Added information about the Stackable Item Plugin to the Stackable Items page.
  • [Updated Concepts] Added introductory information to the Custom Services Overview page.
  • [Updated Internal Guide] Updated the PlayStation Provider Entitlements doc with new information.
  • [Updated API Reference] Updated the structure of the Configuration Options page to be more readable and fixed broken links.
  • [Updated API Reference] Added Homebase API reference.
  • [New Tech Blog Article] The article How We Load Test Pragma Engine is now live! Learn about our load testing philosophy, how we emulate player behavior, and how we deploy a Pragma Engine platform shard.

Full Notes #

Features #

[Multiplayer] Added a new OnGameStart event to the Pragma SDK to communicate when a game is allocated. #

Description: When a game is allocated to a game server, the [MatchApi.OnGameStart] event will be triggered. See the Game Server Events section in the Match Lifecycle concepts page for more information.

Related notes See integration note on upgrading multiplayer.

[Multiplayer] Added new Matchmaking and Match Lifecycle payloads and build functions to simplify matchmaking management. #

Description: To simplify and clarify how to use Matchmaking and Match Lifecycle features, we’ve defined the following new ext payloads and build functions. You can read more on the Matchmaking and Match Lifecycle concepts pages.

  • ExtGamePlayer
  • ExtGameStart
  • ExtGameServerPlayer
  • ExtGameInstance
  • ExtMatchmakingGameInstance
  • ExtMatchmakingPlayer
  • setExtGamePlayer
  • buildExtGameStart
  • buildExtGameServerPlayer
  • buildExtMatchmakingGameInstance
  • buildExtMatchmakingPlayer

Related notes See integration note on upgrading multiplayer.

Description: GameDataService.GetLoginData has been replaced with GameDataService.GetLoginDataV3. The new GetLoginDataV3 no longer includes a full inventory response and has reorganized ext and inventory response paths. GetLoginDataV3Response has a new LoginDataV3 field which contains two fields for Ext and Inventorydata. All limited grant tracking IDs and inventory content catalogs are under the InventoryData field in GetLoginDataV3Response.

Related notes: See integration note on replacing and updating usages of GameDataService.GetLoginDataV2 with GameDataService.GetLoginDataV3.

[Player Data] You can now utilize login data in the default login data job InventoryGetLoginDataV2DependentJob. #

Description: The new InventoryService.GetLoginDataServiceV2 is now requested when InventoryGetLoginDataV2DependentJob runs. Note that the new InventoryService.GetLoginDataServiceV2 does not contain a property for the player’s full inventory and you’ll need to use InventoryRpc.getInventoryServiceV3 if you need to access a player’s full inventory.

Related notes: See integration note on replacing InventoryRpc.GetLoginDataServiceV1 with InventoryRpc.GetLoginDataServiceV2.

[Player Data] InstancedItemPluginResult now has a clearer and more organized structure for inventory modifications via the new InventoryModifications data class. #

Description: To make the Instanced Item Plugin more consistent with other Inventory service plugins, all inventory modifications are now wrapped in a data class called InventoryModifications in the InstancedItemPluginResult. The fields for additional item grants and updates have also been moved into this data class. See the updated Instanced Item concepts page for more information on InventoryModifications.

Related notes: See integration note on updating your InstancedItemPluginResult with the new changes.

[Player Data] You can now chain additional inventory operations during item deletion using the Instanced Item Plugin. #

Description: The Instanced Item Plugin has a new method: onDelete(). See the updated Instanced Item concepts page for details.

[Player Data] You can now implement a Stackable Item Plugin. #

Description: Custom logic can be added to the Stackable Item Plugin’s onUpdate() method. This method is called each time a stackable item is granted or updated. In addition, this plugin can be used to chain additional inventory operations when a stackable item is updated. See the updated Stackable Item concepts page for details.

[Player Data] The Provider Entitlement feature now supports PlayStation 4. #

Description: Contact your Pragma Engine support representative for further details.

[Accounts] You can now permanently delete Pragma Social accounts. #

Description: We’ve added the following Operator, Partner, and Service endpoints, which will delete social identities, links to third party accounts and all accompanying PII, and related pragmaPlayerIds. Note that this process is irreversible. See the Account Data concepts page for more information.

The following endpoints are available for account deletion:

  • AccountRpc.DeleteAccountOperatorV1Request
  • AccountRpc.DeleteAccountPartnerV1Request
  • AccountRpc.DeleteAccountServiceV1Request

[Accounts] Added a new Account Plugin that allows for manipulating account data for the account lifecycle. #

Description: The new Account Plugin can be used to write custom code for account creation, updates, deletions and login. All functions use the PragmaAccount object to manipulate data. You can read more on the Account Plugin page.

[Infra & Tooling] You can now add custom routes to the platform. #

Description: You can add custom URL endpoints to the platform by implementing the Route Plugin interface and adding configuration to the GatewayNodeModules. This is currently being used by Portal, and can be expanded to support a variety of additional routing options.

Example:

  • Config:
game:
 pluginConfigs:
    GameOperatorGatewayNodeService.routePlugins:
      plugins:
        CustomRoute:
          class: "demo.account.CustomRoutePlugin"
          config:
            anyString: "example"
            anyBoolean: true
        Demo:
          class: "demo.account.DemoRoutePlugin"
          config:
            customValueString: "demo"

[Player Data] New Rewards page now available. #

Description: A new Rewards page has been added with Create/Edit/View pages for each type of reward, new tables, validation for save/remove/submit actions, and UX updates such as autocomplete, toasts and alerts, and a navigation system.

[Player Data] Custom components can now be added to the top navigation bar. #

Description: You can now add custom components to the top navigation bar.

Details: There are three ways to add dynamic components to the navbar:

  • Using extensions with the new navbarComponents option to add components that are always visible across the app.
  • Using the addNavbarComponent Portlet Builder API to add a component every time a page of that portlet is shown.
  • Using the addNavbarComponent Page Builder API on a page to add a component when that specific page is open.

Example:

  • The Content Changes dropdown with the Publish button in the Content Catalogs Editor is now a custom component added in the ContentCatalogsEditor.js definition.

[Player Data] Added support for multiple types of portlets. #

Description: We now support 3 types of portlet:

  • service: the most common type which appears under the Services menu.
  • standalone: supports standalone sections of the Portal, added to the top navbar
  • tool: for tools such as the Development Tools portlet

Deprecations #

[SDKs] sdk | If you’re using Unreal, rename RegisterService and GetService to RegisterApi and Api. #

Description: The following methods have been renamed as part of renaming “Service” to “Api” within the SDKs.

  • Update all uses of the following method in Pragma::FRuntime, Pragma::FPlayer, and Pragma::FServer:

    originalreplacementremoval release
    Session->RegisterService<UMyService>()Session->RegisterApi<UMyService>()0.0.95
  • Update all uses of the following method in Pragma::FPlayer and Pragma::FServer:

    originalreplacementremoval release
    Session->GetService<UMyService>()Session->Api<UMyService>()0.0.95

Integrations #

[Multiplayer] platform, sdk | Follow the provided integration guide to update your multiplayer services. #

Description: Upgrading multiplayer functionality to version 0.0.94 involves many tasks, including:

  • Updating the matchmakingExt.proto and matchlifecycleExt.proto files
  • Implementing set and build methods for the new exts
  • Updating Matchmaking object references
  • Updating initialize, buildMatch, and endOfLoop methods
  • Replacing ActiveMatch with MatchmakingGameInstance
  • Adding OnGameStart and OnGameStartFailed methods
  • Replacing addParty, setTeamByPlayer, moveAllPartiesFrom, and movePartiesFrom methods

Integration step:

  • Specific tasks for completing the integration can be found in the Multiplayer 0.0.94 Integration Guide on Google Drive. Contact Pragma if you need access to the Drive link.

[Multiplayer] platform | If you use the SkeletonMatchLauncher.kt, StartProcessCommandStrategy.kt, or NoOpCommandStrategy.kt files, reach out to Pragma to migrate off them. #

Description: We removed the following files related to an example Capacity Provider Plugin implementation called SkeletonCapacityProvider from the 2-pragma folder:

  • SkeletonMatchLauncher.kt
  • StartProcessCommandStrategy.kt
  • NoOpCommandStrategy.kt

Integration step:

  • If you use these files, please reach out to Pragma to let us know why and how you were using these files and we will help you migrate off them.

[Player Data] sdk | Replace any references to GetLoginData with GetLoginDataV3. #

Description: GameDataService.GetLoginDataV2 has been removed and replaced with GameDataService.GetLoginDataV3. GameDataService.GetLoginDataV3 does not include the full inventory data result in the endpoint and now has a reorganized response. If you’re requesting limited grants via the GetLoginDataV3Response, you can find issued limited grant tracking IDs and inventory content catalogs under the InventoryData field and all other ext data under Ext.

Integration steps:

  • sdk | Update calls that reference GameDataService.GetLoginDataV2 to use GameDataService.GetLoginDataV3.
  • sdk | Update all paths to inventory related response data.
    • In GetLoginDataV3Response, the new LoginDataV3 has two fields: Ext and InventoryData. Note that Pragma Engine sends an InventoryUpdatedV1Notification with this call.
      originalreplacement
      Ext DataResult.Get().Payload().Ext()
      Inventory Data (Limited Grants)Result.Get().Payload().InventoryData.IssuedLimitedGrantTrackingIds
      Inventory ContentResult.Get().Payload().InventoryData.InventoryContent.<CONTENT-CATALOG>

      // Content Catalogs:
      ItemCatalog (includes InstancedEntries and StackableEntries)
      CraftingEntries
      Stores
      UpdateEntries
      ItemBundles
      ProviderEntitlements
    • For inventory changes resulting from limited grants, use InventoryService.GetInventory and the Inventory service OnInventoryUpdated event to keep UI in sync with latest inventory changes.

Related notes: See feature note on the new GameDataService.GetLoginDataV3 endpoint.

[Player Data] platform | Update any usages of the InventoryLoginData class by removing the inventoryData property. #

Description The data class InventoryLoginData no longer contains the inventoryData: InventoryData property. This data class is accessed via the LoginDataBuilder often used in getLoginDataJobsV3.

Integration step:

  • platform | Remove the inventoryData: InventoryData property from any uses of the InventoryLoginData class.

    • Before:
    data class InventoryLoginData(
    var inventoryData: InventoryData = InventoryData(listOf(), listOf(), 0),
    var itemCatalog: ItemCatalog = ItemCatalog(listOf(), listOf()),
    var stores: List<AnnotatedStore> = listOf(),
    var updateEntries: List<UpdateEntryWrapper> = listOf(),
    var craftingEntries: List<CraftingEntryWrapper> = listOf(),
    var newLimitedGrantIds: List<String> = listOf(),
    var itemBundles: List<ItemBundle> = listOf(),
    var providerEntitlements: List<InventoryContent.ProviderEntitlement> = listOf()
    )
    
    • After:
    data class InventoryLoginData(
    var itemCatalog: ItemCatalog = ItemCatalog(listOf(), listOf()),
    var stores: List<AnnotatedStore> = listOf(),
    var updateEntries: List<UpdateEntryWrapper> = listOf(),
    var craftingEntries: List<CraftingEntryWrapper> = listOf(),
    var newLimitedGrantIds: List<String> = listOf(),
    var itemBundles: List<ItemBundle> = listOf(),
    var providerEntitlements: List<InventoryContent.ProviderEntitlement> = listOf()
    )
    

[Player Data] platform | Replace any uses of GetLoginDataServiceV1 with GetLoginDataServiceV2. #

Description: InventoryService.GetLoginDataServiceV1 has been deprecated and replaced by InventoryService.GetLoginDataServiceV2. The new InventoryService.GetLoginDataServiceV2 does not contain a property for the player’s full inventory; if you need to access a player’s full inventory use InventoryRpc.getInventoryServiceV3.

Integration step:

  • platform Replace any uses of InventoryService.GetLoginDataServiceV1 with InventoryService.GetLoginDataServiceV2.
originalreplacement
GetLoginDataServiceV1GetLoginDataServiceV2

Related notes: See feature note on InventoryRpc.GetLoginDataServiceV2.

[Player Data] platform | If you use the Instanced Item Plugin, update the InstancedItemPluginResult to reflect changes made with the new InventoryModifications data class. #

Description: The fields for additional item grants, updates, and other inventory modifications in the InstancedItemPluginResult have been moved into a data class called InventoryModifications. See the updated Instanced Item concepts page for more information on InventoryModifications.

Integration steps:

  • platform | Update any construction of the InstancedItemPluginResult by replacing the following parameters with the InventoryModifications data class.

    • Before:
    data class InstancedItemPluginResult(
      val extInstancedItem: ExtInstancedItem?,
      val rewardGrants: List<RewardGrant> = listOf(),
      val instancedItemServerGrants: List<InstancedItemServerGrant> = listOf(),
      val stackableItemGrants: List<StackableItemGrant> = listOf(),
      val serverInstancedItemUpdates: List<ServerInstancedItemUpdate> = listOf(),
      val instancedItemsToDestroy: List<InstanceId> = listOf()
    )
    
    • After:
    data class InstancedItemPluginResult(
        val extInstancedItem: ExtInstancedItem?,
        val InventoryModifications: InventoryModifications = InventoryModifications()
    )
    
    data class InventoryModifications(
      val rewardGrants: List<RewardGrant> = listOf(),
      val instancedItemServerGrants: List<InstancedItemServerGrant> = listOf(),
      val stackableItemGrants: List<StackableItemGrant> = listOf(),
      val serverInstancedItemUpdates: List<ServerInstancedItemUpdate> = listOf(),
      val instancedItemsToDestroy: List<InstanceId> = listOf()
    )
    
  • Migrate all prior inventory modifications into the new InventoryModifications data class.

Related notes: See feature note on the restructured InstancedItemPluginResult.

[Player Data] platform | If you use the Crafting Plugin, replace the CraftResult data class with InventoryModifications. #

Description: To improve consistency across Inventory service plugins, we are introducing the new data class InventoryModifications. This data class contains all inventory modifications that can be chained from a plugin. See the Crafting concepts page for more information.

Integration step:

  • platform | Replace CraftResult with InventoryModifications.
    originalreplacement
    CraftResultInventoryModifications

[Player Data] platform | Replace usages of the InventoryOperationsPlugin.InventoryOperations data class with InventoryModifications. #

Description: To improve consistency across Inventory service plugins, we are introducing the new data class InventoryModifications. This data class contains all inventory modifications that can be chained from a plugin. Any StackableItemUpdate used by InventoryOperations can be replaced with a StackableItemGrant. The Inventory service can look up the instanceId to determine if the stackable grant is actually a stackable update.

Integration step:

  • platform | Replace any usages of InventoryOperationsPlugin.InventoryOperations with InventoryModifications.
    • Before:
    data class InventoryOperations(
      val stackableItemGrants: List<StackableItemGrant> = listOf(),
      val stackableItemUpdates: List<StackableItemUpdate> = listOf(),
      val instancedItemServerGrants: List<InstancedItemServerGrant> = listOf(),
      val instancedItemUpdates: List<InstancedItemUpdate> = listOf(),
      val rewardGrants: List<RewardGrant> = listOf(),
      val instancedItemsToDestroy: List<InstanceId> = listOf()
    )
    
    • After:
    data class InventoryModifications(
      val rewardGrants: List<RewardGrant> = listOf(),
      val instancedItemServerGrants: List<InstancedItemServerGrant> = listOf(),
      val stackableItemGrants: List<StackableItemGrant> = listOf(),
      val serverInstancedItemUpdates: List<ServerInstancedItemUpdate> = listOf(),
      val instancedItemsToDestroy: List<InstanceId> = listOf()
    )
    

[Infra & Tooling] platform | If your 4-demo module is not automatically removed, manually delete it and remove all dependent references. #

Description: We’ve removed 4-demo from Pragma Engine as part of a larger cleanup effort. We recommend using Arbiter for demo reference.

Integration step:

  • platform | Validate that 4-demo has been removed from your project. If it hasn’t, manually delete the 4-demo folder from pragma-engine/platform.

[Infra & Tooling] other | Update your IntelliJ version to 2023.1.2. #

Description: The supported Pragma Engine developer environment has been updated to use IntelliJ 2023.1.2 and the newest supported version of Kotlin.

Integration step:

  • other | Use the provided Pragma Engine setup scripts (contact your Pragma support representative if you need these) to download and install IntelliJ version 2023.1.2. Alternatively, download version 2023.1.2 of IntelliJ from the IntelliJ website.

[Infra & Tooling] config | Revert version 0.0.93 updates to the PartnerClientConfig. #

Description: The PartnerClientConfig feature is not ready for use and has been removed as part of 0.0.94 release. If you fail to update the PartnerClientConfig section in your configuration files, Pragma Engine will fail to start with an error message describing where the incorrect configuration is located.

Integration steps:

  • config | | If you do have a bearerToken, rename the PartnerClientConfig to SocialBackendPartnerClientConfig, and delete the socialConnections block.
  PartnerClientConfig:
    bearerToken: "[encrypted string]"
    socialConnections:
      partner:
        host: "shardName.yourCompany.com"
        port: 11000
        authHost: "shardName.yourCompany.com"
        authPort: 11000
        websocketProtocol: "wss"
        protocol:  "https"
      operator:
        host: "shardName.yourCompany.com"
        port: 11100
        authHost: "shardName.yourCompany.com"
        authPort: 11100
        websocketProtocol: "wss"
        protocol: "https"
      player:
        host: "shardName.yourCompany.com"
        port: 11200
        authHost: "shardName.yourCompany.com"
        authPort: 11200
        websocketProtocol: "wss"
        protocol: "https"
  • config | If you don’t have a bearerToken, delete the entire PartnerClientConfig configuration block.

[Infra & Tooling] config | Add the configuration file integrationtest.yml so you can customize integration tests without affecting your local development configuration. #

Description: Use a separate integration tests config file called integrationtest.yml instead of sharing the dev.yml config file, which could conflict with your local development. Use the integrationtest.yml file to put common configurations that should be shared across all integration tests.

Integration steps:

  • config | If you have any integration tests that inherit from the Pragma-provided BaseServerIT class, make a copy of your 5-ext/config/dev.yml config file in the same folder and name the file integrationtest.yml. Doing so will preserve the configurations that were previously used for running integration tests.
  • config | Modify the integrationtest.yml file for your integration tests needs.

[SDKs] sdk | Follow the provided integration guide to update to SDK V2. #

Description: As part of the SDK V2 update, PragmaSession has been split into Player and Server objects that provide a more relevant subset of the API based on their respective use cases. There’s also a new Runtime object that manages all player and server sessions. The migration guide can be found in the Google Drive, with the title SDK API V2 Migration Guide. If you need access to Google Drive, contact your Pragma support representative.

Integration steps:

  • Follow the relevant sections of the SDK API V2 Migration Guide.
    • sdk | If you’re using Unity and have not yet updated to SDK V2, follow the Unity section.
    • sdk | If you’re using Unreal and have not yet updated to SDK V2, follow the Unreal Phase 1 and Unreal Phase 2 sections.
    • sdk | If you’re using Unreal and have already migrated to SDK V2, follow the Unreal Phase 2 section.

[Player Data] config, platform | Update Portal configurations to reflect their relocation to a routePlugins collection, and migrate any custom Portal Plugin to be a Route Plugin. #

Description: The Portal configuration location has changed and having a valid location is required to enable Portal. Instead of being a separate plugin, Portal is now part of a plugin collection called routePlugins. As part of adding this collection, the FilePortalModulePlugin has been converted from a PortalPlugin to a RoutePlugin. You must define the Portal as a route plugin in your environments as it is no longer enabled by default.

Integration steps:

  • config | Add or update Portal configurations on the platform.
    • Before:
    pluginConfigs:
    SocialOperatorGatewayNodeService.portalPlugin:
      class: "pragma.gateway.FilePortalModulePlugin"
      config:
        portalSource: "web/portal/dist"
        authenticationIdProviders:
          1: UNSAFE
          3: DISCORD
          4: STEAM
          6: GOOGLE
        discordClientId: "YOUR_DISCORD_CLIENT_ID"
        googleClientId: "YOUR_GOOGLE_CLIENT_ID"
        redirectSignInToSocial: false
    
    • After:
    pluginConfigs:
    SocialOperatorGatewayNodeService.routePlugins:
      plugins:
        Portal:
          class: "pragma.gateway.FilePortalModulePlugin"
          config:
            portalSource: "web/portal/dist"
            authenticationIdProviders:
              1: UNSAFE
              3: DISCORD
              4: STEAM
              6: GOOGLE
            discordClientId: "YOUR_DISCORD_CLIENT_ID"
            googleClientId: "YOUR_GOOGLE_CLIENT_ID"
            redirectSignInToSocial: false
    
  • platform | Any custom Portal Plugin will need to be migrated to a Route Plugin. Instead of providing an Application that would have routes attached, use the Routing object instead.
    • Before:
    application.apply {
      routing {
          options {
              call.respond(HttpStatusCode.OK)
          }
          route("config/config.json") {
    
    • After:
    routing {
      options {
          call.respond(HttpStatusCode.OK)
        }
    
      route("config/config.json") {
        ```