Exemplo n.º 1
0
        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);
Exemplo n.º 2
0
        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);
Exemplo n.º 3
0
        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)
                       ));
        }