您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
108 行
4.7 KiB
108 行
4.7 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
using Unity.Services.Rooms;
|
|
using Unity.Services.Rooms.Models;
|
|
using Unity.Services.Rooms.Rooms;
|
|
|
|
namespace LobbyRooms.Rooms
|
|
{
|
|
/// <summary>
|
|
/// Does all the interactions with Rooms.
|
|
/// </summary>
|
|
public static class RoomsInterface
|
|
{
|
|
private class InProgressRequest<T>
|
|
{
|
|
public InProgressRequest(Task<T> task, Action<T> onComplete)
|
|
{
|
|
DoRequest(task, onComplete);
|
|
}
|
|
|
|
private async void DoRequest(Task<T> task, Action<T> 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_maxRoomsToShow = 64;
|
|
|
|
public static void CreateRoomAsync(string requesterUASId, string roomName, int maxPlayers, bool isPrivate, Action<Response<Room>> onComplete)
|
|
{
|
|
CreateRoomRequest createRequest = new CreateRoomRequest(new CreateRequest(
|
|
name: roomName,
|
|
player: new Unity.Services.Rooms.Models.Player(requesterUASId),
|
|
maxPlayers: maxPlayers,
|
|
isPrivate: isPrivate
|
|
));
|
|
var task = RoomsService.RoomsApiClient.CreateRoomAsync(createRequest);
|
|
new InProgressRequest<Response<Room>>(task, onComplete);
|
|
}
|
|
|
|
public static void DeleteRoomAsync(string roomId, Action<Response> onComplete)
|
|
{
|
|
DeleteRoomRequest deleteRequest = new DeleteRoomRequest(roomId);
|
|
var task = RoomsService.RoomsApiClient.DeleteRoomAsync(deleteRequest);
|
|
new InProgressRequest<Response>(task, onComplete);
|
|
}
|
|
|
|
public static void JoinRoomAsync(string requesterUASId, string roomId, string roomCode, Action<Response<Room>> onComplete)
|
|
{
|
|
JoinRoomRequest joinRequest = new JoinRoomRequest(new JoinRequest(
|
|
player: new Unity.Services.Rooms.Models.Player(requesterUASId), // TODO: Oh, we can supply initial data here.
|
|
id: roomId,
|
|
roomCode: roomCode
|
|
));
|
|
var task = RoomsService.RoomsApiClient.JoinRoomAsync(joinRequest);
|
|
new InProgressRequest<Response<Room>>(task, onComplete);
|
|
}
|
|
|
|
public static void LeaveRoomAsync(string requesterUASId, string roomId, Action<Response> onComplete)
|
|
{
|
|
RemovePlayerRequest leaveRequest = new RemovePlayerRequest(roomId, requesterUASId);
|
|
var task = RoomsService.RoomsApiClient.RemovePlayerAsync(leaveRequest);
|
|
new InProgressRequest<Response>(task, onComplete);
|
|
}
|
|
|
|
public static void QueryAllRoomsAsync(Action<Response<QueryResponse>> onComplete)
|
|
{
|
|
QueryRoomsRequest queryRequest = new QueryRoomsRequest(new QueryRequest(count: k_maxRoomsToShow));
|
|
var task = RoomsService.RoomsApiClient.QueryRoomsAsync(queryRequest);
|
|
new InProgressRequest<Response<QueryResponse>>(task, onComplete);
|
|
}
|
|
|
|
public static void GetRoomAsync(string roomId, Action<Response<Room>> onComplete)
|
|
{
|
|
GetRoomRequest getRequest = new GetRoomRequest(roomId);
|
|
var task = RoomsService.RoomsApiClient.GetRoomAsync(getRequest);
|
|
new InProgressRequest<Response<Room>>(task, onComplete);
|
|
}
|
|
|
|
public static void UpdateRoomAsync(string roomId, Dictionary<string, DataObject> data, Action<Response<Room>> onComplete)
|
|
{
|
|
UpdateRoomRequest updateRequest = new UpdateRoomRequest(roomId, new UpdateRequest(
|
|
data: data
|
|
));
|
|
var task = RoomsService.RoomsApiClient.UpdateRoomAsync(updateRequest);
|
|
new InProgressRequest<Response<Room>>(task, onComplete);
|
|
}
|
|
|
|
public static void UpdatePlayerAsync(string roomId, string playerId, Dictionary<string, PlayerDataObject> data, Action<Response<Room>> onComplete)
|
|
{
|
|
UpdatePlayerRequest updateRequest = new UpdatePlayerRequest(roomId, playerId, new PlayerUpdateRequest(
|
|
data: data
|
|
));
|
|
var task = RoomsService.RoomsApiClient.UpdatePlayerAsync(updateRequest);
|
|
new InProgressRequest<Response<Room>>(task, onComplete);
|
|
}
|
|
}
|
|
}
|