async Task <GangMemberConnectionState> IGangManager.ManageAsync( GangParameters parameters, IGangMember member) { if (parameters is null) { throw new ArgumentNullException(nameof(parameters)); } if (member is null) { throw new ArgumentNullException(nameof(member)); } var audit = new GangAudit(parameters.GangId, null, member.Id, member.Session?.User.Id); var auth = _serializer.Serialize( new GangAuth(member.Id, member.Session?.Token, _settings.Application) ); if (member.Session == null) { await member.HandleAsync(GangMessageTypes.Denied, auth, audit); await member.DisconnectAsync(RESULT_DENIED); return(GangMemberConnectionState.Disconnected); } var gangId = parameters.GangId; var gang = _gangs .AddMemberToGang(parameters.GangId, member, _ => RaiseEvent(new GangAdded(), gangId)); if (gang.HostMember == member) { await member.HandleAsync(GangMessageTypes.Host, auth, audit); } else { await member.HandleAsync(GangMessageTypes.Member, auth, audit); await gang.HostMember.HandleAsync(GangMessageTypes.Connect, null, audit); } RaiseEvent(new GangMemberAdded(), gangId, member.Id); var controller = _controllerFactory.Create( this, parameters.GangId, member, async(data) => { if (member == gang.HostMember) { throw new GangException("host member should not receive data"); } var sequenceNumber = BitConverter.ToUInt32(data.AsSpan()[0..4]); var audit = new GangAudit(parameters.GangId, sequenceNumber, member.Id, member.Session?.User.Id); await gang.HostMember .HandleAsync(GangMessageTypes.Command, data[4..], audit);
async Task <GangSession> IGangAuthenticationHandler .HandleAsync(GangParameters parameters) { if (parameters is null) { throw new System.ArgumentNullException(nameof(parameters)); } if (string.IsNullOrWhiteSpace(parameters.GangId) || string.IsNullOrWhiteSpace(parameters.Token)) { return(default);
Task <GangSession> IGangAuthenticationHandler .HandleAsync(GangParameters parameters) { var token = parameters.Token ?? $"{Guid.NewGuid():N}"; if (!_userIds.TryGetValue(token, out var userId)) { userId = $"{Guid.NewGuid():N}"; _userIds = _userIds.Add(token, userId); } return(Task.FromResult( new GangSession(userId, token: token) )); }