public async Task OnSeenAsync(SeenNotification info) { _seenProducer.Produce(TOPIC, new Message <Null, SeenNotification>() { Value = info }); }
private static async void MessagingServiceOnSeenNotification(SeenNotification notification) { Out.WriteLine(" opponent saw your message"); await messagingService.MessageSeenStatusAcknowledge( new MessageSeenStatusAcknowledgeRequest { Messages = new List <Guid> { notification.EventId } }); }
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; } } }
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}'."); } } }