Release v8.2.0 - #486
Merged
Merged
Release v8.2.0#486
Conversation
Adds support for GET /game/platform-keys/v1 returning platform keys redeemed by the authenticated player. - New DTOs: LootLockerPlatformKeyCampaign, LootLockerPlatformKey, LootLockerListPlatformKeysResponse - New endpoint in LootLockerEndPoints: listPlatformKeys - New SDKManager method: ListPlatformKeys() with optional forPlayerWithUlid
- Added MonoImporter section to PlatformKeyRequests.cs.meta to match other script meta files in the folder - Added @defgroup PlatformKeys entry in .doxygen/groups.dox so the new API appears in generated documentation
- Removed custom_fields from LootLockerWhiteLabelUserRequest so login requests no longer serialize an unexpected custom_fields field - Created LootLockerWhiteLabelSignUpRequest inheriting from the base user request and carrying custom_fields - Updated both WhiteLabelSignUp overloads to use the signup-specific request type - Fixed @params JSON escaping assertion to match escaped inner quotes - Removed Debug.Log line that printed the full sign-up request (including password) to CI logs - Fixed assert message wording to describe failure instead of success Addresses review comments on PR #481
- Add revision handling for files - Add optional `key` parameter to FileStream upload overloads - Add 19 PlayMode tests covering key-based upload/upsert, key-based lookup/delete, file revisions (by ID and by key), and response field verification
…onnectGooglePlayGames Adds four new connected account methods and their request types, plus the google_play_games = 11 enum value in LootLockerAccountProvider.
Defaults to true. When false, session start fails with 404 if no profile exists.
…Writer() Adds integer read/write to the state writer interface with PlayerPrefs and no-op implementations, plus a public accessor on LootLockerSDKManager.
Prevents timing drift when Time.timeScale is modified (e.g., paused games). Affects health checks, presence reconnect/ping, purchase polling, and remote session polling.
…able warnings - Groups log settings and presence settings into collapsible foldouts - Presence sub-settings now always visible (not gated behind enablePresence) - Removes unused ValidateClearLocalPlayerData method - Adds #pragma warning disable 0162 for compile-time constant branches - Adds [InspectorName(null)] on NotSet enum value
Contributor
Author
✅ Release PR Validation Passed
|
kirre-bylund
force-pushed
the
release/v8.2.0
branch
from
September 2, 2026 12:30
dd26912 to
b7cea13
Compare
3 tasks
Unity 6.5+ obsoletes Object.GetInstanceID with a compile error (CS0619), which broke the SDK on Unity 6.5/6.6. Guard the migration behind UNITY_6000_5_OR_NEWER so older supported editors keep working. Also add tests locking in the IANA timezone casing/sign convention produced by LootLockerTimezoneConverter (Etc/GMT, not ETC/GMT). Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Tag tests with the LootLockerCI category so they run on PRs targeting main. - The out-of-range clamping assertions only hold from UNITY_2021_1_OR_NEWER, since the converter only clamps under that define; guard them accordingly.
Adds SDK support for the new inventory system (internally "Assets 2.0"),
publicly named Items and Item Templates.
Game API endpoints (base player/inventory/v1):
- GET / ListItemTemplates
- GET /my ListPlayerItems
- GET /{id} GetPlayerItem
- DELETE /{id} DeletePlayerItem
- POST /{id}/consume ConsumePlayerItem
- POST /{id}/split SplitPlayerItemStack
- POST /merge MergePlayerItemStacks
Notes:
- List responses use LootLockerExtendedPagination (the backend returns an
extended offset pagination shape, not the simple page/per_page/total).
- metadata is typed as LootLockerMetadataEntry[].
- consumable is a nullable bool so "no filter" remains reachable; the backend
only applies the filter when the query value is non-empty.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add ShouldSerializecount() to LootLockerConsumeItemRequest so an unset count is
omitted entirely. This removes the Newtonsoft/ZeroDep asymmetry (only ZeroDep
skips nulls) and avoids sending {"count":null}, which cannot decode into uint64.
- Correct the consume count documentation: the backend defaults to 1, not the
whole stack. To consume an entire stack, pass the item's current count.
- Remove the incorrect "Defaults to 1." / "Defaults to 25." claims from the
page/perPage docs on ListItemTemplates and ListPlayerItems; both are required.
- Add the missing ItemRequest.cs.meta file.
- Add inventory and item_template to LootLockerMetadataSources and correct the
misleading item comment (item is the legacy source, inventory is Assets 2.0).
- Add 7 serialization/deserialization tests covering the new item endpoints.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Address PR review feedback on the Items / Item Templates DTOs: - Remove game_id from item and item template DTOs; the SDK always operates in a game context so the field is redundant. - Type item_type as LootLockerItemType instead of string. - Type created_at / updated_at as DateTime (updated_at nullable, since the backend omits it when unset). - Type granted item `type` as the new LootLockerRewardKind enum. - Add `source` to LootLockerItemSortField. - Only append query parameters when they carry a meaningful value, so unset filters are not sent as empty/zero values. - Inline the seven item methods from the LootLockerAPIManager partial class into LootLockerSDKManager, matching the convention used by the rest of the SDK. - Update the item JSON tests for the new types. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add PlayMode coverage for the seven item endpoints against a live backend, using the admin API for setup (create template with a public audience, grant to the session player). - Add admin endpoint constants for the item template and player inventory routes. - Add a LootLockerTestItems helper mirroring the go-backend admin routes rather than the published ApiDog spec, which is stale for this feature: the list endpoint returns `templates` (not `items`), grant returns `id` (not `inventory_id`), consume requires a body and returns a count (not a bool), and the player inventory listing uses `template_name` and has no `deletable`. - Add ItemTests with 10 cases covering list templates, list player items (with and without filters), get, partial and whole-stack consume, split, merge, delete, and the forbidden delete of a non-deletable item. - Only the happy-path test carries LootLockerCIFast; the rest are LootLockerCI only. Also correct the ConsumePlayerItem doc comment: a null count consumes a single item, not the whole stack, matching the backend default. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Carry the "inventory" concept through to the end user for the Assets 2.0 (Items / Item Templates) surface, and align the metadata source with the backend rename. - Metadata source `inventory` -> `inventory_item` (numeric value unchanged). - Public methods renamed, e.g. `ListPlayerItems` -> `ListPlayerInventoryItems`, `GetPlayerItem` -> `GetPlayerInventoryItem`, `ConsumePlayerItem` -> `ConsumePlayerInventoryItem`, `DeletePlayerItem` -> `DeletePlayerInventoryItem`, `SplitPlayerItemStack` -> `SplitPlayerInventoryItemStack`, `MergePlayerItemStacks` -> `MergePlayerInventoryItemStacks`, `GrantItemToPlayer` -> `GrantItemToPlayerInventory`. - DTOs renamed to match, e.g. `LootLockerItem` -> `LootLockerInventoryItem`. - Endpoint constants and the test surface renamed to match. These methods deal with items and item templates. They are unrelated to the pre-existing asset/asset-instance inventory methods (`GetInventory`, `ListPlayerInventory`, `ListCharacterInventory`, ...), which share the `player/inventory` URL prefix. Doc comments on both families now state this explicitly. Item templates are not inventory, so `ListItemTemplates` and the template, type, sort-field and reward types keep their names. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
The generated test project did not set `insecureHttpOption`, so every request to the local devenv (plain http on localhost:8080) failed with `InvalidOperationException: Insecure connection not allowed`. The CI workflow sets this for `TARGET_ENVIRONMENT=LOCAL`, but the local runner script did not, which meant local functional tests could never reach the local backend. Set it when `-UseLocalEnv` is passed. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add the no-count consume overload so callers can use the documented default. Apply localhost HTTP and command-line routing settings to reused and custom Unity projects, not just freshly generated test projects. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Revision timestamps are stored with second granularity, so two revisions created within the same second share an identical created_at. When the backend orders revisions by created_at the sort is a tie and the relative order of those revisions is undefined, which makes the revision ordering assertions flaky. Wait one second between the operations that create revisions so each revision gets a distinct timestamp. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Contributor
Author
|
✅ Release v8.2.0 created. Workflows now running:
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Features
auto_create_profileto session requests so profiles can be created automatically.GetLocalIanaTimezone,GetCurrentUTCOffsetAsIanaTimezone,IsValidIanaTimezone) for session timezone support.GetStateWriter()and addedGetInt/SetInttoILootLockerStateWriter.Better Fileschanges.Fixes
WaitForSecondsand were affected byTime.timeScale; they now useWaitForSecondsRealtime.Object.GetInstanceIDis obsolete; the SDK now usesGetEntityIdon those versions.item_typeis now an enum, timestamps areDateTime, and unset filters are no longer sent as empty values.Refactoring
ListPlayerItemstoListPlayerInventoryItems, andLootLockerItemtoLootLockerInventoryItem) to distinguish them from the pre-existing asset and asset-instance inventory methods. The metadata sourceinventorywas renamed toinventory_item.Full Changelog: v8.1.1...v8.2.0