brainCloud 5 is finally here – and it will boost your team’s productivity to new heights!
brainCloud 5 features:
NewDesign Portal (Portal-X) – our completely re-designed and re-engineered web environment
NewIntegrated Forums to build community
NewbrainCloud BootCamp tutorial videos to get developing in brainCloud quickly
NewDocumentation system – to allow you to find what you need faster (even from within our script editor!) (coming soon!)
But don’t take my word for it – check out our trailer!
We will be adding tons of new features to the brainCloud 5 platform in the coming months.
Stay tuned – and thanks for choosing brainCloud!
Release Highlights
Portal-X
Our next generation portal, Portal-X, is now the default for all users!
For those who don’t know, Portal-X features:
Completely new navigation model – quicker and easier to find things, plus mobile-friendlier!
All screens designed to be more scalable – for the largest apps with the largest communities!
New multi-pane Cloud Code Editor with syntax highlighting!
Dark and light mode support!
RTT-enabled API Explorer!
New Dashboards and analytics screen for more information on your apps!
For more information on some of the basics on Portal-X – check out the brainCloud 4.15 release notes. Or go to https://portalx.braincloudservers.com now and give it a try!
Information
Note – our legacy portal will continue to be available for the next few releases. You can access it by selecting “Switch to Legacy View” from the right-hand Personal Panel menu in Portal-X.
Forums Integration
We realize that our existing Forums don’t get used much. We aim to change that!
Not only does our new Team Dashboard prominently feature the latest forum posts – but starting in 5.0 users will now be automatically signed into the forums if you launch them from Portal-X!
So please – take a moment – explore the forums – and give us some feedback on brainCloud 5!
brainCloud BootCamp
We are very pleased to announce the general availability of brainCloud BootCamp – our new online training site!
We have been working on these lessons for over a year – and are super-happy to be able to finally be able to share them with you!
There are over 75+ video lessons available – organized into two “Bootcamp” courses to start:
Unity Bootcamp – Everything you need to know to get brainCloud up-and-running in Unity!
Unreal Bootcamp – Everything you need to know to get brainCloud up-and-running in Unreal!
In addition to the new brainCloud 5 features – there are some important functionality-level additions in this release.
These features include:
Updated google purchase integration – Google has made a bunch of changes in the past few months and we’re just catching up! brainCloud 5.0 adds support for Google Play Billing Library version 5.
Improved iOS Appstore purchases – a new parameter allows apps to exclude returning old purchases in receipt data. Especially helpful when dealing with recurring subscriptions.
Email “cc” and “bcc” field support – has been added to the SendAdvancedEmailByAddress() api call.
Send events to multiple profiles – in a single call (see API section).
Improved Long-lived lobby support – servers can send SYS_ROOM_KEEP_ALIVE calls to lobbies to ensure stay around as long as the room/relay servers themselves.
Server improvements
Server support for System RTT Connections ← we will be building on this
Better detection of duplicate packet ids (server-side)
Client Libraries and Examples
Unity
updated Authentication Example – includes Google, GoogleOpenID, Apple and Facebook authentication.
Unreal
added TCP Support for Relay Comms
C#
Improvements to JsonResponseBundleV2 deserialization
JavaScript
Updated our JavaScript libraries to work better with K6
Produced updated K6 example package
Objective-C / Swift
Updated to JSonCpp 1.1.4
Updated Swift examples for XCode 14.3
Cocoapods updated
Portal Changes
Of course – all of Portal-X is new!
But you’ve had access to it in the 4.15 preview – so we will focus on the new features this release.
Note that these new features only refer to Portal-X. We will no longer be making feature enhancements to the legacy portal (though we may deprecate features for safety reasons in the coming months).
We have made the following portal changes:
Team Menu
Dashboard
The Helpful Links section has been updated to provide more helpful links!
The Recent Forum Posts section now integrates more tightly with the Forums – and will automatically log the user (creating an account if necessary) if a forum link is clicked.
App Menu
Dashboard
Dashboard graphs now work properly in Safari!
Design > Admin Tools > Deployment
A new option, “Do not migrate Global Entities”, has been added to the deployment screen – but it is not editable in 5.0. This option is related to new Global Entity enhancements coming in a future release.
Design > Cloud Code > Scripts
The editor now stays in Edit mode after the script is saved.
The script editor now automatically senses the tab settings for a script. Those settings can not be overridden by the developer as well.
Improved handling of editor sessions and script versions.
Reports > Usage > Profile
The Profile screen provides a useful summary of the feature and resource usage of the app.
Reports > Usage > Script Usage
The new Script Usage screen can be used to get a better understanding of the performance profile of an app’s cloud code scripts.
It is especially helpful when optimizing and app to improve performance / api count usage.
API Changes
The following changes/additions have affected the brainCloud API:
Event Service
SysSendEventToProfiles() – can be used to send an event to multiple users. (Technically each user receives their own copy of the event).
Lobby Service
SysRoomKeepAlive() – can be used by a running server to ensure that the Lobby associated with the server sticks around for the lifetime of the server. The lobby data contains a new field, keepAliveRateSeconds, that tells the server how often to send the heartbeat.
Mail Service
SendAdvancedEmailByAddress() – enhanced to support “cc” and “bcc” addresses
User Service
SysDeleteUser() – new Sys API for deleting a user account. Includes the option to automatically delete all child profiles as well.
Miscellaneous Changes / Fixes
Documentation updates
Our legacy documentation site has been updated with the latest 5.0 APIs
We also have a brand new documentation site that we will be rolling out very soon!
Important Fixes
TBC
Plus miscellaneous fixes and performance enhancements…
Okay – we said that 4.14 was the last release before 5.X – but it turns out that there are enough under-the-hood changes happening that we feel it is best to separate the launch into two releases.
The good news is that we are making Portal-X available to all users with this release! (see details below).
Warning
Although 4.15 doesn’t have a lot of API changes – it does have an enormous amount of under-the-hood changes – including:
Upgrade from Java 8 → Java 11 MongoDB Atlas 5.X support Updates to Spring, Karaf, Camel, & Vert.x frameworks and other libraries Refactoring of Redis connections across the board Migration to standardized apiserverimages Removal of our legacy portal SSO ← mostly affects private brainCloud deployments Misc security and performance improvements
The release has been heavily tested (including several canary traffic tests) – but if you notice anything amiss – please report it ASAP! We will jump on it right away!
Release Highlights
Portal-X
Portal-X is now enabled for all users!
See the Portal Changes section for more info!
Returning Friend Platforms
The Friend Service’s ListFriends() call now returns a list of the friend platforms that each friend was found on – which helps to optimize certain usage scenarios.
Archive Deleted Accounts
When we introduced our Auto-Delete service (i.e. Dormant Account Deletion) – we added a feature to keep a temporary archive of a user’s account. We later expanded this feature – so that user accounts that were deleted programmatically were also archived if this feature was enabled.
In brainCloud 4.15 we are officially promoting this functionality into a separate Archive Account feature – so that apps can enable archiving of accounts-to-be-deleted – even if the app is not using the Auto-Delete service.
You will find the new feature under Design | Core App Info | Archive Settings in the portal.
Note that the settings for this feature are not updated or overwritten during deploys. This allows an app to have separate archive settings on a per app-instance basis.
Also note that – because this feature uses Custom Entities – it is limited to apps on Plus or Bulk+ plans.
Custom Entity “Explain” Support
Developers are now able to access Atlas “explain” information for Custom Entity GetPage() queries – via the API Explorer ONLY!
This can be useful when evaluating whether your indexes are sufficient to cover specific queries. The explain results can tell you what indexes Atlas will utilize for the query – and stats on the resulting query performance.
To request the explain data for a GetEntityPage() query – simply supply an “options” section with the desired “explain” level. For example:
The following 3 levels are supported:
QUERY_PLANNER – MongoDB runs the query optimizer to choose the winning plan for the operation under evaluation – and returns the queryPlanner information for the evaluated method.
EXECUTION_STATS – MongoDB runs the query optimizer to choose the winning plan, executes the winning plan to completion, and returns statistics describing the execution of the winning plan
ALL_PLANS_EXECUTION – MongoDB runs the query optimizer to choose the winning plan and executes the winning plan to completion. In “allPlansExecution” mode, MongoDB returns statistics describing the execution of the winning plan as well as statistics for the other candidate plans captured during plan selection.
The explain results are returned in a map named explain under the data section of the results JSON.
For more information on Explain and the results returned – see this MongoDB page – db.collection.explain()
Client Library Improvements
There aren’t a ton of new API calls in 4.15 – but there are some important improvements to the client libs themselves – so be sure to grab them!
C++ / Objective-C / Swift Library
RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
Unity Library
RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
Remember – our Unity Library is now available via Unity Package Manager for easy updates!
Unreal Engine
Migrated websockets to use Unreal’s IWebSocket for greater cross-platform compatibility (including Xbox!).
Note – IWebSocket is considerably less performant than the previous libwebsocket implementation. As such, we do not recommend using WebSocket for real-time RelayServer communications – use UDP instead.
Update – there is a configuration fix to improve IWebSocket performance – check the library source readme!
RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
Java
RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
Our Java libs are now published on Maven in 3 packages: braincloud-java, braincloud-java-android and brainclouds2s
S2S library improvements
Added standardized log message format (now includes timestamps at ms level)
Fixed bug where a failed request would cause future requests to be ignored
Fixed bug where an error in the message callback would cause future requests to be ignored
Fixed bug where server response would be parsed as json even when no json would be available
Improved error responses to more accurately reflect what actually failed
JavaScript
Improved packetId handling and unit tests
Portal Changes
Portal-X is now available to all users!
Our legacy portal is still the default for 4.15 – but Portal-X is available as an alternate UI for everyone. Here is how to access it:
Launching Portal-X
After logging into the legacy portal, just click on your user image in the top-right hand corner, and click Open Portal-X to try out our new Portal. You can also navigate to it directly via https://portalx.braincloudservers.com.
You can switch back to the legacy portal at any time by clicking Switch to Legacy View from the top-right menu – or by navigating to https://portal.braincloudservers.com.
Portal-X Menus
One of the biggest changes to Portal-X is in the area of navigation.
In Portal-X, we have collapsed (and expanded) the main menus to a single left-hand menu system. You first switch between the Team and App menus via the tabs at the top. From there, the main sections are:
Design ← this is the old Design menu, much as it was in legacy portal
Global ← this is the old Monitoring | Global Monitoring menu
Groups ← this is the old Monitoring | Group Monitoring menu
Users ← this is the old Monitoring | User Monitoring menu
Reports ← this is the old Reports menu, largely unchanged
Menu Flyouts
To aid in navigation – we have added fly-outs to the app menus. Click on a fly-out to expand it and quickly view all of its sub-menus!
Dashboards
Portal-X features improved Team and App Dashboards – providing more information at a glance!
Smart Search
The smart search bar at the top of the screen allows you to quickly search across the system for apps, users, screens and more!
Favorites
Click the star in the breadcrumb menu to add a screen to your favorites list. Clicking Favorites from the menu shows you your list – plus the most recent screens you have visited.
Dark Mode
You can toggle between Light/Dark Themes via the right-hand menu (click on your profile pic in the top-right corner)
Getting Help!
Click the icon to display a list of help resources – or click the chat bubble next to it to talk to Support!
More Portal-X Features
Be sure to check out these additional Portal-X features:
Brand new multi-paneScript Editor with Intellisense!
New API Explorer with RTT support!
New User Browser with more ways to look up users
New Profile screen gives a deeper overview of brainCloud resource utilization for your app
New Script Usage screen makes it easier to assess, prioritize and track script optimizations over time
API Changes
There are very few API changes in this release:
Friend Service
ListFriends() – now returns the platforms that a friend was discovered upon as part of the results
HTTPClient
New PostTextResponseJson() – call fills in this missing usage scenario
General – a default accept header is now added to all calls to improve overall compatibility. This new behaviour is disabled by the new compatibility flag – which is enabled by default for existing apps: [x] Do not add default response media type accept header for responses (can interfere with request signatures if apps are not aware)
Miscellaneous Changes / Fixes
Updated libraries
All libraries have been updated with the latest API enhancements. Go get ’em!
Documentation updates
The Learn More help pages have largely been updated for Portal-X – though additional updates are still in progress
Important Fixes
BCLOUD-26 Modify RTT event server to use session-based S2S calls
BCLOUD-1308 Add Custom Entity API support for explain() for paging queries
BCLOUD-3253 Move to Camel 3.11.7 (from 2.25.4)
BCLOUD-3436 Add more checking to Ultra Identity Validator
BCLOUD-3697 Review use of IGameDao getAllGames() and optimize where possible (especially if only gameId required)
BCLOUD-4182 Audit log paged read requests should only returns logs for apps non-admin team member has access to
BCLOUD-4294 Tighten up PSN service type with an enum and server side validation <- I think this might have been released in 4.14, but didn’t make it into release notes?
BCLOUD-4370 Further work on segregating redis connections
BCLOUD-4371 Retire the old spring oauth support to get rid of deprecation warnings and possible security vulnerabilities ← need to change prod-baas before traffic test
BCLOUD-4372 Retire jets3t component as it is no longer required and has not been updated since 2015
BCLOUD-4545 Implement super property caching for Client API Dispatcher
BCLOUD-4557 Add trackable New Relic events (errors?) for Portal Login failures
BCLOUD-4563 Look for blank gameId as well as null in checking logic in the S2S dispatcher
BCLOUD-4575 Marketplace – Products fail to load AND globalApp PRELOAD fails if BAD defaultPriceId — need to use readMultipleRobust DAO method to skip products that fail on deserialize
BCLOUD-4700 Fix for NPE in Global Monitoring->S2SLogs
BCLOUD-4701 User should not be able to delete currency when it is added to Item Catalog
BCLOUD-4751 Convert DeferredMessage processing to Newer DeferredCallback mechanism (includes OneWayMatch)
BCLOUD-4769 Orphan Room Server instances are not being terminated
BCLOUD-4777 New sysMetrics collection to collect nightly global (and some app) collections totals
BCLOUD-4780 New server endpoint to delete “INVITED”, “REQUESTED” users in groups screen
BCLOUD-4784 Update libraries identified in docker hub vulnerability report (snakeyaml, commons-collections, google auth client (1.33.3), spring (5.1.X->5.3.27), jason-smart (1.3.3->1.5), commons-fileupload(1.3.3->1.5))
BCLOUD-4785 Update Redisson library to 3.15.6 -> 3.16.8
BCLOUD-4791 NPE from AnalyticsEventConsumer process
BCLOUD-4799 Remove DeferredMessage karaf component and core service as it is obsolete
BCLOUD-4800 Implement a “system” RTT connection for non-player RTT interactions
BCLOUD-4804 Evs healthcheck now returns non-200 status code if connectivity is lost with RTTManager or S2S server
BCLOUD-4806 Server changes to move to MongoDB 5
BCLOUD-4818 Make SEDA queue sizes configurable via brainCloud property
BCLOUD-4826 Update vertx version from 4.2.1 to 4.2.7
BCLOUD-4834 Improve some less efficient queries (including queries that don’t require collections to be checked / created)
BCLOUD-4835 Create a start/poll version of direct api call method used by API explorer
BCLOUD-4836 Support audit logging from purge project and log team update for unlinking app from team for Auto Hard Deletion processing (excluding before and after snapshots)
BCLOUD-4851 Configurable security checking of packetId -1 (being used for deferred message handling)
BCLOUD-4852 Event server doesn’t handle failed S2S calls very well with new session-based S2S client
BCLOUD-4853 Added friendPlatforms to FriendService->ListFriends call
BCLOUD-4854 Make S2S local dispatcher asynchronous
BCLOUD-5023 Update Microsoft client to use non-deprecated security and reflection mechanisms <– NOTE – test by verifying Microsoft store receipt! (probably cannot do!)
BCLOUD-5024 Update Saml service to use non-deprecated auth method
BCLOUD-5032 A couple more misc deprecation updates – CustomOidcUserService & FacebookCreditService <- test with Forum Login and Facebook purchase
BCLOUD-5039 Server build script does not recognize failures properly
BCLOUD-5043 Added support for Google Analytics 4
BCLOUD-5051 Fix camel http client code that the camel 3 update broke
BCLOUD-5054 Standardize apiserver images ← ensure deployment dir is ready for this
BCLOUD-5061 More direct error reporting when webhook output is wrong
BCLOUD-5073 When scheduling a script inside another script, the client wants the scriptData shown inside the Context of error log
BCLOUD-5081 Provide support to make S2S Explorer session based similar to API Explorer
BCLOUD-5082 Assign unique session ids to webhook calls
BCLOUD-5083 [Portal-X, Legacy] Design | Servers | My Servers – When user change Server Type from ‘Custom Server’ to ‘Relay Server (hosted)’ or ‘Room Server (hosted)’ an error message display
BCLOUD-5115 Make Oauth client auth method configurable
BCLOUD-5123 System metrics indexes
Plus miscellaneous fixes and performance enhancements…
Twilio is retiring the Authy API that brainCloud uses as of May 1, 2023.
All 2FA users MUST migrate to our new Google Authenticator compatible system by May 1st, 2023.
Users who do not migrate by that date will find their accounts locked as a security precaution. See the FAQ below for instructions on how to re-enable your account.
Enabling the new 2FA
The good news is that our updated solution (which uses the Twilio Verify API), is Google Authenticator compatible – so you can use any compatible app – including:
Google Authenticator
Microsoft Authenticator
Twilio Authy
(Why is Authy on this list? Although Twilio has terminated the Authy Server API – they continue to fully support the app. It is still a good authenticator that works well across multiple devices.)
Configuring the new 2FA is simple:
Click on your name in the top-right corner of the Portal
Choose Edit Profile
Navigate to the Two-factor tab
You will see one of the following two screens. If you’ve previously enabled our Authy-based 2FA – you will see a screen that looks like this:
If you are enabling 2FA for the first time, you will see a screen that looks like this:
Click either the [Verify API] or [Click to Enable 2FA] button – depending upon the dialog you see – to continue.
Click the [Link] button to continue.
Then get your Authenticator app out – and scan the QR code on the next page.
And finally, enter the code displayed in the app to finalize linking your account.
That’s it. Your account is now configured with our shiny new 2FA system.
The next time you login, you’ll see this prompt:
Note that you can choose to have brainCloud remember your device (so that you don’t have to re-enter the Authenticator code at each login) for 30 days.
Frequently Asked Questions
How can I tell if my account is using Authy-based 2FA?
The easiest way to be is to check your user settings:
Click on your name in the top-right corner of the Portal
Choose Edit Profile
Navigate to the Two-factor tab
If you see that your account is linked to a phone number (and the red Authy logo below it) – then your account is currently using Authy for 2FA verfication.
What will happen if I don’t migrate by May 1, 2023?
At the stroke of midnight UTC on April 30th, we will lock all accounts using Authy 2FA that have not migrated to the Verify API. This is to prevent any nefarious actors from being able to log into a newly unprotected account.
To re-enable their accounts, users will need to invoke the “Forgot Password” link on the Portal – which will email them a link to use to reset their password. (This proves that the actor logging in has access to the user’s email account).
Once reset, the user will be able to log back into their account.
Advice
Upon logging in, we recommend that users immediately enable the new Verify API authentication via the instructions above.
I like the Authy App. Can I still use it?
We like it too! And yes you can.
You can use Authy as your Google Authenticator app for validating brainCloud Portal logins. (And note, although Twilio is no longer supporting the Authy API, they have stated that Authy is still supported as a client app for this very purpose).
Unfortunately that doesn’t give us the one-touch capability that brainCloud users used to enjoy. Twilio says that they are working to enhance their APIs to support Authy One-touch in the future – but there is no timeframe for delivery. If/when it becomes available, we will strongly consider supporting it.
What if I am using a preview of Portal-X?
If using Portal-X, the screens are a bit different. This screen (with the Authy logo, and the yellow warning above) tell you that you are using the old 2FA system. Click on the [VERIFY API] button to enable the new 2FA system.
We know, we know – you really want brainCloud 5 — not 4.14! It will be here soon — we promise!
In the meantime, this is the last in our 4.X series of releases – and it features a bunch of important updates.
Plus, as a bonus, in a few weeks we will be granting preview access to the new brainCloud 5 Portal!
Important Changes
Note: there are a few important (and potentially disruptive) changes in this release – specifically:
For un-owned Group Entity Creates (i.e. CreateGroupEntity() (with isOwnedByGroupMember == false) and SysCreateGroupEntity() ) – the following two changes apply:
if acl is specified, it must include both the other and member fields… Also, member cannot be more restrictive than other
Also – if acl is not specified, it now defaults to { "member": 2, "other": 0 } . It did this before when acl was empty map, but when acl was null, it defaulted to { "member": null, "other": 1 } – which was both less secure and problematic.
Also regarding Group Entity creates – the entityType must no longer be null or empty string ← it was never supposed to be allowed in the first place!
When using Shared Accounts (i.e. apps with parent and child profiles) – the following change applies:
calling Identity.GetChildProfiles() will no longer return the child profiles for apps that have been soft-deleted
Apps by default are now initially limited to max of 15 custom entity collections. See Custom Entity Improvements section for more information.
Release Highlights
Portal-X! (available shortly after 4.14 release)
Our next-gen Design Portal (codenamed Portal-X), will be available as part of brainCloud 4.14.
The new Portal has been completely re-designed and re-written from the ground up to give us a strong foundation for new features moving forward.
Portal-X is more capable, more scalable, more mobile-friendly, and easier to use. It is also a work-in-progress – and will definitely improve over time as we polish it. We look forward to your feedback!
Group Files API [Beta]
brainCloud 4.14 adds support for group-managed files.
Group Files are similar to Group Entities – in that they are associated with, and potentially private to, a specific group.
Group Files features include:
folder structure within a group
ACL permissions at folder and file levels
operations for creating, moving and deleting folders
operations for moving, copying and deleting files
ability to copy/move user files to group files
Note that Portal support for Group Files will be added to our Next-gen Portal in coming releases. For now, support is API only.
Also note, that like user files, group files do not migrate to downstream apps during deployment.
Relay Server Improvements
We have made several changes and improvements to our Relay Servers:
Added a new “END_MATCH” call to better support ending a game session while players remain attached to the lobby that spawned it.
Fixes for websocket packet handling that span frames.
Added missing passcode validation for match join-in-progress.
Lots of logging cleanup.
Updated documentation accordingly.
Information
Relay Servers will be updated a few days after the initial 4.14 deployment.
Client Library Improvements
In addition to incorporating the 4.14 API changes, the following additional improvements have been made to the client libraries:
Objective-C / Swift Library (C++)
Fixed errors for Xcode 14 update (multiple definitions of http_status_codes)
Fixed Cocoapod compiler warnings
Builds for WatchOS
Improved compile time
Unity Library
At long last, Unity Package Manager support!
Added support for new RelayServer EndMatch() call
Relay Communication: TCP and UDP bug fixes
Unreal Engine
Code fix for UE 5.1 no longer accepts deprecated IOnlineStorePtr type
Facilitates proper/complete disconnect from relay server (send disconnect to server then handle cleanup in client closed callback)
More detailed connection status in RTT comms to include CONNECTING, more precise DISCONNECT
Improved compile time
IMPORTANT: IWYU paradigm is promoted for UE5 and has been implemented in our brainCloud plugin. Monolithic include Engine.h replaced with CoreMinimal.h. Client projects may incur build errors and if so will need to include required headers directly (Json reader, Platform file manager, etc).
There is a known Clang compiler issue when using Xcode 14 with UE 4. There will be errors of redefintions of HTTP_STATUS codes in thirdparty libraries used by Unreal and brainCloud. This issue is resolved in UE 5. In order to continue development in previous versions of Unreal, the file Engine/Source/ThirdParty/libWebSockets/libwebsockets/include/Mac/libwebsockets.h can be overwritten by the updated one downloaded from Epic Games’ developer github.
Java
Updated documentation for client setup
Javascript
Eliminated redundant callbacks in Relay service
Custom Entity Changes and Improvements
Portal now uses a paged API for retrieving Custom Entity types
Max # of custom entities now enforced (see note below)
New Raw Lines import / export format. This is a more efficient format for larger imports.
API – Recount now skipped on subsequent page requests
An Important note regarding Custom Entities…
Custom Entity collections were designed for high-capacity, high-usage data situations – and they are great for that. We are, however, seeing some apps use them for lists of reference data (like months of the year, active promotions, avatar types, etc.) – resulting in dozens of read-only collections with just dozens of records each.
This is somewhat problematic because each custom entity collection consumes a MongoDB “namespace” – and there are performance implications to piling up tons of essentially empty namespaces.
Remember – entity collections are very flexible. If you have a dozen collections that you are using for various types of reference data, you could probably create a single “reference” collection, and have each object have a “referenceType” field and it’s own custom JSON. Thus – the contents of the 12 collections could efficiently be stored within a single custom entity reference collection. ← and returned to the client in a single set of calls as well!
To address the inefficiency, in the future we plan to add a “minimum storage cost” for each Custom Entity collection. That would mean that even though your collection only has a dozen records and is consuming only 50Kb of space – our system would calculate its cost at the minimum size – which will likely be somewhere between 10MB – 1GB ← we have not decided (we don’t want to gouge, but it needs to large enough to dissuade wasteful use of the collections).
In the meantime, brainCloud 4.14 will start to enforce a maximum # of custom entities collections per app. We’re setting the initial value at 15 – and if you already have more than that you are fine – brainCloud will just block your app from creating more. The limit is controllable on an app-by-app basis by us – so reach out to support if you validly need more. We aren’t going to be especially stingy with it – but we want to at least force the discussion.
To help meet the design needs of our apps, we plan to add some key improvements to Global Entities – namely adding the ability to migrate specified System Entity collections during deployment – so that Global Entities are maybe more appropriate for these sorts of small, read-only reference collections.
Anyway – stay tuned – and please think twice before creating your next custom entity collection – when you could maybe use the reference pattern instead!
Deployment and Import/Export Changes
We have been working to improve the performance and scalability of our app deployment and import/export mechanism.
Some of these changes are effective right-away – and others will be enabled in the coming weeks after more production testing.
Import / Export
There is a new file format for App Configuration Data imports / exports, which separates each migrateable custom entity collection into its own file. [feature is backwards-compatible and will be initially disabled]
Deployments
The target app’s game record is no longer temporarily deleted during the deployment process. The old record is updated directly instead.
Migrateable Custom Entity collections are now copied directly collection-to-collection – instead of being exported to and imported from intermediate files. This lowers the memory footprint of deployments considerably. [feature is backwards-compatible and initially disabled]
Example App Improvements
The following improvements have been made to the example apps:
All Unity Examples will be updated to 4.14 shortly after release
All Unreal Examples will be updated to UE 5 before next release
Authentication Demo (Unity)
We have completely re-worked the Unity Authentication demo
Version 1.0 includes clear examples of how to handle user authentication and the various services within the brainCloud API when using Unity (including Entity, Custom Entity, Global Statistics, Identity, Player Statistics, Script, and Virtual Currency)
More methods of authentication and examples of other services to come
Takes advantage of new Relay Server “END_MATCH” feature to properly support long-lived lobbies.
Unreal Functional Test Suite and Device Demo
Added scripts to switch between UE 4.27 , 5.0 and 5.1 with documentation
Improved logging in editor
Include required headers for project in replacing Engine.h with CoreMinimal.h
Changes made to build in Xcode 14 (the new options added do not exist in previous versions so compiler errors will occur with UE 4/Xcode 13 setup – see project Readme regarding fix)
Added scripts to up-convert to UE 5 and to ensure asset compatibility for UE 4
Relay Test App (Unreal Version)
Changes made to build in Xcode 14 (the new options added do not exist in previous versions so compiler errors will occur with UE 4/Xcode 13 setup – see project Readme regarding fix)
Added build scripts for continuous integration
Android C++ Demo App
Improvements to Java layout and test output
Relay Test App (C++ Version)
Added gradle project to existing source code for deployment to Android devices
Swift UI and Basic Example
Updated for Xcode 14 and improved command-line builds
Additional Features / Changes
Auto-Delete Users
We have made a change so that Auto-Delete settings are no longer propagated during deploys. This allows developers to have separate settings for Development vs. Production app instances.
Group Entities
Increased enforcement of parameters when creating new Group Entities. See API section for details.
External Web Services
We have improved the caching of the external service endpoints – so calls to these services should be a bit faster… (especially at higher volumes)
Logging
The system will no longer record “user session has expired” warnings. The system already provides an appropriate response to the client. There is no value to retaining them on the server (and they just waste log storage).
MongoDB 4.4
This release has been fully tested on MongoDB 4.4. All brainCloud deployments will migrate to MongoDB 4.4 in the coming months.
Offline Matchmaking
Database Index Optimizations for faster performance
Playstation
Added new option to ensure that the user’s Profile Pic url is updated at each login
Portuguese (Brazilian)
We have updated our global list of supported locales to include Portuguese (Brazillian)
Ultra Blockchain
The Ultra Blockchain components have been updated to support NFT v1
WebPurify Integration
Improvements to WebPurify error logging
From Previous Patches
Additional changes that were added in 4.13 patches:
Increased Max Leaderboard “Days” value from 7 → 28 days
Added the ability to extend the Max Server Session time from 6 hours → 24 hours
Features for licensees
These features are of special interest for customers who have their own private instance of brainCloud:
Auto Hard-Deletion
New settings to automatically trigger hard-deletion of soft-deleted apps – after a period of days, and only if the app’s users are lower than a specified threshold
This helps to keep to keep the database slim and trim
Auto-Delete Users
The deployment changes will allow private licensees to enable deletion of Dormant Accounts in development apps – without having those settings necessarily migrate to their production apps.
Portal Password Standards
brainCloud can now enforce minimum password standards for portal users
The settings are controlled via the new portalPasswordEnforcement brainCloud property
The Authy Service that brainCloud’s Portal uses for Multi-factor authentication is being terminated by Twilio as of May 1, 2023. (Note – the Authy App lives on. Twilio will continue to support it as a consumer application, and you can continue to use it for brainCloud MFA if you would like.)
In it’s place, the brainCloud Portal (both legacy and Portal-X) now integrates with the Twilio Verify service. Portal MFA users are encouraged to activate the new MFA implementation before May 1, 2023. There will be a blog post in the next couple of days with information on how to do so.
We have also made the following changes to the legacy portal:
Design
Core App info | Application IDs
New [x] Always update profile pic url option added to the Playstation settings. Ensures that the PlayStation avatar picture will be refreshed each time a user logs in – even if the pic had been previously set before.
Cloud Code | My Servers
Can now specify Custom Environment settings for GameLift servers
Cloud Data | Custom Entities
Retrieving the list of custom entity types is now paged properly (under the hood) for better performance
Integrations | Blockchain
Updated the Ultra System plugin to support optional CloudFlare service tokens
Team
Manage | Team Info
The Billing Information section will now display the team’s Credit Balance (if it has one).
API Changes
The following changes/additions have affected the brainCloud API:
Event
New SysSendEventRTTOnly() method can be used to send events to users via RTT-only — i.e. without persisting them to disk. This eliminates the need to delete the event once received. RTT-only events have an eventId of "" (i.e. empty string).
Group
For un-owned Group Entity Creates (i.e. CreateGroupEntity() (with isOwnedByGroupMember == false) and SysCreateGroupEntity() ) – the following two changes apply:
if acl is specified, it must include both the other and member fields… Also, member cannot be more restrictive than other
Also – if acl is not specified, it now defaults to { "member": 2, "other": 0 } . It did this before when acl was empty map, but when acl was null, it defaulted to { "member": null, "other": 1 } – which was both less secure and problematic.
Group Entity creation calls now enforce that groupEntities must specify an entityType – can’t be null or empty string
GroupFile [NEW!]
File Info – CheckFilenameExists(), CheckFullpathFilenameExists(), GetFileInfo(), GetFileInfoSimple(), GetCDNUrl(), GetFileList(), UpdateFileInfo()
calling Identity.GetChildProfiles() will no longer return the child profiles for apps that have been soft-deleted
Leaderboard
New PostScoreToDynamicLeaderboardUsingConfig() and PostScoreToDynamicGroupLeaderboardUsingConfig() have been added as more flexible versions of the older API calls. In particular, these new calls allow the developer to specify an optional expireInMins value that will automatically queue the leaderboard for deletion after the prescribed number of minutes.
Note that these two new calls are currently cloud-code only. They will be added to the client libs for brainCloud 5 though!
Messaging
New SysDeleteMessages() call allows multiple messages to be deleted in a single call.
RelayServer
New EndMatch() call allows the owner of a game session to tell the RelayServer to shut down the match – without having each player disconnect from the client (which also causes them to leave the lobby). This is a better flow for long-lived lobbies.
Miscellaneous Changes / Fixes
Updated libraries
All libraries have been updated with the latest API enhancements. Go get ’em!
Documentation updates
The latest APIs have been incorporated into the docs
Important Fixes
TBC
Fixes included from 3.14.1 patches
BCLOUD-1518 – Fix to lobby screen – disband on start no longer automatically selected
BCLOUD-3060 – Blockchain Integration – Enforce a minimum value of 1 for the “Timeout (minutes)” fields.
BCLOUD-3109 – Improvements to json response exception reporting from scripts
BCLOUD-3115 – Added header and bundle appId to s2s dispatcher
BCLOUD-3119 – Fixed issues with the reset password screen.
BCLOUD-3123 – Monitoring Group Entities – Fixed displayed member ACL in the table
BCLOUD-3179 – Support search on name of definition id for Item catalog
BCLOUD-3184 – Detach identity confirm anon fix
BCLOUD-3295 – Corrected permissions check on app passwords feature
BCLOUD-3362 – Fix to serialization issue for cloud code version of LobbyService.GetLobbyInstances()
BCLOUD-3371 – Made hosting cost billing adjustment values super properties
BCLOUD-3411 and 3412 – Extended max Room Server Session time past 6 hours (new property – roomServerMaxSessionTimeMins)
BCLOUD-3581 – Custom Entities skip recount on user page requests
BCLOUD-3555 – PS5 Profile and Friends Support
BCLOUD-3687 – Passing through custom fields in fusebill get plan details
BCLOUD-3652 – Fixed issue with monthly aggregates for ccx overages
BCLOUD-3805: Fixed encoding of URL parameters when a player confirms their email address ← important for email addresses with “+” in them
BCLOUD-3836 – Fix for collecting RTT cx usage stats
BCLOUD-3844 – Improvements to WebPurify error handling
Plus miscellaneous fixes and performance enhancements…
These plans offer additional discounts for high-volume (i.e. 100M+ API / month) brainCloud apps.
The savings come primarily from pre-paying for a bulk quantity of API Counts – but there are also additional savings in the pricing for File Transfers, Deep Data Storage, and Dormant Accounts.
Note – you can see the fine details of these plans on our shiny new getbraincloud.com site! Just go to the Pricing tab, then choose [Bulk+ Plans].
Advice
Note – if you aren’t sure which plan to choose, feel free to reach out to our support team and we’ll review your app usage and advise you!
To switch your app(s) to one of the new plans:
Go to Teams | Manage | Apps
Find the app you want to change, and choose Change Plan from the action menu
Switch to the Bulk Plans tab to view the new plans
Select the plan that works for your app – and click [Choose Plan] to make the change!
Warning
Important – These are pre-paid plans, the base cost of the plan will be charged to your credit card immediately. If you swap plans part-way through the month, the cost is pro-rated according to how many days are left in the current month.
As always, if you have any further questions reach out to our support team and we will help you out!
We wanted to notify you that we have discovered (d’oh!) and fixed (yay!) an error with the RTT Concurrent Connection (i.e. CCx) statistics that brainCloud was collecting for billing purposes.
This error meant that we were undercharging for RTT utilization — and the fix means that the under-charging will stop – and thus, the bills for heavy-usage RTT customers will increase slightly (boo!).
The good news is that we aren’t looking to recoup the years of under-billing. And the better news is that RTT usage pricing is already (and remains) quite inexpensive – so the overall impact to an app’s monthly brainCloud bill is quite small (if anything!):
Apps whose usage is within the Free CCx counts of their plan won’t see a change at all.
For high-usage apps, the average impact is only about 2%.
And of course app’s that aren’t using RTT are not affected at all.
Apologies for the error!
Paul.
—
More information about the defect:
As we were collecting CCx statistics from the multiple RTT Event Servers, we were mistakenly clobbering the server-specific values instead of aggregating them together. This meant that we were actually undercharging by a factor of 3… (i.e. charging only for one server’s worth of connections, while an app’s connections are actually spread across three servers).
As you are hopefully already aware, our long-awaited Dormant User Account pricing goes into effect for the February 2023 billing cycle… (which invoices on March 1st, 2023).
There are a few additional pricing tweaks, including new bulk-pricing plans, that will be become active at that time as well.
Read on for more details!
Dormant User Accounts
brainCloud defines a Dormant User Account as any account where the user hasn’t logged in the app in the past 365 days. These users add no value to your game (e.g. they are probably anonymous and have already uninstalled your app!) – but they do significantly increase costs (including deep data usage) — and slow down your apps. In July 2022, over 50% of brainCloud storage and backup costs were due to dormant accounts!
Beginning with the February 2023 billing cycle, which is invoiced on March 1, 2023, brainCloud apps will be charged $75 / month per Million dormant users (pro-rated). That is not a lot – though for some apps it would be – but ideally we don’t want to collect any Dormant User revenues at all — we are looking for the cost savings! That’s why we have our Auto-deletion service!
For instructions on enabling Auto-Delete to reduce and/or eliminate an Dormant User Account pricing charges, see the bottom section of our previous post.
Hosting Pricing Changes
After some deep-dive usage analysis, we have determined that we need to adjust the costs that we charge for hosting Room and Relay Servers. The current formulas were not accurately reflecting the full costs of providing the service – which need to include:
server hosting costs
disk storage costs
data transfer costs
cloud service support costs ← which is a percentage on top of all costs that our cloud provider (AWS) charges as part of our support plan
Therefore, beginning with the February 2023 billing cycle, which is invoiced on March 1, 2023, the prices for brainCloud Hosting services are changing as follows:
Hosting Server markup – will be increased from 15% mark-up to 25% markup
Hosting Management cost – will increase from 1.5 cents per server hour to 2 cents per server hour
Note – obviously these changes only affect customers using brainCloud’s RelayServer and RoomServer hosting services. Customers not using these services (or using their own GameLift accounts instead) are not impacted.
Deep Data Pricing Reductions
In the good news category, a similar deep-dive analysis has determined that we can safely reduce our deep data pricing!
Therefore, beginning with the February 2023 billing cycle, which is invoiced on March 1, 2023, we are decreasing the Deep Data Storage pricing by 10% – from $0.50 / GB / day -> $0.45 / GB / day!
We are also increasing the included (free!) Deep Data Storage Usage units for Business+ Plan customers from 10GB -> 20GB.
As always, we encourage developers to monitor their deep data usage (especially from Custom Entities), and ensure that unused collections are deleted (i.e. especially in cases where collections were temporary migration collections) – and that apps are making use of our TTL (Time-to-live) feature to automatically clean up temporary entities over time.
New Bulk+ (Pre-purchase) Plans
Finally, brainCloud is introducing four (4) new plans for our highest-volume customers.
These plans allow customers to pre-buy a large quantity of API Requests for a discount – with additional savings on Deep Data Storage, File Transfers, and Dormant User Accounts.
Note that as these are pre-purchase plans; customers are charged the live fee amount at the beginning of the month – and pay for usage for the period at the end of the month as usual. This differs from our regular plans, where all charges are incurred at the end of the month.
API Savings
API savings are stated in comparison to the cost of the equivalent number of API calls using the Business Plus plan.
The new plans are:
Bulk+ 100M ($955 / month)
Includes 100Million API calls at a savings of $75. Additional API calls start at $9.50 / M.
File transfers discounted 3% to $0.145 / GB, and free transfers bumped up to 100 GB.
Deep Data Storage discounted 7% to $0.42 / GB / day, and free storage units bumped up to 50 GB.
Dormant User pricing discounted 5% to $71.00 / Million
Bulk+ 250M ($2,205 / month)
Includes 250Million API calls at a savings of $250. Additional API calls start at $9.25 / M.
File transfers discounted 7% to $0.14 / GB, and free transfers bumped up to 250 GB.
Deep Data Storage discounted 13% to $0.39 / GB / day, and free storage units bumped up to 100 GB.
Dormant User pricing discounted 10% to $67.50 / Million.
Bulk+ 500M ($4,115 / month)
Includes 500Million API calls at a savings of $650. Additional API calls start at $9.00 / M.
File transfers discounted 13% to $0.13 / GB, and free transfers bumped up to 500 GB.
Deep Data Storage discounted 24% to $0.34 / GB / day, and free storage units bumped up to 200 GB.
Dormant User pricing discounted 15% to $64.00 / Million
Bulk+ 1B ($7,705 / month)
Includes 1 Billion API calls at a savings of $1,500. Additional API calls start at $8.50 / M.
File transfers discounted 20% to $0.12 / GB, and free transfers bumped up to 1000 GB.
Deep Data Storage discounted 33% to $0.30 / GB / day, and free storage units bumped up to 400 GB.
Dormant User pricing discounted 20% to $60.00 / Million.
Full specifics for the new plans will be posted to getbraincloud.com in early 2023.
These new plans will become available in time for the March 2023 billing cycle – and depending upon interest – potentially as early as January 2023. Note that when these plans become available, they will include all the pricing changes discussed above (even if they are released before the February billing cycle).
Feel free to reach out to support if you have further questions about these plans.
This is a small, targeted release with a few key improvements. This is also our last planned release before the December holiday season.
Note that this is a server-only release. There are no changes to the client libraries.
Release Highlights
Client API Blocking
We have added a new feature that makes it easier to secure your app from mischievous players.
Devs have always been able to add an API Pre-hook to block specific calls from the client – but this is painful to set up – and results in additional API counts for the app.
Configuring the new API Blocking feature is as simple as going to the new Design | Cloud API | API Blocking page, and selecting the Services + API Calls to block. Hit SAVE and you are done! (Or more likely, you are once you deploy those changes to your production app.)
We hope this new feature helps our customers to keep ahead of their most competitive (and ill-mannered) players.
Note that this feature requires a Plus plan to activate.
Note also that certain calls, like the Award(), Consume() and Reset() currency calls, may already be blocked from the client depending based on the compatibility settings on the Design | Core App Info | Advanced Settings page.
Leaderboard “Days” rotation increase
This is a small change – but apps using the arbitrary “Days” rotation for their leaderboards can now set the rotation as high as 28 days…. ← the previous limit was 14 days.
Portal Changes
We’ve made the following portal changes:
Design
Cloud Code | API Blocking
A new screen that allows devs to block specified APIs from being callable from the client.
Leaderboards |
Leaderboards can now be configured with a 28 day rotation.
API Changes
There are no changes to individual API calls, but the new API Blocking feature means that any client API call can now return the following error:
BCLOUD-3305 and BCLOUD-3331 – Improvements to resetting of end-user passwords. Now preventing double-clicks, and waiting until code has been successfully changed to remove the link code.
BCLOUD-3109 – Improvements to json response exception reporting from scripts
BCLOUD-3295 – Corrected permissions check on app passwords feature
BCLOUD-1518 – Fix to lobby screen – disband on start no longer automatically selected
BCLOUD-3362 – Fix to serialization issue for cloud code version of LobbyService.GetLobbyInstances()
Plus miscellaneous fixes and performance enhancements…
brainCloud 4.13 has just dropped. Here’s what it contains…
Warning
Note – the implementation of GlobalEntity.IncrementGlobalEntityData() and Entity.IncrementUserEntityData() have changed – to properly enforce acl.other permissions. Be sure that your app isn’t improperly using those methods against entities with acl.other set to 0 or 1 – because those calls will now fail under 4.13!
Also creating unowned Group Entities via Group.CreateGroupEntity() or Group.SysCreateGroupEntity() with acl.member of 0 or 1 will no longer be overridden to 2 permission.
Contact support if you would like our team to reset any previously created entities for you.
App Minimum Password Standards
This feature allows developers to set minimum password requirements for the users of their apps.
The following requirements can be set:
minLength – <x> chars. Default 8
maxLength – <y> chars. Default is 25 (max is 128).
minDigits – <n>. Default 1
minUppercase – <n>. Default 1
minLowercase – <n>. Default 1
minSymbols – <n>. Default 1
Feature notes:
This feature affects users when setting new passwords. Existing passwords already associated with an account are not affected by this feature.
For symbol enforcement, the following characters are treated as symbols: ~!@#$%^&*_-+=`|(){}[]:;'<>,.?/
If enabled, these standards are automatically enforced by brainCloud when:
creating new accounts
using Email or Universal authentication
using following User service APIs (if a password is provided – generated passwords will not be verified):
SysCreateUserEmailPassword
SysCreateUserUniversalId
attaching new Email or Universal identities
updating passwords (via reset password and other mechanisms)
Attempting to create an account (or attach an identity) whose password does not meet the requirements will return the new INVALID_PASSWORD_CONTENT ( 550022) reason code.
{
"status_message": "Processing exception (message): Password should have minimum 1 uppercase character/s",
"reason_code": 550022
}
Temporary Leaderboards
Apps can now more easily create temporary leaderboards using the SysCreateLeaderboardConfig() call. A new field, expireInMins, has been added to the configuration object to control the lifetime of the leaderboard. Leaderboards set to expire will show an epoch timestamp the expiry field returned from SysGetLeaderboardConfig() and other methods. The system will automatically remove the leaderboard after the specified time has expired.
Technically the clean-up is done nightly, but those are just implementation details.
This provides a convenient method for creating temporary leaderboards, without having to implement a separate process to clean them up.
Note that this functionality is limited to ADHOC and NEVER rotation leaderboards (i.e. leaderboards that don’t rotate).
Resend Verification Emails
For apps with Reject Unverified Email Logins enabled (via the Design | Authentication | Email screen) — the system will now automatically resend the verification email to users when they re-attempt to login.
GameLift-based Relay Servers
We have extended our AWS GameLift integration to include support for Relay Servers.
For instructions on how to configure them, see this article.
Non-consumable IAP Product History
Non-consumable In-App-Purchases can be processed multiple times (unless the “Do not reprocess currencies for non-consumable IAP products in receipts” compatibility flag is enabled).
This can be triggered when an iOS user clicks [Restore Purchases] on an app. Doing so may cause the transaction to be moved from one brainCloud account to another… (for example – if the iOS user is using a different brainCloud account than when they originally made the purchase).
Note that this sort of activity could also theoretically happen if your app has been cracked and users are sending stolen (but valid) receipts into brainCloud.
We have enhanced the system to keep track of all users that have processed a non-consumable IAP item. The processing history can be viewed by clicking on the new View History menu option on the Monitoring | User Monitoring | Transactions screen.
Library Improvements
All client libraries have been updated to include the 4.13 API additions.
Note that some of the listed improvements were included in 4.12 patches previously.
C++
Upgraded WebSockets for RTT with embedded SSL certification
Reconnect() method returns a failure if previous connection information is not available
Improved build time in Objective-C
Improvements for Android Studio builds
Added response codes and API calls
Java
Added 502 & 504 response code conditions to retry requests.
Reconnect() method returns a failure if previous connection information is not available
Javascript
Reconnect() method returns a failure if previous connection information is not available
Unity
Compressed Responses and Requests are now turned on by default. This should be transparent to your app – but can be disabled by setting EnabledCompressedRequests(false) and EnableCompressedResponses(false).
Reconnect() method returns a failure if previous connection information is not available
Adding Mac OS support for getting country code while initializing the client
Now supports Unity up to 2021.3 LTS
Unreal lib
Plugin supports and ready to use in Unreal Engine 5
Fixes to engine heartbeat not working as intended (also in 4.12.2 patch)
Reconnect() method returns a failure if previous connection information is not available
Moved plugin to standalone release in GitHub for use as git submodule (Improved setup in GitHub?)
Fixed MacOS build error
Added check for failed connection callback
Miscellaneous Improvements
ACL Permissionsfixes
Fixes have been applied to several methods in Global, User and Group Entities.
Be sure to double-check the ACL permissions of you entity objects if you see issues with your app(s)
Custom Entityimprovements
New IncrementSingletonData() API call
Improved locking for Custom Entity Singletons
Deploymentimprovements
Improvements to the web and server components to prevent parallel deployment / import / restore processes
Optimizations to cache notifications to reduce the traffic across the api servers
Added a fail-safe refresh after deployment to ensure that all caches are updated properly
Dormant Userprocessing
Refactored dormant user deletion to add parallel processing (across datastream servers)
Global Files
Fixes to file versioning during deploys and imports (was also patched late in 4.12)
New portal function to manually edit a File’s version on the Design | Custom Config | Global Files page
Groups
The custom data section of Group objects are now indexed on an indexedId field (if it exists). Feel free to set that field, and do searches using it for quick lookups of groups via an alternate id.
Legacy Flagged Users API
We’ve added an API for controlling the users that that appear in the Portal’s flagged users list.
This is legacy system, and not super-scaleable – and thus we have named the methods as such.
Important: Apps are limited to 1000 flagged users max.
The API methods can be found in the GlobalApp service. ← due to the legacy of it’s implementation
Do NOT use these APIs for anything other than tagging users to make them easier to look-up in the portal.
Push Notifications
Improvements to performance of Push Notifications sent to all users of an app
S2S API
Significant improvements to S2S locking – prevents lock timeouts in certain situations
Steamintegration improvements
Steam purchase transaction ids are now prefixed by the appId of the brainCloud app processing them. This reduces situations where the ids may clash if the same Steam information is being used across both dev and production apps in brainCloud.
System now returns more useful information for failed SteamClient validations
Features for Private Licensees
Portal SSO
Improvements to handling of mixed-case email addresses for SSO-connected private deployments
Azure
Improvements to handling of long-lived Azure ServiceBus requests
Portal Changes
We’ve made the following portal changes:
Design Section
Authentication | Passwords
New Passwords screen allows apps to enforce minimum password standards
Cloud Code | API Hooks
Hooks are properly ordered by Service, then Operation in the main screen
Also, when selecting a script for a hook, the scrips are now sorted alphabetically by path
Cloud Code | Scripts
Quick Authenticate now ensures it chooses a platform that is enabled
Optimizations to the script editor – no longer retrieves all scripts when attempting to run the current script!
Custom Config | Global Files
You can now manually adjust the “version” of a file using by choosing Adjust Version from the Action menu.
Integrations | Blockchain
Added new Ultra App blockchain integration to be used by Ultra licensee apps to enable integration with Ultra’s blockchain services – including Uniqs.
Monitoring
Global Monitoring | Custom Entities
Custom Entity collections now displayed in alphabetical order
User Monitoring | Transactions
The processing history of a non-consumable transaction can now be viewed by choosing the View History option from the action menu. Note that the View History menu option will only be available for transactions that have history to view.
API Changes
The following changes/additions have affected the brainCloud API:
Blockchain
New GetUniqs() call added for retrieving Uniqs from the Ultra blockchain
Also new GetBlockchainItems() for other blockchain flavors
Bridge
New VerifySignedJwt() method added to the cloud code bridge to aid in implementing OpenId via External Authentication
Added GetSessionForValidatedCredential() method to the client bridge… (was only in the server bridge before)
Custom Entity Service
New IncrementSingletonData() API call
GlobalApp
New methods for controlling the users that appear in the Portal’s flagged users list. This is legacy system, and not super-scaleable – and thus we have named the methods as such. Do NOT use these APIs for anything other than tagging users to make them easier to look-up in the portal.
Important: Apps are limited to 1000 flagged users max.
The new methods are: SysAddLegacyFlaggedUser(), SysGetLegacyFlaggedUserData(), SysGetLegacyFlaggedUserDataList(), SysRemoveFromLegacyFlaggedUsers(), SysUpdateLegacyFlaggedUser()
Group Service
New cloud code only SysAddGroupMember() call adds the specified member to the group immediately (irregardless of the permissions of the current user)
Leaderboard Service
SysCreateLeaderboardConfig() and SysEditLeaderboardConfig() methods updated to access the new expireInMins field. Select methods like SysGetLeaderboardConfig() now return an expiry field with the calculated epoch expiry.
RTT
New RegisterBlockchainCallback() and DeregisterBlockchainCallback() methods enable registering for real-time blockchain changes
Script Service
Added new cloud code only SysCancelScheduledScriptIfExists() call which as the name implies, cancels a script if it exists – but more importantly, does not return an error if it does not!
Added new cloud code only SysCancelUserScriptBatchIfExists() to do the same for batch script processing
Miscellaneous Changes / Fixes
The following issues have been addressed in this release:
BCLOUD-1257 – Getting NPE When Paginating in the Server logs Page
BCLOUD-1728 – [Internal] The “Localize in” field stuck when user made a changes and click on Cancel button
BCLOUD-2050 – [Internal] Cloud Code – Scripts page, when user “Export All Scripts” and single “Export Script” in the TEAM | Audit Log shows duplicate entries for the exported
BCLOUD-2084 – JoinDivision and SysGetLeaderboardConfig responses to include timestamp division set instance leaderboard was created at
BCLOUD-2113 – Missing translation “Details for” on Monitoring | Global Monitoring | Redemption Codes page
BCLOUD-2114 – Missing translation “Error! Invalid search criteria. Please enter a minimum of 3 characters.” on User Monitoring | User Summary – Select User
BCLOUD-2115 – Missing translation “Code Info” on Monitoring | Global Monitoring | Redemption Codes page
BCLOUD-2191 – Cache ItemDef collection in app cache
BCLOUD-2260 – Support locking of singleton custom entities by ownerId
BCLOUD-2336 – Avoid SendGrid enabled checking (and logging warnings) for User service “create” APIs when notificationTemplateId input is empty string
BCLOUD-2347 – Issue handling Portal User Emails with mixed cases
BCLOUD-2349 – Return a 503 response status in the event of Memcached timeouts
BCLOUD-2351 – Reset password for email and universalId not trimming or lowercasing “externalId” input
BCLOUD-2352 – Custom Entity SysIncrementData and IncrementData APIs require Sharded versions for sharded custom collections
BCLOUD-2353 – [Internal] Nintendo is not in alphabetical order in Select User Identity list
BCLOUD-2375 – [Internal ] Unlock App dialog ignores changes to the application name
BCLOUD-2376 – Errors in prod-baas for IdentityService ATTACH with Google OpenID
BCLOUD-2396 – Super / Manage / Apps – Search filter is performing the query against the server on EVERY character that is typed.
BCLOUD-2433 – Audit logs missing for a number of update and delete Push Notification settings requests from Portal
BCLOUD-2488 – [Internal] Generate error/warning message when user saves a User Statistics Event without proper Actions
BCLOUD-2499 – Modify Steam IAP order id generation to incorporate app id
BCLOUD-2512 – We should have a way of re-sending end-user email verification emails?
BCLOUD-2525 – PATCH! Need IdentityService.getIdentityData() to be accessible from cloud code scripts!
BCLOUD-2528 – [Internal] Design | Cloud Data | Custom Entities, HTTP Status 500 error message pops up when user create “Migrate:true” entity type collection in portal
BCLOUD-2550 – [Internal ] While IOS platform disabled, the script Quick Authenticate throw exception error message “Processing exception (message): Platform IOS has not been enabled for this app”
BCLOUD-2558 – Legacy Portal – Cloud Code Scripts (remove usage of the “scripts-read” call).
BCLOUD-2601 – When Updating Existing Owned Entity(Custom Collection is Sharded) Incorrect Version is Getting Updated in API Response and Global Monitoring – Custom Entities Page
BCLOUD-2647 – API counts posted for scripts using relative reference to other scripts are failing
BCLOUD-2652 – Refactor purgeSoon User Purge processing to use Consumers
BCLOUD-2771 – Email Auth – Resend Verification
BCLOUD-2781 – Cloud code audit log improvements
BCLOUD-2785 – Add support for CustomEntity IncrementSingletonData API and locking on all “increment” APIs
BCLOUD-2786 – Change audit logs to differentiate “App user-enabled” activity for import/deploy versus “Updated app” (generic)
BCLOUD-2788 – Add new Group service SysAddGroupMember API
BCLOUD-2790 – Clicking a folder-based script execution entry from the API Usage page (under API Errors) is not redirecting to the correct location in the portal (API Errors).
BCLOUD-2791 – After a deployment, the system should set a timer for X seconds, and when it expires, trigger a refresh of the app
BCLOUD-2792 – [Internal] Not able to see newly created app in Admin Tools-Deployment drop-down menu of other app
BCLOUD-2815 – Change Deploys, Import Configuration and Restore to Checkpoint processing to clear new appCache via prefix rather than looping
BCLOUD-2821 – New special “indexedId” field in Group Data
BCLOUD-2861 – Cloud Code – API Explorer – Service script list should be sorted by path+scriptname
BCLOUD-2865 – [Internal ] Super | Manage | Teams page, previous Team Name is saving in delete dialog text field while attempting to delete different team
BCLOUD-2866 – [Internal] Design | Cloud Code | Scripts, when user export single script doesn’t logged in the Audit Log
BCLOUD-2873 – [Internal] Monitoring | User Monitoring | Groups, the ID links don’t use a hand cursor when user hover over to click on the ID links
BCLOUD-2877 – Legacy Portal: Item Management – Make select virtual currency mandatory before the user enters the $ amount
BCLOUD-2880 – User batch script with passed in profileIds list to skip null profileId
BCLOUD-2881 – Enable setting of expiry date to applicable Leaderboard APIs to create or edit leaderboard configs
BCLOUD-2885 – Nightly purge of leaderboard scores for old versions is including gameId in query (slow)
BCLOUD-2891 – Legacy Portal – Monitoring / Global Monitoring / Custom Entities – Apply alphabetical order to entity type list.
BCLOUD-2901 – Total Users value displayed for Super | Manage | Apps isn’t accurate
BCLOUD-2902 – [Internal] When user entering iTunes IAP Product ID no limitation and after 53 characters cutting off
BCLOUD-2904 – [Internal] When user entering Configure Platforms fields no limitation and after 56 characters cutting off
BCLOUD-2908 – Deployment / Import Configuration / Restore to Checkpoint safety measures required to prevent overlap
BCLOUD-2909 – Core App Info – Admin Tools – Deploy configuration button should be disabled when deployment is in progress
BCLOUD-2918 – Legacy Portal – API Key Name is Restricted to Numbers, letters and underscore (_) When Adding a New Key in Edit Profile | Permissions | API Keys Tab
BCLOUD-2921 – Internal – Unlock dialog will display APP ID twice after user selects Cancel on the unlock dialog
BCLOUD-2923 – [Internal ] Deploying to an app with incorrect app name does not show error, instead upon hovering over Deploy button ( active) shows red icon
BCLOUD-2948 – Unreal Engine Heartbeat Not Working As Intended
BCLOUD-2956 – [Internal] French Version – Selecting Group id and Group Name from drop-down menu cut off
BCLOUD-2996 – Legacy Portal – Scripts – API Usage should use new fields returned from the server instead of calculating the values itself.
BCLOUD-2998 – Legacy Portal – If passwords feature not enabled those password rules should not be displayed on the Reset Password page
BCLOUD-3000 – Legacy Portal – User Monitoring | Transactions, adjust the View Transaction to show both dataJson and history
BCLOUD-3002 – Set proper version on target files for deploy
BCLOUD-3029 – JSON Error App not found error generates when deploying to the same app multiple times
BCLOUD-3037 – New app-overridable brainCloud property to control audit logging of leaderboard configuration (create, edit) via Sys or post to dynamic APIs
BCLOUD-3040 – [Legacy] Desing | Gamification – Statistics Event ‘Add User Statistics Event’ pops up dialog has ‘Currencies’, ‘User Statistics’ and ‘Global Statistics’ options are enabled compared to XP Levels page
BCLOUD-3044 – Add some additional logging around 3rd party authentication
BCLOUD-3045 – Legacy Portal – Player Selector – Applicable options in search drop-down not working correctly when language is French.
BCLOUD-3051 – Do some pre-processing on Nintendo externalId
BCLOUD-3054 – [Legacy] Icon of Platforms ‘Oculus’ and ‘Apple watchOS’ are not shown in User Monitoring >User Summary Logged In From section
BCLOUD-3067 – GlobalEntity IncrementGlobalEntityData is not enforcing read-only for other users
BCLOUD-3081 – Entity service Increment User Entity Data APIs are not enforcing read-only for other users
brainCloud 4.12 is a targeted release to get Nintendo Switch Authentication support in place before our summer holidays!
Release Highlights
Nintendo Switch Authentication
brainCloud now supports native Nintendo Switch authentication.
There are now Nintendo variants of all the standard Authentication and Identity calls – see the API Changes section for more details.
Note that so far these calls have been added to the Unity Client library only. The Unreal Client libs will be added soon!
Miscellaneous changes
Bridge-based DEBUG log messages are now free when not debugging! Calling the bridge.logDebug() and bridge.logDebugJson() calls have been heavily optimized to do nothing (when not called from the API Explorer or Script Editor) – so we no longer record API counts for these calls. Note that we do still count API counts for debug log calls made from the Logging service itself ← since those calls still go through our full Dispatcher and DispatchHandler systems. So don’t do that – use the bridge methods instead!
GetUserItemsPage() performance has been improved The GetUserItemsPage() / GetUserItemsPageOffset() calls have been refactored to only refresh the items that are being returned by that page call… (instead of unnecessarily refreshing all items during the initial call).
Improved RTT WebSocket Disconnect Handling in Unreal In addition to triggering on websocket disconnects, our Unreal libraries now also use a heartbeat timeout to detect disconnects (useful in platforms like IOS where the disconnect notification can take a while to arrive).
Improved Country Code, Language Code, and TimeZoneOffset handling Both the Unity and Unreal client libraries have been enhanced to detect country code, language code, and timezone offset on more platforms (and we’ll be making more improvements in the future).
Portal Changes
We have made the following portal changes:
Design Section
Core App Info | Platforms
Added Nintendo to the platforms list
Monitoring
Global Monitoring | Custom Entities
Added sortable Updated At column to custom entity list screens
User Monitoring | Select User
Added ability to search by Nintendo (Network Services Account) ID
User Monitoring | User Summary
A user’s Nintendo ID will now be shown in the Credentials section of this screen
User Monitoring | Custom Entities
Added sortable Updated At column to custom entity list screens
Reporting
Analytics
Enhanced to show Nintendo platform players
API Changes
The following changes/additions have affected the brainCloud API:
BrainCloudWrapper
Added AuthenticateNintendo() and SmartSwitchAuthenticateNintendo() calls
Authentication Service
Added AuthenticateNintendo() call
Identity Service
Added AttachNintendoIdentity(), DetachNintendoIdentity() and MergeNintendoIdentity() calls
Miscellaneous Changes / Fixes
Updated libraries
4.12 version of all client libs are available.
The Unity and Unreal libs in particular have significant features and improvements in this release – go grab ’em!
Documentation updates
The latest APIs have been added to the API Reference.