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, }); } } } }