using System; using System.Collections.Generic; using System.Threading.Tasks; using Unity.Services.Lobbies; using Unity.Services.Lobbies.Models; namespace LobbyRelaySample.lobby { /// /// Does all the interactions with the Lobby API. /// public static class LobbyAPIInterface { private class InProgressRequest { public InProgressRequest(Task task, Action onComplete) { DoRequest(task, onComplete); } private async void DoRequest(Task task, Action onComplete) { T result = default; string currentTrace = System.Environment.StackTrace; try { result = await task; } catch (Exception e) { Exception eFull = new Exception($"Call stack before async call:\n{currentTrace}\n", e); throw eFull; } finally { onComplete?.Invoke(result); } } } private const int k_maxLobbiesToShow = 64; public static void CreateLobbyAsync(string requesterUASId, string lobbyName, int maxPlayers, bool isPrivate, Dictionary localUserData, Action> onComplete) { CreateLobbyRequest createRequest = new CreateLobbyRequest(new CreateRequest( name: lobbyName, player: new Player(id: requesterUASId, data: localUserData), maxPlayers: maxPlayers, isPrivate: isPrivate )); var task = LobbyService.LobbyApiClient.CreateLobbyAsync(createRequest); new InProgressRequest>(task, onComplete); } public static void DeleteLobbyAsync(string lobbyId, Action onComplete) { DeleteLobbyRequest deleteRequest = new DeleteLobbyRequest(lobbyId); var task = LobbyService.LobbyApiClient.DeleteLobbyAsync(deleteRequest); new InProgressRequest(task, onComplete); } public static void JoinLobbyAsync_ByCode(string requesterUASId, string lobbyCode, Dictionary localUserData, Action> onComplete) { JoinLobbyByCodeRequest joinRequest = new JoinLobbyByCodeRequest(new JoinByCodeRequest(lobbyCode, new Player(id: requesterUASId, data: localUserData))); var task = LobbyService.LobbyApiClient.JoinLobbyByCodeAsync(joinRequest); new InProgressRequest>(task, onComplete); } public static void JoinLobbyAsync_ById(string requesterUASId, string lobbyId, Dictionary localUserData, Action> onComplete) { JoinLobbyByIdRequest joinRequest = new JoinLobbyByIdRequest(lobbyId, new Player(id: requesterUASId, data: localUserData)); var task = LobbyService.LobbyApiClient.JoinLobbyByIdAsync(joinRequest); new InProgressRequest>(task, onComplete); } public static void LeaveLobbyAsync(string requesterUASId, string lobbyId, Action onComplete) { RemovePlayerRequest leaveRequest = new RemovePlayerRequest(lobbyId, requesterUASId); var task = LobbyService.LobbyApiClient.RemovePlayerAsync(leaveRequest); new InProgressRequest(task, onComplete); } public static void QueryAllLobbiesAsync(Action> onComplete) { QueryLobbiesRequest queryRequest = new QueryLobbiesRequest(new QueryRequest(count: k_maxLobbiesToShow)); var task = LobbyService.LobbyApiClient.QueryLobbiesAsync(queryRequest); new InProgressRequest>(task, onComplete); } public static void GetLobbyAsync(string lobbyId, Action> onComplete) { GetLobbyRequest getRequest = new GetLobbyRequest(lobbyId); var task = LobbyService.LobbyApiClient.GetLobbyAsync(getRequest); new InProgressRequest>(task, onComplete); } public static void UpdateLobbyAsync(string lobbyId, Dictionary data, Action> onComplete) { UpdateLobbyRequest updateRequest = new UpdateLobbyRequest(lobbyId, new UpdateRequest( data: data )); var task = LobbyService.LobbyApiClient.UpdateLobbyAsync(updateRequest); new InProgressRequest>(task, onComplete); } public static void UpdatePlayerAsync(string lobbyId, string playerId, Dictionary data, Action> onComplete) { UpdatePlayerRequest updateRequest = new UpdatePlayerRequest(lobbyId, playerId, new PlayerUpdateRequest( data: data )); var task = LobbyService.LobbyApiClient.UpdatePlayerAsync(updateRequest); new InProgressRequest>(task, onComplete); } public static void HeartbeatPlayerAsync(string lobbyId) { HeartbeatRequest request = new HeartbeatRequest(lobbyId); var task = LobbyService.LobbyApiClient.HeartbeatAsync(request); new InProgressRequest(task, null); } } }