From e3b99b7f2fc77b1448c068d51db250ff10bcc6bb Mon Sep 17 00:00:00 2001 From: TORISOUP Date: Thu, 19 Sep 2024 17:10:32 +0900 Subject: [PATCH 1/2] =?UTF-8?q?WhenAny=E3=81=AE=E3=82=AD=E3=83=A3=E3=83=B3?= =?UTF-8?q?=E3=82=BB=E3=83=AB=E6=BC=8F=E3=82=8C=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Plugins/Pun2Task/Pun2TaskNetwork.cs | 377 +++++++++++++-------- 1 file changed, 244 insertions(+), 133 deletions(-) diff --git a/Assets/Plugins/Pun2Task/Pun2TaskNetwork.cs b/Assets/Plugins/Pun2Task/Pun2TaskNetwork.cs index a83e092..4a883de 100644 --- a/Assets/Plugins/Pun2Task/Pun2TaskNetwork.cs +++ b/Assets/Plugins/Pun2Task/Pun2TaskNetwork.cs @@ -22,21 +22,30 @@ public static class Pun2TaskNetwork /// Throw when connection to server fails. public static async UniTask ConnectUsingSettingsAsync(CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnConnectedToMasterAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnDisconnectedAsync(token)); - - var result = PhotonNetwork.ConnectUsingSettings(); - if (!result) + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try { - throw new InvalidNetworkOperationException(nameof(ConnectUsingSettingsAsync) + - " is not ready to connect."); - } + var task = UniTask.WhenAny( + Pun2TaskCallback.OnConnectedToMasterAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnDisconnectedAsync(cts.Token)); - var (winIndex, _, disconnectCause) = await task; + var result = PhotonNetwork.ConnectUsingSettings(); + if (!result) + { + throw new InvalidNetworkOperationException(nameof(ConnectUsingSettingsAsync) + + " is not ready to connect."); + } - if (winIndex == 0) return; - throw new ConnectionFailedException(disconnectCause); + var (winIndex, _, disconnectCause) = await task; + + if (winIndex == 0) return; + throw new ConnectionFailedException(disconnectCause); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -52,21 +61,30 @@ public static async UniTask ConnectUsingSettingsAsync( bool startInOfflineMode = false, CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnConnectedToMasterAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnDisconnectedAsync(token)); - - var result = PhotonNetwork.ConnectUsingSettings(appSettings, startInOfflineMode); - if (!result) + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try { - throw new InvalidNetworkOperationException(nameof(ConnectUsingSettingsAsync) + - " is not ready to connect."); - } + var task = UniTask.WhenAny( + Pun2TaskCallback.OnConnectedToMasterAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnDisconnectedAsync(cts.Token)); - var (winIndex, _, disconnectCause) = await task; + var result = PhotonNetwork.ConnectUsingSettings(appSettings, startInOfflineMode); + if (!result) + { + throw new InvalidNetworkOperationException(nameof(ConnectUsingSettingsAsync) + + " is not ready to connect."); + } - if (winIndex == 0) return; - throw new ConnectionFailedException(disconnectCause); + var (winIndex, _, disconnectCause) = await task; + + if (winIndex == 0) return; + throw new ConnectionFailedException(disconnectCause); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -84,20 +102,30 @@ public static async UniTask ConnectToMasterAsync( string appID, CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnConnectedToMasterAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnDisconnectedAsync(token)); - - var result = PhotonNetwork.ConnectToMaster(masterServerAddress, port, appID); - if (!result) + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try { - throw new InvalidNetworkOperationException(nameof(ConnectToMasterAsync) + " is not ready to connect."); - } + var task = UniTask.WhenAny( + Pun2TaskCallback.OnConnectedToMasterAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnDisconnectedAsync(cts.Token)); + + var result = PhotonNetwork.ConnectToMaster(masterServerAddress, port, appID); + if (!result) + { + throw new InvalidNetworkOperationException(nameof(ConnectToMasterAsync) + + " is not ready to connect."); + } - var (winIndex, _, disconnectCause) = await task; + var (winIndex, _, disconnectCause) = await task; - if (winIndex == 0) return; - throw new ConnectionFailedException(disconnectCause); + if (winIndex == 0) return; + throw new ConnectionFailedException(disconnectCause); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -108,21 +136,30 @@ public static async UniTask ConnectToMasterAsync( /// Throw when connection to server fails. public static async UniTask ConnectToBestCloudServerAsync(CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnConnectedToMasterAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnDisconnectedAsync(token)); - - var result = PhotonNetwork.ConnectToBestCloudServer(); - if (!result) + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try { - throw new InvalidNetworkOperationException(nameof(ConnectToBestCloudServerAsync) + - " is not ready to connect."); - } + var task = UniTask.WhenAny( + Pun2TaskCallback.OnConnectedToMasterAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnDisconnectedAsync(cts.Token)); + + var result = PhotonNetwork.ConnectToBestCloudServer(); + if (!result) + { + throw new InvalidNetworkOperationException(nameof(ConnectToBestCloudServerAsync) + + " is not ready to connect."); + } - var (winIndex, _, disconnectCause) = await task; + var (winIndex, _, disconnectCause) = await task; - if (winIndex == 0) return; - throw new ConnectionFailedException(disconnectCause); + if (winIndex == 0) return; + throw new ConnectionFailedException(disconnectCause); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -134,20 +171,30 @@ public static async UniTask ConnectToBestCloudServerAsync(CancellationToken toke /// Throw when connection to server fails. public static async UniTask ConnectToRegionAsync(string region, CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnConnectedToMasterAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnDisconnectedAsync(token)); - - var result = PhotonNetwork.ConnectToRegion(region); - if (!result) + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try { - throw new InvalidNetworkOperationException(nameof(ConnectToRegionAsync) + " is not ready to connect."); - } + var task = UniTask.WhenAny( + Pun2TaskCallback.OnConnectedToMasterAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnDisconnectedAsync(cts.Token)); + + var result = PhotonNetwork.ConnectToRegion(region); + if (!result) + { + throw new InvalidNetworkOperationException(nameof(ConnectToRegionAsync) + + " is not ready to connect."); + } - var (winIndex, _, disconnectCause) = await task; + var (winIndex, _, disconnectCause) = await task; - if (winIndex == 0) return; - throw new ConnectionFailedException(disconnectCause); + if (winIndex == 0) return; + throw new ConnectionFailedException(disconnectCause); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -168,17 +215,26 @@ public static async UniTask DisconnectAsync() /// Throw when connection to server fails. public static async UniTask ReconnectAsync(CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnConnectedToMasterAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnDisconnectedAsync(token)); + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try + { + var task = UniTask.WhenAny( + Pun2TaskCallback.OnConnectedToMasterAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnDisconnectedAsync(cts.Token)); - var result = PhotonNetwork.Reconnect(); - if (!result) throw new InvalidNetworkOperationException("It is not ready to reconnect."); + var result = PhotonNetwork.Reconnect(); + if (!result) throw new InvalidNetworkOperationException("It is not ready to reconnect."); - var (winIndex, _, disconnectCause) = await task; + var (winIndex, _, disconnectCause) = await task; - if (winIndex == 0) return; - throw new ConnectionFailedException(disconnectCause); + if (winIndex == 0) return; + throw new ConnectionFailedException(disconnectCause); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } #endregion @@ -202,16 +258,25 @@ public static async UniTask CreateRoomAsync( string[] expectedUsers = null, CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnJoinedRoomAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnCreateRoomFailedAsync(token)); + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try + { + var task = UniTask.WhenAny( + Pun2TaskCallback.OnJoinedRoomAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnCreateRoomFailedAsync(cts.Token)); - var valid = PhotonNetwork.CreateRoom(roomName, roomOptions, typedLobby, expectedUsers); - if (!valid) throw new InvalidRoomOperationException("It is not ready to create a room."); + var valid = PhotonNetwork.CreateRoom(roomName, roomOptions, typedLobby, expectedUsers); + if (!valid) throw new InvalidRoomOperationException("It is not ready to create a room."); - var (winIndex, _, (returnCode, message)) = await task; - if (winIndex == 0) return; - throw new FailedToCreateRoomException(returnCode, message); + var (winIndex, _, (returnCode, message)) = await task; + if (winIndex == 0) return; + throw new FailedToCreateRoomException(returnCode, message); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } @@ -234,25 +299,34 @@ public static async UniTask JoinOrCreateRoomAsync( string[] expectedUsers = null, CancellationToken token = default) { - var createdRoomTask = Pun2TaskCallback.OnCreatedRoomAsync(token).GetAwaiter(); - var task = UniTask.WhenAny( - Pun2TaskCallback.OnJoinedRoomAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnCreateRoomFailedAsync(token), - Pun2TaskCallback.OnJoinRoomFailedAsync(token)); - - var valid = PhotonNetwork.JoinOrCreateRoom(roomName, roomOptions, typedLobby, expectedUsers); - if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); - - var (winIndex, - _, - (createFailedCode, createFailedMessage), - _) = await task; - return winIndex switch - { - 0 => createdRoomTask.IsCompleted, - 1 => throw new FailedToCreateRoomException(createFailedCode, createFailedMessage), - _ => throw new FailedToJoinRoomException(createFailedCode, createFailedMessage) - }; + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try + { + var createdRoomTask = Pun2TaskCallback.OnCreatedRoomAsync(token).GetAwaiter(); + var task = UniTask.WhenAny( + Pun2TaskCallback.OnJoinedRoomAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnCreateRoomFailedAsync(cts.Token), + Pun2TaskCallback.OnJoinRoomFailedAsync(cts.Token)); + + var valid = PhotonNetwork.JoinOrCreateRoom(roomName, roomOptions, typedLobby, expectedUsers); + if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); + + var (winIndex, + _, + (createFailedCode, createFailedMessage), + _) = await task; + return winIndex switch + { + 0 => createdRoomTask.IsCompleted, + 1 => throw new FailedToCreateRoomException(createFailedCode, createFailedMessage), + _ => throw new FailedToJoinRoomException(createFailedCode, createFailedMessage) + }; + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -267,16 +341,25 @@ public static async UniTask JoinRoomAsync(string roomName, string[] expectedUsers = null, CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnJoinedRoomAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnJoinRoomFailedAsync(token)); + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try + { + var task = UniTask.WhenAny( + Pun2TaskCallback.OnJoinedRoomAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnJoinRoomFailedAsync(cts.Token)); - var valid = PhotonNetwork.JoinRoom(roomName, expectedUsers); - if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); + var valid = PhotonNetwork.JoinRoom(roomName, expectedUsers); + if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); - var (winIndex, _, (returnCode, message)) = await task; - if (winIndex == 0) return; - throw new FailedToJoinRoomException(returnCode, message); + var (winIndex, _, (returnCode, message)) = await task; + if (winIndex == 0) return; + throw new FailedToJoinRoomException(returnCode, message); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -300,22 +383,31 @@ public static async UniTask JoinRandomRoomAsync( string[] expectedUsers = null, CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnJoinedRoomAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnJoinRandomFailedAsync(token)); - - var valid = PhotonNetwork.JoinRandomRoom( - expectedCustomRoomProperties, - expectedMaxPlayers, - matchingType, - typedLobby, - sqlLobbyFilter, - expectedUsers); - if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); - - var (winIndex, _, (returnCode, message)) = await task; - if (winIndex == 0) return; - throw new FailedToJoinRoomException(returnCode, message); + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try + { + var task = UniTask.WhenAny( + Pun2TaskCallback.OnJoinedRoomAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnJoinRandomFailedAsync(cts.Token)); + + var valid = PhotonNetwork.JoinRandomRoom( + expectedCustomRoomProperties, + expectedMaxPlayers, + matchingType, + typedLobby, + sqlLobbyFilter, + expectedUsers); + if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); + + var (winIndex, _, (returnCode, message)) = await task; + if (winIndex == 0) return; + throw new FailedToJoinRoomException(returnCode, message); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -327,16 +419,25 @@ public static async UniTask JoinRandomRoomAsync( /// Throw when you fail to join the room. public static async UniTask RejoinRoomAsync(string roomName, CancellationToken token = default) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnJoinedRoomAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnJoinRoomFailedAsync(token)); + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try + { + var task = UniTask.WhenAny( + Pun2TaskCallback.OnJoinedRoomAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnJoinRoomFailedAsync(cts.Token)); - var valid = PhotonNetwork.RejoinRoom(roomName); - if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); + var valid = PhotonNetwork.RejoinRoom(roomName); + if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); - var (winIndex, _, (returnCode, message)) = await task; - if (winIndex == 0) return; - throw new FailedToJoinRoomException(returnCode, message); + var (winIndex, _, (returnCode, message)) = await task; + if (winIndex == 0) return; + throw new FailedToJoinRoomException(returnCode, message); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -347,16 +448,25 @@ public static async UniTask RejoinRoomAsync(string roomName, CancellationToken t /// Throw when you fail to join the room. public static async UniTask ReconnectAndRejoinAsync(CancellationToken token) { - var task = UniTask.WhenAny( - Pun2TaskCallback.OnJoinedRoomAsync(token).AsAsyncUnitUniTask(), - Pun2TaskCallback.OnJoinRoomFailedAsync(token)); + var cts = CancellationTokenSource.CreateLinkedTokenSource(token); + try + { + var task = UniTask.WhenAny( + Pun2TaskCallback.OnJoinedRoomAsync(cts.Token).AsAsyncUnitUniTask(), + Pun2TaskCallback.OnJoinRoomFailedAsync(cts.Token)); - var valid = PhotonNetwork.ReconnectAndRejoin(); - if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); + var valid = PhotonNetwork.ReconnectAndRejoin(); + if (!valid) throw new InvalidRoomOperationException("It is not ready to join a room."); - var (winIndex, _, (returnCode, message)) = await task; - if (winIndex == 0) return; - throw new FailedToJoinRoomException(returnCode, message); + var (winIndex, _, (returnCode, message)) = await task; + if (winIndex == 0) return; + throw new FailedToJoinRoomException(returnCode, message); + } + finally + { + cts.Cancel(); + cts.Dispose(); + } } /// @@ -428,6 +538,7 @@ public static async UniTask> GetCustomRoomListAsync(TypedLobby t return await Pun2TaskCallback.OnRoomListUpdateAsync(token); } + #region Exceptions public class ConnectionFailedException : Pun2TaskException From e81f00f39e9d8faba0a9030f979026297f6e36ab Mon Sep 17 00:00:00 2001 From: TORISOUP Date: Thu, 19 Sep 2024 17:15:09 +0900 Subject: [PATCH 2/2] 1.1.1 --- Assets/Plugins/Pun2Task/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Assets/Plugins/Pun2Task/package.json b/Assets/Plugins/Pun2Task/package.json index e3fd29c..efcfa44 100644 --- a/Assets/Plugins/Pun2Task/package.json +++ b/Assets/Plugins/Pun2Task/package.json @@ -1,7 +1,7 @@ { "name": "com.torisoup.pun2task", "displayName": "Pun2Task", - "version": "1.1.0", + "version": "1.1.1", "unity": "2022.3", "description": "Provides async/await support for PUN2 ", "license": "MIT",