public StreamInfoResponse DoStreamInfoRequest(List <string> usernames, string cursor)
        {
            string         queryString = CreateGetStreamString(ref usernames, cursor);
            HttpWebRequest webRequest  = (HttpWebRequest)WebRequest.Create(queryString);

            webRequest.Method      = "GET";
            webRequest.ContentType = "application/json";
            webRequest.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + AccessToken);
            webRequest.Headers.Add("Client-Id: " + ClientId);
            var webResponse    = webRequest.GetResponse();
            var responseStream = webResponse.GetResponseStream();

            if (responseStream != null)
            {
                var streamReader          = new StreamReader(responseStream, Encoding.Default);
                var json                  = streamReader.ReadToEnd();
                StreamStatusJson response = JsonConvert.DeserializeObject <StreamStatusJson>(json);
                return(new StreamInfoResponse()
                {
                    StreamChangeRequest = response,
                    RateLimitRemaining = int.Parse(webResponse.Headers.Get("Ratelimit-Remaining"))
                });
            }
            else
            {
                return(new StreamInfoResponse()
                {
                    StreamChangeRequest = new StreamStatusJson(),
                    RateLimitRemaining = 800,
                });
            }
        }
 public void SetStreamInfoInCache(string username, StreamStatusJson streamChangeInfo)
 {
     if (streamChangeInfo.data.Any())
     {
         SetStreamInfoInCache(username, streamChangeInfo.data[0]);
     }
     else
     {
         _cache.Remove(CacheKeys.TwitchUsername + username);
     }
 }
        public async Task <ActionResult> StreamChange(string username, [FromBody] StreamStatusJson request)
        {
            Task <List <TwitchUser> > twitchUsersTask = _context.TwitchUsers
                                                        .AsQueryable()
                                                        .Where(t => (t.ChannelName == username))
                                                        .ToListAsync();
            StreamStatus previousStatus = GetStreamStatusFromCache(username);
            //await SendMessage(username + "'s stream was updated.");
            bool previousStatusOk = true;

            if (previousStatus == null)
            {
                previousStatusOk = false;
            }
            if (request.data.Any())
            {
                await SendMessage(request.data[0].ToString());

                //Stream Changed
                if (previousStatusOk && (request.data[0].id == previousStatus.id))
                {
                    //Duplicate Request. This might happen sometimes. No need to add to cache.
                    return(Ok());
                }
                else
                {
                    //Going Online
                    //TODO: Don't post messages if the stream was online before.
                    if (previousStatusOk)
                    {
                        //Stream was updated. Handle game changes here
                    }
                    else
                    {
                        //await SendMessage("It went online");
                        await StreamOnline(await twitchUsersTask, request.data[0]);
                    }
                }
            }
            else
            {
                //Stream Offline
                //await SendMessage("It went offline");
                await StreamOffline(await twitchUsersTask);
            }
            SetStreamInfoInCache(username, request);
            return(Ok());
        }