예제 #1
0
        public async Task <Stream> Handle(GetUserLevelImageQuery request, CancellationToken cancellationToken)
        {
            var users = await _context.XPUsers.OrderByDescending(x => x.XP)
                        .Select(u => u.UserId)
                        .ToListAsync(cancellationToken);

            var user = await _context.XPUsers.OrderByDescending(x => x.XP)
                       .FirstOrDefaultAsync(x => x.UserId == request.UserId, cancellationToken) ??
                       new User();

            var placement = users.FindIndex(u => u == request.UserId) + 1;

            var currentXp = user.XP - _xpCalculator.TotalXpRequired(user.Lvl - 1);
            var required  = _xpCalculator.TotalXpRequired(user.Lvl);
            var progress  = currentXp / _xpCalculator.XpRequired(user.Lvl);

            var image = await _mediator.Send(new GetXPImageStreamQuery
            {
                DisplayName   = request.UserDisplayName,
                Placement     = placement,
                Level         = user.Lvl,
                Xp            = user.XP,
                Discriminator = request.MemberDiscriminator,
                AvatarUrl     = request.AvatarUrl,
                Progress      = progress,
                Required      = required
            }, cancellationToken);

            return(image);
        }
예제 #2
0
        public async Task Handle(DomainEventNotification <XpAddedToUserEvent> notification, CancellationToken cancellationToken)
        {
            var user = await _context.XPUsers.FirstOrDefaultAsync(u => u.UserId == notification.DomainEvent.MessageDetails.UserId, cancellationToken);

            var oldLevel = user.Lvl;

            while (user.XP > _calculator.TotalXpRequired(user.Lvl))
            {
                user.Lvl++;
            }

            if (oldLevel < user.Lvl)
            {
                await _context.SaveChangesAsync(cancellationToken);

                await _provider.Publish(new UserLevelUpEvent
                {
                    MessageDetails = notification.DomainEvent.MessageDetails,
                    OldLvl         = oldLevel,
                    NewLvl         = user.Lvl
                });
            }
        }