Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
40 changes: 37 additions & 3 deletions Assets/PlayroomKit/Tests/Editor/PlayerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -257,13 +257,47 @@ public void Kick_CallsInvokeKickInternal_CallbackIsInvoked()
public void WaitForState_WhenInitialized_CallsWaitForPlayerStateWrapperWithCorrectParameters()
{
// Arrange
Action<string> onStateSetCallback = (data) => { Debug.Log("data: " + data); };
string callbackId = null;
string receivedData = null;
string testData = "TestStateData";

Action<string> onStateSetCallback = (data) =>
{
receivedData = data;
};

Action<string, string> internalCallback = null;

// Set up the mock to capture the callback and callbackId when WaitForPlayerStateWrapper is called
_interop.When(x => x.WaitForPlayerStateWrapper(
Arg.Any<string>(), // id
Arg.Any<string>(), // stateKey
Arg.Any<Action<string, string>>(), // callback
Arg.Any<string>() // callbackId
))
.Do(callInfo =>
{
// Capture the callback and callbackId for later use
internalCallback = callInfo.ArgAt<Action<string, string>>(2);
callbackId = callInfo.ArgAt<string>(3);
});

// Act
_player.WaitForState(testKey, onStateSetCallback);

// Assert
_interop.Received(1).WaitForPlayerStateWrapper(testId, testKey, onStateSetCallback);
// Capture internal callback and callbackId from wrapper
_interop.Received(1).WaitForPlayerStateWrapper(
testId,
testKey,
Arg.Any<Action<string, string>>(),
Arg.Any<string>()
);

// Simulate invoking the callback from the interop layer
internalCallback?.Invoke(testData, callbackId);

//Assert
Assert.AreEqual(testData, receivedData, "Expected the received data to match the test data.");
}
}
}
47 changes: 41 additions & 6 deletions Assets/PlayroomKit/Tests/Editor/PlayroomKitTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -325,20 +325,55 @@ void Callback2(string data)
_interop.Received(1).WaitForStateWrapper("state", Arg.Any<Action<string, string>>());
}


[Test]
public void WaitForPlayerState_ShouldInvokeInternal_WhenCalled()
{
void Callback(string data)
// Arrange
string callbackId = null;
string receivedData = null;
string testData = "TestStateData";

Action<string> onStateSetCallback = (data) =>
{
Debug.Log($"Callback called!: " + data);
}
receivedData = data;
};

Action<string, string> internalCallback = null;

var playerId = "1234";
var state = "state";

_playroomKit.WaitForPlayerState(playerId, state, Callback);
_interop.Received(1).WaitForPlayerStateWrapper(playerId, state, Arg.Any<Action<string>>());
// Set up the mock to capture the callback and callbackId when WaitForPlayerStateWrapper is called
_interop.When(x => x.WaitForPlayerStateWrapper(
Arg.Any<string>(), // id
Arg.Any<string>(), // stateKey
Arg.Any<Action<string, string>>(), // callback
Arg.Any<string>() // callbackId
))
.Do(callInfo =>
{
// Capture the callback and callbackId for later use
internalCallback = callInfo.ArgAt<Action<string, string>>(2);
callbackId = callInfo.ArgAt<string>(3);
});


// Act
_playroomKit.WaitForPlayerState(playerId, state, onStateSetCallback);

// Capture internal callback and callbackId from wrapper
_interop.Received(1).WaitForPlayerStateWrapper(
playerId,
state,
Arg.Any<Action<string, string>>(),
Arg.Any<string>()
);

// Simulate invoking the callback from the interop layer
internalCallback?.Invoke(testData, callbackId);

//Assert
Assert.AreEqual(testData, receivedData, "Expected the received data to match the test data.");
}

[Test]
Expand Down
3 changes: 2 additions & 1 deletion Assets/PlayroomKit/modules/Headers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ private static extern void InsertCoinInternal(string options,

[DllImport("__Internal")]
private static extern void WaitForPlayerStateInternal(string playerID, string stateKey,
Action<string> onStateSetCallback = null);
Action<string, string> onStateSetCallback, string callbackID);


