コード例 #1
0
        /// <summary>
        /// Add a vote.
        /// </summary>
        private async Task <BotResponseCode> AddVote(UpdateDto updateDto, Vote vote)
        {
            var responseCode = BotResponseCode.AddVoteHandled;

            // Save the vote in storage.
            await _voteRepository.Upsert(vote);

            var votes = await _voteRepository.GetVotes(updateDto.Track.PlaylistId, updateDto.Track.Id);

            string newText = null;
            InlineKeyboardMarkup keyboard = null;

            if (vote.Type == VoteType.Downvote)
            {
                var downVotes = votes.Where(x => x.Type == VoteType.Downvote).ToList();

                // If there are enough downvotes, remove the track.
                if (downVotes.Count >= RemoveTrackOnDownvoteCount)
                {
                    responseCode = await _removeTrackService.TryRemoveTrackFromPlaylist(updateDto);

                    newText = $"This track has been removed from the playlist because of {RemoveTrackOnDownvoteCount} downvotes.";

                    // Add only the See Votes button, so users can see who downvoted.
                    keyboard = _keyboardService.CreateSeeVotesKeyboard(updateDto.Track);
                }
            }

            if (string.IsNullOrEmpty(newText))
            {
                newText = UseNegativeOperator(vote)
                          // Increment or decrement the vote in the original message.
                    ? _voteTextHelper.DecrementVote(updateDto.ParsedTextMessageWithLinks, vote.Type)
                    : _voteTextHelper.IncrementVote(updateDto.ParsedTextMessageWithLinks, vote.Type);

                // If there are votes, add the See Votes button to the keyboard.
                keyboard = _keyboardService.AddOrRemoveSeeVotesButton(updateDto.ParsedInlineKeyboard, updateDto.Track, votes.Any());
            }

            await EditOriginalMessage(updateDto, newText, keyboard);

            // Let telegram know the callback query has been handled.
            await AnswerCallback(updateDto, $"Added {vote.Type}");

            return(responseCode);
        }
コード例 #2
0
        public async Task Run_VoteCallbackTwice_AddVoteHandledReturned_RemoveVoteHandledReturned(VoteType voteType)
        {
            // Arrange.
            await TruncateTables();

            await InsertTrack();
            await InsertPlaylist();
            await InsertChat();

            var trackUrl = GetLinkToTrack();

            // Send the two messages that go before an vote callback: one with a trackUrl and a reply from the bot with a vote button.
            var trackMessageId = await SendMessage(trackUrl);

            var botReplyMessageText = "Track added to the playlist!";
            var botReplyMessageId   = await SendMessage(botReplyMessageText, replyToMessageId : trackMessageId);

            // Send two callback updates, first to test to add a vote...
            using (var stream = new MemoryStream())
            {
                var httpRequest = await CreateVoteCallbackQueryRequest(stream, voteType, botReplyMessageId, botReplyMessageText, trackUrl);

                // Act.
                var voteResult = await _sut.Run(httpRequest);

                // Assert.
                AssertHelper.Equal(BotResponseCode.AddVoteHandled, voteResult);

                var expectedVote = new Vote
                {
                    PlaylistId = _testOptions.TestPlaylistId,
                    UserId     = _testOptions.TestUserId,
                    TrackId    = _testOptions.TestTrackId,
                    Type       = voteType
                };

                var vote = await GetVote(expectedVote);

                Assert.NotNull(vote);

                var user = await GetUser();

                Assert.NotNull(user);

                var chatMember = await GetChatMember();

                Assert.NotNull(chatMember);
            }

            // ...and then test to remove a vote.
            using (var stream = new MemoryStream())
            {
                // Arrange.
                botReplyMessageText = voteType.HasAttribute <VoteType, VoteAttributes.UseNegativeOperatorAttribute>()
                    ? _voteTextHelper.DecrementVote(botReplyMessageText, voteType)
                    : _voteTextHelper.IncrementVote(botReplyMessageText, voteType);
                var httpRequest = await CreateVoteCallbackQueryRequest(stream, voteType, botReplyMessageId, botReplyMessageText, trackUrl);

                // Act.
                var voteResult = await _sut.Run(httpRequest);

                // Assert.
                AssertHelper.Equal(BotResponseCode.RemoveVoteHandled, voteResult);

                var expectedVote = new Vote
                {
                    PlaylistId = _testOptions.TestPlaylistId,
                    UserId     = _testOptions.TestUserId,
                    TrackId    = _testOptions.TestTrackId,
                    Type       = voteType
                };

                var vote = await GetVote(expectedVote);

                Assert.Null(vote);
            }
        }