public async Task AddAnswerAsync(UpdateMessage message) { var pollId = message.PollAnswer.PollId; var userId = message.PollAnswer.User.Id.ToString(); var isYesAnswer = message.PollAnswer.OptionIds.First() == 0; var pollEntity = _pollRepository.Find(x => x.RowKey == pollId).FirstOrDefault(); if (pollEntity == null) { return; } var answer = _pollAnswerRepository.Find(x => x.PartitionKey == pollEntity.ChatId && x.PollId == pollId && x.UserId == userId).FirstOrDefault(); if (answer == null) { answer = new PollAnswerEntity { PartitionKey = pollEntity.ChatId, RowKey = Guid.NewGuid().ToString(), Timestamp = _dateTimeService.TableEntityTimeStamp, PollId = pollId, UserId = userId, IsYesAnswer = isYesAnswer }; } else { answer.Timestamp = _dateTimeService.TableEntityTimeStamp; answer.IsYesAnswer = isYesAnswer; } await _pollAnswerRepository.CreateAsync(answer); }
private async Task <Tuple <int, IEnumerable <ChatMemberStat> > > GetStatAsync(string chatId) { var occasions = _occasionRepository.GetByChatId(chatId); var polls = new List <PollEntity>(); foreach (var occasionEntity in occasions) { var occasionPolls = _pollRepository.Find(x => x.OccasionId == occasionEntity.RowKey && x.IsClosed); polls.AddRange(occasionPolls); } if (!polls.Any()) { await _telegramClient.SendMessageAsync(new SendMessage { ChatId = chatId, Text = Messages.NoOcassionsForStats, }); return(new Tuple <int, IEnumerable <ChatMemberStat> >(0, Enumerable.Empty <ChatMemberStat>())); } var answers = new List <PollAnswerEntity>(); foreach (var pollEntity in polls) { var yesAnswers = _pollAnswerRepository.Find(x => x.PollId == pollEntity.RowKey && x.IsYesAnswer).ToList(); answers.AddRange(yesAnswers); } var answersByUser = answers.GroupBy(x => x.UserId) .ToDictionary(x => x.Key, y => y.Count()) .OrderByDescending(x => x.Value); var result = new List <ChatMemberStat>(); foreach (var kvp in answersByUser) { var firstName = string.Empty; var lastName = string.Empty; var userInfo = await _telegramClient.GetChatMemberAsync(chatId, kvp.Key); if (userInfo == null) { firstName = kvp.Key; } else { firstName = userInfo.User.FirstName; lastName = userInfo.User.LastName; } var percentage = (int)(((double)kvp.Value / (double)polls.Count) * 100); result.Add(new ChatMemberStat { FirstName = firstName, LastName = lastName, TotalVisited = kvp.Value, Percentage = percentage }); } return(new Tuple <int, IEnumerable <ChatMemberStat> >(polls.Count, result)); }