using System.Collections.Generic; using System.IO; using System.Text; using Discord.Net.Converters; using Discord.Net.Rest; using Newtonsoft.Json; namespace Discord.API.Rest { internal class UploadWebhookFileParams { private static JsonSerializer _serializer = new JsonSerializer { ContractResolver = new DiscordContractResolver() }; public FileAttachment[] Files { get; } public Optional Content { get; set; } public Optional Nonce { get; set; } public Optional IsTTS { get; set; } public Optional Username { get; set; } public Optional AvatarUrl { get; set; } public Optional Embeds { get; set; } public Optional AllowedMentions { get; set; } public Optional MessageComponents { get; set; } public UploadWebhookFileParams(params FileAttachment[] files) { Files = files; } public IReadOnlyDictionary ToDictionary() { var d = new Dictionary(); var payload = new Dictionary(); if (Content.IsSpecified) payload["content"] = Content.Value; if (IsTTS.IsSpecified) payload["tts"] = IsTTS.Value.ToString(); if (Nonce.IsSpecified) payload["nonce"] = Nonce.Value; if (Username.IsSpecified) payload["username"] = Username.Value; if (AvatarUrl.IsSpecified) payload["avatar_url"] = AvatarUrl.Value; if (MessageComponents.IsSpecified) payload["components"] = MessageComponents.Value; if (Embeds.IsSpecified) payload["embeds"] = Embeds.Value; if (AllowedMentions.IsSpecified) payload["allowed_mentions"] = AllowedMentions.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 }); } payload["attachments"] = attachments; 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; } } }