public async Task <SlackPostMessageResponse> PostBlockMessageWithRateLimitRetry(string token, string channel, string backupMessage, IList <ISlackMessageBlock> slackMessageBlocks, int retryCount = 5)
        {
            var retryPolicy = Policy
                              .Handle <ApiException>(e =>
            {
                var slackFailedResponse = JsonConvert.DeserializeObject <SlackFailedResponse>(e.Content);

                return(slackFailedResponse.Error.Equals(ErrorTypes.RateLimited));
            })
                              .WaitAndRetryAsync(retryCount, (retry) => TimeSpan.FromMilliseconds(100 * retry));

            SlackPostMessageResponse response = null;

            var policyResult = await retryPolicy.ExecuteAndCaptureAsync(async() =>
            {
                var blocks = JsonConvert.SerializeObject(slackMessageBlocks, Formatting.None);

                response = await _slackApi.PostMessageWithBlocks(token, channel, backupMessage, blocks);
            });

            if (policyResult.Outcome.Equals(OutcomeType.Failure))
            {
                throw policyResult.FinalException;
            }

            return(response);
        }
        public async Task <SlackPostMessageResponse> PostMessageWithRetryOnErrors(string token, string channel, string message, int retryCount, Func <int, TimeSpan> waitTime, IList <ErrorTypes> retryErrorTypes)
        {
            var retryPolicy = Policy
                              .Handle <ApiException>(e =>
            {
                var slackFailedResponse = JsonConvert.DeserializeObject <SlackFailedResponse>(e.Content);

                return(retryErrorTypes.Contains(slackFailedResponse.Error));
            })
                              .WaitAndRetryAsync(retryCount, waitTime);

            SlackPostMessageResponse response = null;

            var policyResult = await retryPolicy.ExecuteAndCaptureAsync(async() =>
            {
                response = await _slackApi.PostMessage(token, channel, message);
            });

            if (policyResult.Outcome.Equals(OutcomeType.Failure))
            {
                throw policyResult.FinalException;
            }

            return(response);
        }