using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; namespace Server.Helper; public class DiscordWebhook { public static class FormUpload { public class FileParameter { public byte[] File { get; set; } public string FileName { get; set; } public string ContentType { get; set; } public FileParameter(byte[] file) : this(file, null) { } public FileParameter(byte[] file, string filename) : this(file, filename, null) { } public FileParameter(byte[] file, string filename, string contenttype) { File = file; FileName = filename; ContentType = contenttype; } } private static readonly Encoding encoding = Encoding.UTF8; public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary postParameters) { string text = $"----------{Guid.NewGuid():N}"; string contentType = "multipart/form-data; boundary=" + text; byte[] multipartFormData = GetMultipartFormData(postParameters, text); return PostForm(postUrl, userAgent, contentType, multipartFormData); } private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData) { if (!(WebRequest.Create(postUrl) is HttpWebRequest httpWebRequest)) { throw new NullReferenceException("request is not a http request"); } httpWebRequest.Method = "POST"; httpWebRequest.ContentType = contentType; httpWebRequest.UserAgent = userAgent; httpWebRequest.CookieContainer = new CookieContainer(); httpWebRequest.ContentLength = formData.Length; using (Stream stream = httpWebRequest.GetRequestStream()) { stream.Write(formData, 0, formData.Length); stream.Close(); } return httpWebRequest.GetResponse() as HttpWebResponse; } private static byte[] GetMultipartFormData(Dictionary postParameters, string boundary) { Stream stream = new MemoryStream(); bool flag = false; foreach (KeyValuePair postParameter in postParameters) { if (flag) { stream.Write(encoding.GetBytes("\r\n"), 0, encoding.GetByteCount("\r\n")); } flag = true; if (postParameter.Value is FileParameter) { FileParameter fileParameter = (FileParameter)postParameter.Value; string s = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n", boundary, postParameter.Key, fileParameter.FileName ?? postParameter.Key, fileParameter.ContentType ?? "application/octet-stream"); stream.Write(encoding.GetBytes(s), 0, encoding.GetByteCount(s)); stream.Write(fileParameter.File, 0, fileParameter.File.Length); } else { string s2 = $"--{boundary}\r\nContent-Disposition: form-data; name=\"{postParameter.Key}\"\r\n\r\n{postParameter.Value}"; stream.Write(encoding.GetBytes(s2), 0, encoding.GetByteCount(s2)); } } string s3 = "\r\n--" + boundary + "--\r\n"; stream.Write(encoding.GetBytes(s3), 0, encoding.GetByteCount(s3)); stream.Position = 0L; byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); stream.Close(); return array; } } private static string defaultUserAgent = ""; private static string defaultAvatar = ""; public static string Send(string mssgBody, string userName, string webhook) { HttpWebResponse httpWebResponse = FormUpload.MultipartFormDataPost(webhook, defaultUserAgent, new Dictionary { { "username", userName }, { "content", mssgBody }, { "avatar_url", defaultAvatar } }); string result = new StreamReader(httpWebResponse.GetResponseStream()).ReadToEnd(); httpWebResponse.Close(); return result; } }