Exemple #1
0
 public async Task OnSeenAsync(SeenNotification info)
 {
     _seenProducer.Produce(TOPIC, new Message <Null, SeenNotification>()
     {
         Value = info
     });
 }
Exemple #2
0
 private static async void MessagingServiceOnSeenNotification(SeenNotification notification)
 {
     Out.WriteLine("   opponent saw your message");
     await messagingService.MessageSeenStatusAcknowledge(
         new MessageSeenStatusAcknowledgeRequest { Messages = new List <Guid> {
                                                       notification.EventId
                                                   } });
 }
Exemple #3
0
        private async void OnMessageSeen(SeenNotification notification)
        {
            var changed = await messageRepository.UpdateMessageStatusAsync(notification.MessageToken, MessageStatus.Seen);

            await messagingService.MessageSeenStatusAcknowledge(new MessageSeenStatusAcknowledgeRequest { Messages = new List <Guid> {
                                                                                                              notification.EventId
                                                                                                          } });

            if (changed)
            {
                MessageStatusChanged(this, new MessageStatusEventArgs {
                    MessageToken = notification.MessageToken, Status = MessageStatus.Seen
                });
            }
        }
        public async Task OnSeenAsync(SeenNotification info)
        {
            await updateForEntitiesAsync(_db.CommentariesViewStatistic, info.SeenCommentaries);
            await updateForEntitiesAsync(_db.PostsViewStatistic, info.SeenPosts);
            await updateForEntitiesAsync(_db.ProfilesViewStatistic, info.SeenProfiles);

            await _db.SaveChangesAsync();

            return; ////////////////////////////////////////////

            async Task updateForEntitiesAsync <TKey, T>(DbSet <ViewStatistic <TKey, T> > viewStatTable, Dictionary <TKey, int> deltas)
                where TKey : notnull
            {
                var entityIds = deltas.Keys
                                .OrderBy(k => k)
                                .ToArray();
                var entitiesStatsToUpdate = await viewStatTable
                                            .Where(vs => entityIds.Contains(vs.Id))
                                            .OrderBy(vs => vs.Id)
                                            .ToListAsync();

                for (int i = 0; i < entityIds.Length; i++)
                {
                    var cId      = entityIds[i];
                    var delta    = deltas[cId];
                    var viewStat = entitiesStatsToUpdate[i];
                    update(viewStat, delta);
                }

                void update(IViewStatistic vs, int delta)
                {
                    if (delta < 0)
                    {
                        return;
                    }

                    if (info.IsSeenByRegisteredUser)
                    {
                        vs.RegisteredUserViews += delta;
                    }
                    vs.AllViews += delta;
                }
            }
        }
Exemple #5
0
        async Task dispatcherLoopAsync()
        {
            await ThreadingUtils.ContinueAtDedicatedThread();

            while (true)
            {
                try
                {
                    var message = _consumer.Consume();
                    var scope   = _scopeBuilder
                                  .CreateScope();
                    var controller = scope.ServiceProvider
                                     .GetRequiredService <IStatisticServiceAPI>();
                    var parameter = message.Value;
                    var handler   = getHandler();
                    executeAsync();

                    /////////////////////////////////////////////

                    Func <Task> getHandler()
                    {
                        return(message.Value switch
                        {
                            CommentaryNotification cn => () => controller.OnCommentaryActionAsync(cn),
                            PostNotification pn => () => controller.OnPostActionAsync(pn),
                            SeenNotification sn => () => controller.OnSeenAsync(sn),
                            UserNotification un => () => controller.OnUserActionAsync(un),
                            _ => throw new NotSupportedException()
                        });
                    }

                    async void executeAsync()
                    {
                        using (scope)
                        {
                            await ThreadingUtils.ContinueAtThreadPull();

                            await handler();

                            _logger.LogInformation($"Consumed message '{message.Value}' at: '{message.TopicPartitionOffset}'.");
                        }
                    }
                }