2025-03-01 20:38:45 -05:00

68 lines
2.6 KiB
C#

using Microsoft.AspNetCore.SignalR;
using QuestShare.Common;
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 = await 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 session = await SessionManager.GetSession(request.ShareCode);
if (session == null) error = Error.Unauthorized;
if (session != null && session.OwnerCharacterId != request.OwnerCharacterId) error = Error.InvalidSession;
if (session != null && session.Owner.ClientId != client.ClientId) error = Error.Unauthorized;
if (error != Error.None)
{
await Clients.Caller.SendAsync(nameof(Cancel), new Cancel.Response
{
Success = false,
Error = error,
});
return;
}
await Groups.RemoveFromGroupAsync(Context.ConnectionId, session!.ShareCode.ToString());
if (session.PartyMembers.Count > 0)
{
// broadcast to party
await Clients.GroupExcept(session.SessionId.ToString(), Context.ConnectionId).SendAsync(nameof(Cancel.CancelBroadcast), new Cancel.CancelBroadcast
{
ShareCode = request.ShareCode
});
var members = await ClientManager.GetClientsInSession(session);
foreach (var member in members)
{
await Groups.RemoveFromGroupAsync(member.Client.ConnectionId, session.ShareCode.ToString());
await ClientManager.RemoveClientSession(member.Client);
}
}
await SessionManager.RemoveSession(session!.ShareCode);
await Clients.Caller.SendAsync(nameof(Cancel), new Cancel.Response
{
Success = true,
});
}
}
}