Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
6bc5d83
feat: Add LootLockerLifecycleManager for centralized service management
kirre-bylund Nov 11, 2025
1c2a241
refactor: Convert RateLimiter to ILootLockerService architecture
kirre-bylund Nov 11, 2025
9ffc1cb
refactor: Integrate HTTPClient with LifecycleManager service architec…
kirre-bylund Nov 11, 2025
9b59100
feat: Add LootLockerEventSystem for centralized SDK event management
kirre-bylund Nov 11, 2025
8703454
feat: Add comprehensive Presence system with WebSocket real-time conn…
kirre-bylund Nov 11, 2025
443db1e
feat: Integrate event system and presence features into LootLockerSDK…
kirre-bylund Nov 11, 2025
a37fb58
refactor: Update editor extensions and endpoints for lifecycle manage…
kirre-bylund Nov 11, 2025
6591fd6
Apply suggestions from code review
kirre-bylund Nov 12, 2025
0419644
fix: Support C# <v8
kirre-bylund Nov 12, 2025
55c107f
fix: Tested working state
kirre-bylund Nov 13, 2025
8917ebe
depr: Remove legacy HTTP Stack completely
kirre-bylund Nov 13, 2025
4b0beaf
fix: Stop event subs from non enabled presence clients
kirre-bylund Nov 14, 2025
2d93a4b
feat: Delay status update if client is starting
kirre-bylund Nov 14, 2025
9f4651a
fix: Make presence client latency one way instead of round trip'
kirre-bylund Nov 18, 2025
78b73e8
fix: Reduce code duplication in LootLockerEventSystem
kirre-bylund Nov 18, 2025
8a653f6
refactor: Make presence state change an actual event
kirre-bylund Nov 19, 2025
6288647
fix: Rename presence interface to clarify it's meant as overrides
kirre-bylund Nov 19, 2025
f588b5d
fix: Simplify presence configuration
kirre-bylund Nov 19, 2025
fc83180
fixes after review
kirre-bylund Nov 19, 2025
828490c
fix: Prettify settings and test
kirre-bylund Nov 19, 2025
20a14cc
feat: Add mini feature - clear player data cache in editor
kirre-bylund Nov 19, 2025
0682972
ci: Add presence tests
kirre-bylund Nov 20, 2025
57cabad
ci: Enable presence in CI
kirre-bylund Nov 20, 2025
53d8b53
fix: Fixes after review
kirre-bylund Nov 20, 2025
f149dac
f
kirre-bylund Nov 20, 2025
e51d106
Rebase and add command line config
kirre-bylund Nov 20, 2025
8bd09aa
Fixes after review
kirre-bylund Nov 20, 2025
4fd32c0
fix: Stop parsing presence cli args if not enabled
kirre-bylund Nov 20, 2025
9c5a745
fix: Shore up instance access to avoid null references
kirre-bylund Nov 20, 2025
b2c7488
chore: Deduplicate presence manager code
kirre-bylund Nov 21, 2025
9c48e37
fix: Reset Player Caches between tests
kirre-bylund Nov 21, 2025
5844ee5
fix: Check multi user test strings for null or empty
kirre-bylund Nov 21, 2025
92bfb36
ci: Enable Presence title config for presence tests
kirre-bylund Nov 25, 2025
045e8de
temp: Set only presence tests to run
kirre-bylund Nov 26, 2025
cf63f59
fix: Make PresenceClient disconnect using single method
kirre-bylund Nov 26, 2025
b6d039a
Revert "temp: Set only presence tests to run"
kirre-bylund Nov 26, 2025
669a805
ci: Make presence run less often
kirre-bylund Nov 26, 2025
5ae19c1
ci: Make rate limiter in tests initialize as gameobject
kirre-bylund Nov 26, 2025
1f1c07e
wip: Debug lifecycle init failure in CI
kirre-bylund Nov 26, 2025
7f54b23
fix: Use internal subscriber clearing on event system destroy
kirre-bylund Nov 26, 2025
a61c0cd
fix: Stop using event system during shut down
kirre-bylund Nov 26, 2025
9874a79
chore: Reduce log level for semi expected errors
kirre-bylund Nov 26, 2025
279bd14
fix: Take appropriate actions when presence enabled state changes
kirre-bylund Nov 27, 2025
c66c996
chore: Cleanup of presence during review
kirre-bylund Nov 27, 2025
297b293
fix: Format changes after review
kirre-bylund Dec 4, 2025
031fbcb
fix: Restructure LifecycleManager after review
kirre-bylund Dec 8, 2025
cff3f37
fix: Restructure LootLockerPresenceClient after review
kirre-bylund Dec 8, 2025
59d04dd
fix: Disable warning for compile def. unreachable code
kirre-bylund Dec 8, 2025
5c83a03
fix: Stop creating instances when entering playmode
kirre-bylund Dec 8, 2025
0f566df
fix: Null check languages in broadcasts
kirre-bylund Dec 9, 2025
a669ad4
fix: Refactor PresenceManager after review
kirre-bylund Dec 9, 2025
f2f385f
fix: Adressed the last remaining review comments
kirre-bylund Dec 9, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions .github/workflows/run-tests-and-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -465,15 +465,15 @@ jobs:
- name: Enable beta features
run: |
sed -i -e 's/1: LOOTLOCKER_COMMANDLINE_SETTINGS/1: LOOTLOCKER_COMMANDLINE_SETTINGS;${{ VARS.CURRENT_BETA_FEATURES }}/g' TestProject/ProjectSettings/ProjectSettings.asset
- name: Enable Presence Compile flag but disable runtime presence usage by default
run: |
sed -i -e 's/1: LOOTLOCKER_COMMANDLINE_SETTINGS/1: LOOTLOCKER_COMMANDLINE_SETTINGS;LOOTLOCKER_ENABLE_PRESENCE/g' TestProject/ProjectSettings/ProjectSettings.asset
echo "PRESENCE_CONFIG=-enablepresence false -enablepresenceautoconnect false -enablepresenceautodisconnectonfocuschange false" >> $GITHUB_ENV
- name: Set the project to use Newtonsoft json
if: ${{ ENV.JSON_LIBRARY == 'newtonsoft' }}
run: |
sed -i -e 's/1: LOOTLOCKER_COMMANDLINE_SETTINGS/1: LOOTLOCKER_COMMANDLINE_SETTINGS;LOOTLOCKER_USE_NEWTONSOFTJSON/g' TestProject/ProjectSettings/ProjectSettings.asset
sed -i -e 's/"nunit.framework.dll"/"nunit.framework.dll",\n\t\t"Newtonsoft.Json.dll"/g' sdk/Tests/LootLockerTests/PlayMode/PlayModeTests.asmdef
- name: Use Legacy HTTP Stack
if: ${{ ENV.USE_HTTP_EXECUTION_QUEUE == 'false' }}
run: |
sed -i -e 's/1: LOOTLOCKER_COMMANDLINE_SETTINGS/1: LOOTLOCKER_COMMANDLINE_SETTINGS;LOOTLOCKER_LEGACY_HTTP_STACK/g' TestProject/ProjectSettings/ProjectSettings.asset
- name: Set LootLocker to target stage environment
if: ${{ ENV.TARGET_ENVIRONMENT == 'STAGE' }}
run: |
Expand Down Expand Up @@ -520,7 +520,7 @@ jobs:
checkName: Integration tests (${{ matrix.unityVersion }}-${{ ENV.JSON_LIBRARY }}) Test Results
artifactsPath: ${{ matrix.unityVersion }}-${{ ENV.JSON_LIBRARY }}-artifacts
githubToken: ${{ secrets.GITHUB_TOKEN }}
customParameters: -lootlockerurl ${{ ENV.LOOTLOCKER_URL }} ${{ ENV.USER_COMMANDLINE_ARGUMENTS }} ${{ ENV.TEST_CATEGORY }}
customParameters: -lootlockerurl ${{ ENV.LOOTLOCKER_URL }} ${{ ENV.USER_COMMANDLINE_ARGUMENTS }} ${{ ENV.TEST_CATEGORY }} ${{ ENV.PRESENCE_CONFIG }}
useHostNetwork: true
####### CLEANUP ###########
- name: Bring down Go Backend
Expand Down
43 changes: 43 additions & 0 deletions Runtime/Client/ILootLockerService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
namespace LootLocker
{
/// <summary>
/// Interface that all LootLocker services must implement to be managed by the LifecycleManager
/// </summary>
public interface ILootLockerService
{
/// <summary>
/// Initialize the service
/// </summary>
void Initialize();

/// <summary>
/// Reset/cleanup the service state
/// </summary>
void Reset();

/// <summary>
/// Handle application pause events (optional - default implementation does nothing)
/// </summary>
void HandleApplicationPause(bool pauseStatus);

/// <summary>
/// Handle application focus events (optional - default implementation does nothing)
/// </summary>
void HandleApplicationFocus(bool hasFocus);

/// <summary>
/// Handle application quit events
/// </summary>
void HandleApplicationQuit();

/// <summary>
/// Whether the service has been initialized
/// </summary>
bool IsInitialized { get; }

/// <summary>
/// Service name for logging and identification
/// </summary>
string ServiceName { get; }
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 4 additions & 0 deletions Runtime/Client/LootLockerEndPoints.cs
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,10 @@ public class LootLockerEndPoints
// Broadcasts
[Header("Broadcasts")]
public static EndPointClass ListBroadcasts = new EndPointClass("broadcasts/v1", LootLockerHTTPMethod.GET);

// Presence (WebSocket)
[Header("Presence")]
public static EndPointClass presenceWebSocket = new EndPointClass("presence/v1", LootLockerHTTPMethod.GET);
}

[Serializable]
Expand Down
Loading
Loading