public async Task Subscribe([QueueTrigger("twitch-channel-subscription", Connection = "TwitchChatStorage")] string msg, ILogger logger) { var twitchEndPoint = "https://api.twitch.tv/helix/webhooks/hub"; // could end up like configuration["Twitch:HubEndpoint"] //#if DEBUG var leaseInSeconds = 864000; // = 10 days //#endif var channelId = long.TryParse(msg, out var _) ? msg : await GetChannelIdForUserName(msg); var callbackUrl = new Uri(Configuration["EndpointBaseUrl"]); var payload = new TwitchWebhookSubscriptionPayload { callback = new Uri(callbackUrl, $"?channelId={channelId}").ToString(), mode = "subscribe", topic = $"https://api.twitch.tv/helix/streams?user_id={channelId}", lease_seconds = leaseInSeconds, secret = TWITCH_SECRET }; logger.LogDebug($"Posting with callback url: {payload.callback}"); var stringPayload = JsonConvert.SerializeObject(payload); logger.Log(LogLevel.Information, $"Subscribing to Twitch with payload: {stringPayload}"); using (var client = GetHttpClient(twitchEndPoint)) { var token = await GetAccessToken(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {token.AccessToken}"); var responseMessage = await client.PostAsync("", new StringContent(stringPayload, Encoding.UTF8, @"application/json")); if (!responseMessage.IsSuccessStatusCode) { var responseBody = await responseMessage.Content.ReadAsStringAsync(); logger.Log(LogLevel.Error, $"Error response body: {responseBody}"); } else { var sub = new CurrentSubscription { ChannelId = channelId, ChannelName = msg, ExpirationDateTimeUtc = DateTime.UtcNow.AddSeconds(leaseInSeconds).AddDays(-1) }; var repo = new CurrentSubscriptionsRepository(Configuration); await repo.AddSubscription(sub); } } }
public async Task ScheduledResubscribe([TimerTrigger("0 2 */2 * * *", RunOnStartup = true)] TimerInfo timer, [Queue("twitch-channel-subscription", Connection = "TwitchChatStorage")] CloudQueue queue, ILogger logger) { var repo = new CurrentSubscriptionsRepository(Configuration); var currentSubscriptions = await repo.GetExpiringSubscriptions(); foreach (var item in currentSubscriptions) { await queue.AddMessageAsync(new CloudQueueMessage(item.ChannelName)); await repo.RemoveSubscription(item); } }