2025-02-17 22:12:35 -05:00

66 lines
2.3 KiB
C#

using Microsoft.AspNetCore.SignalR;
using QuestShare.Server.Managers;
namespace QuestShare.Server.Hubs
{
public partial class ShareHub : Hub
{
[HubMethodName(nameof(Cancel))]
public async Task Server_Cancel(Cancel.Request request)
{
if (BanManager.IsBanned(Context))
{
Context.Abort();
return;
}
var client = ClientManager.GetClient(Context.ConnectionId);
if (client == null)
{
await Clients.Caller.SendAsync(nameof(Cancel), new Cancel.Response
{
Success = false,
Error = Error.Unauthorized,
});
return;
}
var error = Error.None;
if (request.Token == "") error = Error.InvalidToken;
else if (request.Version != Common.Constants.Version) error = Error.InvalidVersion;
var share = ShareManager.GetShare(client);
if (share == null) error = Error.Unauthorized;
if (error != Error.None)
{
await Clients.Caller.SendAsync(nameof(Cancel), new Cancel.Response
{
Success = false,
Error = error,
});
return;
}
ShareManager.RemoveShare(share!.ShareCode);
await Groups.RemoveFromGroupAsync(Context.ConnectionId, share.ShareCode);
// remove all members from the group
var members = await ShareManager.GetShareMembers(share);
if (members != null && members.Count > 0)
{
// broadcast to party
await Clients.GroupExcept(share.ShareCode, Context.ConnectionId).SendAsync(nameof(Cancel), new Cancel.CancelBroadcast
{
ShareCode = share.ShareCode,
});
foreach (var member in members)
{
await Groups.RemoveFromGroupAsync(member.ConnectionId, share.ShareCode);
await ShareManager.RemoveGroupMember(share, member);
}
}
await Clients.Caller.SendAsync(nameof(Cancel), new Cancel.Response
{
Success = true,
});
}
}
}