public async Task HandleAsync(HttpContext context) { var requestConfig = await Serializer.DeserializeStreamAsync <AppConfig>(context.Request.Body) .ConfigureAwait(false); // due to API limits, we may want to temporarily disable api requests if (requestConfig.PushBullet?.SkipSend is bool smsSend) { SmsSender.SkipSend = smsSend; } var skipYouTubeSend = requestConfig.YouTube?.SkipSend ?? Config.Value.YouTube?.SkipSend ?? throw new NullReferenceException(nameof(AppConfig.YouTube)); var pageCount = requestConfig.YouTube?.PageCount ?? Config.Value.YouTube?.PageCount ?? throw new NullReferenceException(nameof(AppConfig.YouTube)); var numbers = requestConfig.Numbers ?? Config.Value.Numbers ?? throw new NullReferenceException(nameof(AppConfig.Numbers)); var siteUri = requestConfig.SiteUri ?? Config.Value.SiteUri ?? throw new NullReferenceException(nameof(AppConfig.SiteUri)); var random = new Random(Guid.NewGuid().GetHashCode()); var videos = await GetVideoUrls(pageCount, skipYouTubeSend).ToArrayAsync().ConfigureAwait(false); var video = videos.RandomItem(); var message = $"{_greetings.RandomItem()}, {_names.RandomItem()}! Checkout this cool knife sharpening video!\n\n{video}"; var message2 = $"If you're tired of these messages, you can unsubscribe using this link: {siteUri}"; // send each message as a separate sms, rather than a single mms foreach (var number in numbers) { var result = await SmsSender.SendAsync(message, number).ConfigureAwait(false); await SmsSender.AwaitCompleteAsync(result).ConfigureAwait(false); // need a delay between SMS message or the second may not go through await Task.Delay(1000); await SmsSender.SendAsync(message2, number).ConfigureAwait(false); await Task.Delay(1000); } }