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

106 lines
4.5 KiB
C#

using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json;
using QuestShare.Server.Managers;
using QuestShare.Server.Models;
namespace QuestShare.Server.Hubs
{
public partial class ShareHub : Hub
{
[HubMethodName(nameof(GroupJoin))]
public async Task Server_GroupJoin(GroupJoin.Request request)
{
var error = Error.None;
if (request.ShareCode == "") error = Error.InvalidShareCode;
if (request.Token == "") error = Error.InvalidToken;
if (request.Version != Common.Constants.Version) error = Error.InvalidVersion;
if (request.CharacterId == 0) error = Error.InvalidCharacterId;
var client = ClientManager.GetClient(Context.ConnectionId, request.Token);
if (client == null) error = Error.Unauthorized;
if (error != Error.None)
{
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = false,
Error = error,
});
return;
}
if (request.RequestPartyQuickJoin)
{
if (ShareManager.HasBroadcastParty(request.QuickJoinCharacterId))
{
var host = ClientManager.GetClient(request.QuickJoinCharacterId);
if (host == null)
{
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = false,
Error = Error.InvalidHostClient,
});
return;
}
var share = ShareManager.GetShare(host);
if (share == null)
{
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = false,
Error = Error.ShareNotFound,
});
return;
}
var members = await ShareManager.GetShareMembers(share);
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = true,
ShareCode = share.ShareCode,
Members = members.Select(m => m.CharacterId).ToList(),
SharedQuestId = share.SharedQuestId,
SharedQuestStep = share.SharedQuestStep,
});
await Clients.GroupExcept(share.ShareCode, Context.ConnectionId).SendAsync(nameof(GroupNotify), new GroupNotify.GroupNotifyBroadcast
{
CharacterId = request.CharacterId,
NotifyType = NotifyType.JoinViaParty,
ShareCode = share.ShareCode,
});
return;
}
}
else
{
var share = ShareManager.GetShare(request.ShareCode);
if (share == null)
{
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = false,
Error = Error.ShareNotFound,
});
return;
}
await Groups.AddToGroupAsync(Context.ConnectionId, share.ShareCode);
await ShareManager.AddGroupMember(share, client!);
var members = await ShareManager.GetShareMembers(share);
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = true,
ShareCode = share.ShareCode,
Members = members.Select(m => m.CharacterId).ToList(),
SharedQuestId = share.SharedQuestId,
SharedQuestStep = share.SharedQuestStep,
});
await Clients.GroupExcept(share.ShareCode, Context.ConnectionId).SendAsync(nameof(GroupNotify.GroupNotifyBroadcast), new GroupNotify.GroupNotifyBroadcast
{
CharacterId = request.CharacterId,
NotifyType = NotifyType.Join,
ShareCode = share.ShareCode,
});
}
}
}
}