using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Text; using log4net; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; namespace API.Schema.NotificationsContext.NotificationConnectors; [PrimaryKey("Name")] public class NotificationConnector(string name, string url, Dictionary headers, string httpMethod, string body) { [StringLength(64)] public string Name { get; init; } = name; [StringLength(2048)] [Url] public string Url { get; internal set; } = url; [Required] public Dictionary Headers { get; internal set; } = headers; [StringLength(8)] public string HttpMethod { get; internal set; } = httpMethod; [StringLength(4096)] public string Body { get; internal set; } = body; [NotMapped] private readonly HttpClient Client = new() { DefaultRequestHeaders = { { "User-Agent", Tranga.Settings.UserAgent } } }; [JsonIgnore] protected ILog Log = LogManager.GetLogger(name); public void SendNotification(string title, string notificationText) { Log.Info($"Sending notification: {title} - {notificationText}"); string formattedUrl = FormatStr(Url, title, notificationText); string formattedBody = FormatStr(Body, title, notificationText); Dictionary formattedHeaders = Headers.ToDictionary(h => h.Key, h => FormatStr(h.Value, title, notificationText)); HttpRequestMessage request = new(System.Net.Http.HttpMethod.Parse(HttpMethod), formattedUrl); foreach (var (key, value) in formattedHeaders) request.Headers.Add(key, value); request.Content = new StringContent(formattedBody); request.Content.Headers.ContentType = new ("application/json"); Log.Debug($"Request: {request}"); HttpResponseMessage response = Client.Send(request); Log.Debug($"Response status code: {response.StatusCode} {response.Content.ReadAsStringAsync().Result}"); } private string FormatStr(string str, string title, string text) { StringBuilder sb = new (str); sb.Replace("%title", title); sb.Replace("%text", text); return sb.ToString(); } public override string ToString() => $"{GetType().Name} {Name}"; }