private async Task TrackStream(ITextChannel channel, string username, FollowedStream.FollowedStreamType type)
 {
     username = username.ToLowerInvariant().Trim();
     var stream = new FollowedStream
     {
         GuildId = channel.Guild.Id,
         ChannelId = channel.Id,
         Username = username,
         Type = type,
     };
     bool exists;
     using (var uow = DbHandler.UnitOfWork())
     {
         exists = uow.GuildConfigs.For(channel.Guild.Id).FollowedStreams.Where(fs => fs.ChannelId == channel.Id && fs.Username.ToLowerInvariant().Trim()  == username).Any();
     }
     if (exists)
     {
         await channel.SendMessageAsync($":anger: I am already following `{username}` ({type}) stream on this channel.").ConfigureAwait(false);
         return;
     }
     StreamStatus data;
     try
     {
         data = await GetStreamStatus(stream).ConfigureAwait(false);
     }
     catch
     {
         await channel.SendMessageAsync(":anger: Stream probably doesn't exist.").ConfigureAwait(false);
         return;
     }
     var msg = $"Stream is currently **{(data.IsLive ? "ONLINE" : "OFFLINE")}** with **{data.Views}** viewers";
     if (data.IsLive)
         if (type == FollowedStream.FollowedStreamType.Hitbox)
             msg += $"\n`Here is the Link:`【 http://www.hitbox.tv/{stream.Username}/ 】";
         else if (type == FollowedStream.FollowedStreamType.Twitch)
             msg += $"\n`Here is the Link:`【 http://www.twitch.tv/{stream.Username}/ 】";
         else if (type == FollowedStream.FollowedStreamType.Beam)
             msg += $"\n`Here is the Link:`【 https://beam.pro/{stream.Username}/ 】";
     using (var uow = DbHandler.UnitOfWork())
     {
         uow.GuildConfigs.For(channel.Guild.Id).FollowedStreams.Add(stream);
         await uow.CompleteAsync();
     }
     msg = $":ok: I will notify this channel when status changes.\n{msg}";
     await channel.SendMessageAsync(msg).ConfigureAwait(false);
 }
 private async Task<StreamStatus> GetStreamStatus(FollowedStream stream, bool checkCache = true)
 {
     bool isLive;
     string response;
     JObject data;
     StreamStatus result;
     switch (stream.Type)
     {
         case FollowedStream.FollowedStreamType.Hitbox:
             var hitboxUrl = $"https://api.hitbox.tv/media/status/{stream.Username}";
             if (checkCache && cachedStatuses.TryGetValue(hitboxUrl, out result))
                 return result;
             using (var http = new HttpClient())
             {
                 response = await http.GetStringAsync(hitboxUrl).ConfigureAwait(false);
             }
             data = JObject.Parse(response);
             isLive = data["media_is_live"].ToString() == "1";
             result = new StreamStatus(hitboxUrl, isLive, data["media_views"].ToString());
             cachedStatuses.TryAdd(hitboxUrl, result);
             return result;
         case FollowedStream.FollowedStreamType.Twitch:
             var twitchUrl = $"https://api.twitch.tv/kraken/streams/{Uri.EscapeUriString(stream.Username)}?client_id=67w6z9i09xv2uoojdm9l0wsyph4hxo6";
             if (checkCache && cachedStatuses.TryGetValue(twitchUrl, out result))
                 return result;
             using (var http = new HttpClient())
             {
                 response = await http.GetStringAsync(twitchUrl).ConfigureAwait(false);
             }
             data = JObject.Parse(response);
             isLive = !string.IsNullOrWhiteSpace(data["stream"].ToString());
             result = new StreamStatus(twitchUrl, isLive, isLive ? data["stream"]["viewers"].ToString() : "0");
             cachedStatuses.TryAdd(twitchUrl, result);
             return result;
         case FollowedStream.FollowedStreamType.Beam:
             var beamUrl = $"https://beam.pro/api/v1/channels/{stream.Username}";
             if (checkCache && cachedStatuses.TryGetValue(beamUrl, out result))
                 return result;
             using (var http = new HttpClient())
             {
                 response = await http.GetStringAsync(beamUrl).ConfigureAwait(false);
             }
             data = JObject.Parse(response);
             isLive = data["online"].ToObject<bool>() == true;
             result = new StreamStatus(beamUrl, isLive, data["viewersCurrent"].ToString());
             cachedStatuses.TryAdd(beamUrl, result);
             return result;
         default:
             break;
     }
     return null;
 }
            public async Task CheckStream(IUserMessage imsg, FollowedStream.FollowedStreamType platform, [Remainder] string username)
            {
                var channel = (ITextChannel)imsg.Channel;

                var stream = username?.Trim();
                if (string.IsNullOrWhiteSpace(stream))
                    return;
                try
                {
                    var streamStatus = (await GetStreamStatus(new FollowedStream
                    {
                        Username = stream,
                        Type = platform
                    }));
                    if (streamStatus.IsLive)
                    {
                        await channel.SendMessageAsync($"`Streamer {username} is online with {streamStatus.Views} viewers.`");
                    }
                    else
                    {
                        await channel.SendMessageAsync($"`Streamer {username} is offline.`");
                    }
                }
                catch
                {
                    await channel.SendMessageAsync("No channel found.");
                }
            }