using Discord.Net.Converters; using Discord.Net.Rest; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Discord.API.Rest { internal class UploadInteractionFileParams { private static JsonSerializer _serializer = new JsonSerializer { ContractResolver = new DiscordContractResolver() }; public FileAttachment[] Files { get; } public InteractionResponseType Type { get; set; } public Optional Content { get; set; } public Optional IsTTS { get; set; } public Optional Embeds { get; set; } public Optional AllowedMentions { get; set; } public Optional MessageComponents { get; set; } public Optional Flags { get; set; } public Optional Poll { get; set; } public bool HasData => Content.IsSpecified || IsTTS.IsSpecified || Embeds.IsSpecified || AllowedMentions.IsSpecified || MessageComponents.IsSpecified || Flags.IsSpecified || Files.Any() || Poll.IsSpecified; public UploadInteractionFileParams(params FileAttachment[] files) { Files = files; } public IReadOnlyDictionary ToDictionary() { var d = new Dictionary(); var payload = new Dictionary(); payload["type"] = Type; var data = new Dictionary(); if (Content.IsSpecified) data["content"] = Content.Value; if (IsTTS.IsSpecified) data["tts"] = IsTTS.Value; if (MessageComponents.IsSpecified) data["components"] = MessageComponents.Value; if (Embeds.IsSpecified) data["embeds"] = Embeds.Value; if (AllowedMentions.IsSpecified) data["allowed_mentions"] = AllowedMentions.Value; if (Flags.IsSpecified) data["flags"] = Flags.Value; if (Poll.IsSpecified) data["poll"] = Poll.Value; List attachments = new(); for (int n = 0; n != Files.Length; n++) { var attachment = Files[n]; var filename = attachment.FileName ?? "unknown.dat"; if (attachment.IsSpoiler && !filename.StartsWith(AttachmentExtensions.SpoilerPrefix)) filename = filename.Insert(0, AttachmentExtensions.SpoilerPrefix); d[$"files[{n}]"] = new MultipartFile(attachment.Stream, filename); attachments.Add(new { id = (ulong)n, filename = filename, description = attachment.Description ?? Optional.Unspecified }); } data["attachments"] = attachments; payload["data"] = data; if (data.Any()) { var json = new StringBuilder(); using (var text = new StringWriter(json)) using (var writer = new JsonTextWriter(text)) _serializer.Serialize(writer, payload); d["payload_json"] = json.ToString(); } return d; } } }