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

63 lines
2.5 KiB
C#

using Microsoft.AspNetCore.SignalR;
using Newtonsoft.Json;
using QuestShare.Common;
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.Token == "") error = Error.InvalidToken;
if (request.Version != Common.Constants.Version) error = Error.InvalidVersion;
var client = await 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;
}
var session = await SessionManager.GetSession(request.SessionInfo.Code);
if (session == null)
{
Log.Warning($"[GroupJoin] Session {request.SessionInfo.Code} not found.");
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = false,
Error = Error.InvalidParty,
});
return;
}
await ClientManager.AddClientSession(client!.ClientId, session.SessionId);
await Groups.AddToGroupAsync(Context.ConnectionId, session.ShareCode.ToString());
await ClientManager.AddKnownShareCode(client!, session.ShareCode);
await Clients.Caller.SendAsync(nameof(GroupJoin), new GroupJoin.Response
{
Success = true,
Session = new Objects.Session
{
OwnerCharacterId = session.OwnerCharacterId,
ShareCode = session.ShareCode,
},
});
await Clients.GroupExcept(Context.ConnectionId, session.ShareCode.ToString()).SendAsync(nameof(GroupJoin.GroupJoinBroadcast), new GroupJoin.GroupJoinBroadcast
{
Session = new Objects.Session
{
OwnerCharacterId = session.OwnerCharacterId,
ShareCode = session.ShareCode,
},
});
Log.Debug($"[GroupJoin] {client} joined session {request.SessionInfo.Code}");
}
}
}