using System; using System.Collections.Generic; using System.IO; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; using Newtonsoft.Json; namespace RocketDiscordService { public class Discordo : IDisposable { private readonly HttpClient _httpClient; private readonly string _webHookUrl; public Discordo(string webHookUrl) { _httpClient = new HttpClient(); _webHookUrl = webHookUrl; } public async Task SendMessage(DiscordMessage discordMessage) { var dataContent = CreateFormDataWithPayload(discordMessage); return await SendMessage(dataContent); } public async Task SendMessage(DiscordMessage discordMessage, List files) { var dataContent = CreateFormDataWithPayload(discordMessage); foreach (var fileInfo in files) { dataContent.Add(new StreamContent(File.OpenRead(fileInfo.FullName)), Path.GetFileNameWithoutExtension(fileInfo.Name), fileInfo.Name); } return await SendMessage(dataContent); } public async Task SendMessage(DiscordMessage discordMessage, List<(byte[] Buffer, string FileName, string FileNameWithExtension)> files) { var dataContent = CreateFormDataWithPayload(discordMessage); foreach (var tuple in files) { dataContent.Add(new ByteArrayContent(tuple.Buffer, 0, tuple.Buffer.Length), tuple.FileName, tuple.FileNameWithExtension); } return await SendMessage(dataContent); } private MultipartFormDataContent CreateFormDataWithPayload(DiscordMessage discordMessage) { MultipartFormDataContent dataContent = new MultipartFormDataContent(); dataContent.Headers.ContentType.MediaType = "multipart/form-data"; var payloadJson = JsonConvert.SerializeObject(discordMessage); dataContent.Add(new StringContent(payloadJson) { Headers = { ContentType = new MediaTypeHeaderValue("application/json") } }, "payload_json"); return dataContent; } private async Task SendMessage(HttpContent content) { var response = await _httpClient.PostAsync(_webHookUrl, content); content.Dispose(); return await response.Content.ReadAsStringAsync(); } public void Dispose() { _httpClient?.Dispose(); } } }