// thanks BCES00569 public static async Task <List <DiscordEmbedBuilder> > AsEmbedAsync(this TitlePatch patch, DiscordClient client, string productCode) { var result = new List <DiscordEmbedBuilder>(); var pkgs = patch?.Tag?.Packages; var title = pkgs?.Select(p => p.ParamSfo?.Title).LastOrDefault(t => !string.IsNullOrEmpty(t)) ?? await ThumbnailProvider.GetTitleNameAsync(productCode, Config.Cts.Token).ConfigureAwait(false) ?? productCode; var thumbnailUrl = await client.GetThumbnailUrlAsync(productCode).ConfigureAwait(false); var embedBuilder = new DiscordEmbedBuilder { Title = title, Color = Config.Colors.DownloadLinks, }.WithThumbnail(thumbnailUrl); if (pkgs?.Length > 1) { var pages = pkgs.Length / EmbedPager.MaxFields + (pkgs.Length % EmbedPager.MaxFields == 0 ? 0 : 1); if (pages > 1) { embedBuilder.Title = $"{title} [Part 1 of {pages}]".Trim(EmbedPager.MaxFieldTitleLength); } embedBuilder.Description = $"Total download size of all {pkgs.Length} packages is {pkgs.Sum(p => p.Size).AsStorageUnit()}"; var i = 0; do { var pkg = pkgs[i++]; embedBuilder.AddField($"Update v{pkg.Version} ({pkg.Size.AsStorageUnit()})", $"[⏬ {GetLinkName(pkg.Url)}]({pkg.Url})"); if (i % EmbedPager.MaxFields == 0) { result.Add(embedBuilder); embedBuilder = new DiscordEmbedBuilder { Title = $"{title} [Part {i / EmbedPager.MaxFields + 1} of {pages}]".Trim(EmbedPager.MaxFieldTitleLength), Color = Config.Colors.DownloadLinks, }.WithThumbnail(thumbnailUrl); } } while (i < pkgs.Length); } else if (pkgs?.Length == 1) { embedBuilder.Title = $"{title} update v{pkgs[0].Version} ({pkgs[0].Size.AsStorageUnit()})"; embedBuilder.Description = $"[⏬ {Path.GetFileName(GetLinkName(pkgs[0].Url))}]({pkgs[0].Url})"; } else if (patch != null) { embedBuilder.Description = "No updates available"; } else { embedBuilder.Description = "No update information available"; } if (!result.Any() || embedBuilder.Fields.Any()) { result.Add(embedBuilder); } return(result); }
public static Embed GetTitlePatch(string titleId) { string url = ConvertTitleIDToHash(titleId); // Needed to bypass certificate errors ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; var noUpdatesEmbed = new EmbedBuilder { Title = titleId, Description = $"No updates were found for {titleId}", Color = Color.Orange }; XmlDocument xmlDoc = new XmlDocument(); // Almost all games with no updates don't return an empty XML so i'm forced to do this hack // We also can't differentiate between valid IDs and games with no updates try { xmlDoc.Load(url); } catch (WebException) { return(noUpdatesEmbed.Build()); } catch (XmlException) { return(noUpdatesEmbed.Build()); } using (XmlReader reader = XmlReader.Create(url)) { TitlePatch patch = (TitlePatch)PatchesSerializer.Deserialize(reader); var pkgs = patch.Tag.Package; var title = pkgs.Select(p => p.Sfo?.Title).LastOrDefault(t => !string.IsNullOrEmpty(t)); var Covers = JsonConvert.DeserializeObject <Root>(File.ReadAllText("./APIClients/PSNClient/Covers.json")); // Relative to Bot.cs string coverURL = string.Empty; for (int i = 0; i < Covers.IDs.Length; i++) { if (Covers.IDs[i].ID == titleId) { coverURL = Covers.IDs[i].cover; break; } } var patchEmbed = new EmbedBuilder(); patchEmbed.Title = title; patchEmbed.Color = Color.Orange; patchEmbed.WithFooter(f => f.Text = $"Content ID: {patch.Tag.Package[0].ContentId}"); if (coverURL != null) { patchEmbed.ThumbnailUrl = coverURL; } // Credit to RPCS3-Bot (13xforever) for this code https://github.com/RPCS3/discord-bot - https://github.com/13xforever if (pkgs.Length > 1) { var i = 0; do { var pkg = pkgs[i++]; patchEmbed.AddField($"Update v{pkg.Version} - ({ToMB(pkg.Size)}MB) - Min Firmware: {FormatSysVer(pkg.SysVer)}", $"[{pkg.Url.Substring(103, 28)}.pkg]({pkg.Url})"); } while (i < pkgs.Length); patchEmbed.AddField($"Hybrid Package ({ToMB(pkgs[pkgs.Length - 1].HybridPackage.Size)}MB) - " + $"Min Firmware: {FormatSysVer(pkgs[pkgs.Length - 1].SysVer)}", $"[{pkgs[pkgs.Length - 1].Url.Substring(103, 28)}.pkg]({pkgs[pkgs.Length - 1].HybridPackage.Url})"); patchEmbed.Description = $"Content ID: {pkgs[0].ContentId}"; patchEmbed.WithFooter(f => f.Text = $"Note: Hybrid Packages contain all previous updates"); } else if (pkgs.Length == 1) { patchEmbed.Title = $"{pkgs[0].Sfo.Title} v{pkgs[0].Version} ({ToMB(pkgs[0].Size)}MB)"; patchEmbed.Description = $"[{pkgs[0].Url.Substring(103, 28)}.pkg]({pkgs[0].Url})"; patchEmbed.AddField("Min Firmware", $"{FormatSysVer(pkgs[0].SysVer)}"); } return(patchEmbed.Build()); } }