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."); } }