[DllImport("__Internal")]
private static extern string GetPlayroomTokenInternal();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ void InsertCoinWrapper(string options,

void WaitForStateWrapper(string stateKey, Action<string, string> onStateSetCallback);

void WaitForPlayerStateWrapper(string playerID, string stateKey, Action<string> onStateSetCallback);
void WaitForPlayerStateWrapper(string playerID, string stateKey, Action<string, string> onStateSetCallback, string callbackID);

void ResetStatesWrapper(string keysToExclude = null, Action OnStatesReset = null);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,9 @@ public void KickPlayerWrapper(string playerID, Action onKickCallback = null)

// Wrapper for WaitForPlayerStateInternal
public void WaitForPlayerStateWrapper(string playerID, string stateKey,
Action<string> onStateSetCallback = null)
Action<string, string> onStateSetCallback, string callbackID)
{
WaitForPlayerStateInternal(playerID, stateKey, onStateSetCallback);
WaitForPlayerStateInternal(playerID, stateKey, onStateSetCallback, callbackID);
}

// Wrapper for SetPlayerStateByPlayerId (int version)
Expand Down Expand Up @@ -289,7 +289,6 @@ public void OpenDiscordInviteDialogInternalWrapper(Action callback = null)
OpenDiscordInviteDialogInternal(callback);
}


#endregion
}
}
Expand Down
12 changes: 5 additions & 7 deletions Assets/PlayroomKit/modules/Player/PlayerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -196,18 +196,16 @@ private static void InvokeLeaveRoom()
IPlayerBase.onKickCallBack?.Invoke();
}

private static Action<string> onSetState;

public void WaitForState(string stateKey, Action<string> onStateSetCallback = null)
{
onSetState = onStateSetCallback;
_interop.WaitForPlayerStateWrapper(_id, stateKey, InvokeKickCallBack);
string callbackId = CallbackManager.RegisterCallback(onStateSetCallback);
_interop.WaitForPlayerStateWrapper(_id, stateKey, InvokeOnSetStateCallBack, callbackId);
}

[MonoPInvokeCallback(typeof(Action<string>))]
private static void InvokeKickCallBack(string data)
[MonoPInvokeCallback(typeof(Action<string, string>))]
private static void InvokeOnSetStateCallBack(string data, string callbackId)
{
onSetState?.Invoke(data);
CallbackManager.InvokeCallback(callbackId, data);
}

[MonoPInvokeCallback(typeof(Action))]
Expand Down
12 changes: 5 additions & 7 deletions Assets/PlayroomKit/modules/PlayroomBuildService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -302,12 +302,10 @@ public void WaitForState(string stateKey, Action<string> onStateSetCallback = nu
_interop.WaitForStateWrapper(stateKey, IPlayroomBase.InvokeCallback);
}

Action<string> WaitForPlayerCallback = null;

public void WaitForPlayerState(string playerID, string stateKey, Action<string> onStateSetCallback = null)
{
WaitForPlayerCallback = onStateSetCallback;
_interop.WaitForPlayerStateWrapper(playerID, stateKey, OnStateSetCallback);
string callbackID = CallbackManager.RegisterCallback(onStateSetCallback);
_interop.WaitForPlayerStateWrapper(playerID, stateKey, OnStateSetCallback, callbackID);
}

public void ResetStates(string[] keysToExclude = null, Action onStatesReset = null)
Expand Down Expand Up @@ -576,10 +574,10 @@ private static void InvokeInsertCoin(string key)
#endif
}

[MonoPInvokeCallback(typeof(Action<string>))]
void OnStateSetCallback(string data)
[MonoPInvokeCallback(typeof(Action<string, string>))]
void OnStateSetCallback(string data, string callbackId)
{
WaitForPlayerCallback?.Invoke(data);
CallbackManager.InvokeCallback(callbackId, data);
}

[MonoPInvokeCallback(typeof(Action))]
Expand Down
7 changes: 4 additions & 3 deletions Assets/PlayroomKit/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,8 @@ mergeInto(LibraryManager.library, {
WaitForPlayerStateInternal: function (
playerId,
stateKey,
onStateSetCallback
onStateSetCallback,
callbackIdPtr
) {
if (!window.Playroom) {
console.error(
Expand All @@ -767,7 +768,7 @@ mergeInto(LibraryManager.library, {
reject("Playroom library not loaded");
return;
}

const callbackId = UTF8ToString(callbackIdPtr);
const players = Playroom.Multiplayer().getPlayers()

if (typeof players !== "object" || players === null) {
Expand All @@ -784,7 +785,7 @@ mergeInto(LibraryManager.library, {
stateKey = UTF8ToString(stateKey);
Playroom.waitForPlayerState(playerState, stateKey)
.then((stateVal) => {
{{{ makeDynCall('vi', 'onStateSetCallback') }}}(stringToNewUTF8(stateVal))
{{{ makeDynCall('vii', 'onStateSetCallback') }}}(stringToNewUTF8(stateVal), stringToNewUTF8(callbackId))
})
.catch((error) => {
console.error("Error waiting for state:", error);
Expand Down