using NadekoBot.Db.Models; using Newtonsoft.Json; using System.Text.RegularExpressions; namespace NadekoBot.Modules.Searches.Common.StreamNotifications.Providers; public class PicartoProvider : Provider { private static Regex Regex { get; } = new(@"picarto.tv/(?.+[^/])/?", RegexOptions.Compiled | RegexOptions.IgnoreCase); public override FollowedStream.FType Platform => FollowedStream.FType.Picarto; private readonly IHttpClientFactory _httpClientFactory; public PicartoProvider(IHttpClientFactory httpClientFactory) => _httpClientFactory = httpClientFactory; public override Task IsValidUrl(string url) { var match = Regex.Match(url); if (!match.Success) return Task.FromResult(false); // var username = match.Groups["name"].Value; return Task.FromResult(true); } public override Task GetStreamDataByUrlAsync(string url) { var match = Regex.Match(url); if (match.Success) { var name = match.Groups["name"].Value; return GetStreamDataAsync(name); } return Task.FromResult(null); } public override async Task GetStreamDataAsync(string id) { var data = await GetStreamDataAsync(new List { id }); return data.FirstOrDefault(); } public override async Task> GetStreamDataAsync(List logins) { if (logins.Count == 0) return new(); using var http = _httpClientFactory.CreateClient(); var toReturn = new List(); foreach (var login in logins) try { http.DefaultRequestHeaders.Accept.Add(new("application/json")); // get id based on the username var res = await http.GetAsync($"https://api.picarto.tv/v1/channel/name/{login}"); if (!res.IsSuccessStatusCode) continue; var userData = JsonConvert.DeserializeObject(await res.Content.ReadAsStringAsync())!; toReturn.Add(ToStreamData(userData)); _failingStreams.TryRemove(login, out _); } catch (Exception ex) { Log.Warning("Something went wrong retreiving {StreamPlatform} stream data for {Login}: {ErrorMessage}", Platform, login, ex.Message); _failingStreams.TryAdd(login, DateTime.UtcNow); } return toReturn; } private StreamData ToStreamData(PicartoChannelResponse stream) => new() { StreamType = FollowedStream.FType.Picarto, Name = stream.Name, UniqueName = stream.Name, Viewers = stream.Viewers, Title = stream.Title, IsLive = stream.Online, Preview = stream.Thumbnails.Web, Game = stream.Category, StreamUrl = $"https://picarto.tv/{stream.Name}", AvatarUrl = stream.Avatar }; }