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);
                }
            }
        }
Ejemplo n.º 2
0
        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);
            }
        }