#73 api side, untested

This commit is contained in:
glax 2023-10-27 13:47:37 +02:00
parent 38df54baff
commit 438c11af4f
5 changed files with 84 additions and 11 deletions

View File

@ -9,5 +9,6 @@
<s:Boolean x:Key="/Default/UserDictionary/Words/=Manganato/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Manganato/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mangasee/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Mangasee/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Mangaworld/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Mangaworld/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Ntfy/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Taskmanager/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Taskmanager/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Tranga/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary> <s:Boolean x:Key="/Default/UserDictionary/Words/=Tranga/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

View File

@ -10,7 +10,7 @@ public abstract class NotificationConnector : GlobalBase
this.notificationConnectorType = notificationConnectorType; this.notificationConnectorType = notificationConnectorType;
} }
public enum NotificationConnectorType : byte { Gotify = 0, LunaSea = 1 } public enum NotificationConnectorType : byte { Gotify = 0, LunaSea = 1, Ntfy = 2 }
public abstract void SendNotification(string title, string notificationText); public abstract void SendNotification(string title, string notificationText);
} }

View File

@ -21,11 +21,15 @@ public class NotificationManagerJsonConverter : JsonConverter
JsonSerializer serializer) JsonSerializer serializer)
{ {
JObject jo = JObject.Load(reader); JObject jo = JObject.Load(reader);
if (jo["notificationConnectorType"]!.Value<byte>() == (byte)NotificationConnector.NotificationConnectorType.Gotify) switch (jo["notificationConnectorType"]!.Value<byte>())
return new Gotify(this._clone, jo.GetValue("endpoint")!.Value<string>()!, jo.GetValue("appToken")!.Value<string>()!); {
else if (jo["notificationConnectorType"]!.Value<byte>() == case (byte)NotificationConnector.NotificationConnectorType.Gotify:
(byte)NotificationConnector.NotificationConnectorType.LunaSea) return new Gotify(this._clone, jo.GetValue("endpoint")!.Value<string>()!, jo.GetValue("appToken")!.Value<string>()!);
return new LunaSea(this._clone, jo.GetValue("id")!.Value<string>()!); case (byte)NotificationConnector.NotificationConnectorType.LunaSea:
return new LunaSea(this._clone, jo.GetValue("id")!.Value<string>()!);
case (byte)NotificationConnector.NotificationConnectorType.Ntfy:
return new Ntfy(this._clone, jo.GetValue("endpoint")!.Value<string>()!, jo.GetValue("auth")!.Value<string>()!);
}
throw new Exception(); throw new Exception();
} }

View File

@ -0,0 +1,58 @@
using System.Text;
using Newtonsoft.Json;
namespace Tranga.NotificationConnectors;
public class Ntfy : NotificationConnector
{
// ReSharper disable once MemberCanBePrivate.Global
public string endpoint { get; init; }
private string auth { get; init; }
private const string Topic = "tranga";
private readonly HttpClient _client = new();
[JsonConstructor]
public Ntfy(GlobalBase clone, string endpoint, string auth) : base(clone, NotificationConnectorType.Ntfy)
{
if (!baseUrlRex.IsMatch(endpoint))
throw new ArgumentException("endpoint does not match pattern");
this.endpoint = endpoint;
this.auth = auth;
}
public override string ToString()
{
return $"Ntfy {endpoint} {Topic}";
}
public override void SendNotification(string title, string notificationText)
{
Log($"Sending notification: {title} - {notificationText}");
MessageData message = new(title, notificationText);
HttpRequestMessage request = new(HttpMethod.Post, $"{this.endpoint}?auth={this.auth}");
request.Content = new StringContent(JsonConvert.SerializeObject(message, Formatting.None), Encoding.UTF8, "application/json");
HttpResponseMessage response = _client.Send(request);
if (!response.IsSuccessStatusCode)
{
StreamReader sr = new (response.Content.ReadAsStream());
Log($"{response.StatusCode}: {sr.ReadToEnd()}");
}
}
private class MessageData
{
// ReSharper disable UnusedAutoPropertyAccessor.Local
public string topic { get; }
public string title { get; }
public string message { get; }
public int priority { get; }
public MessageData(string title, string message)
{
this.topic = Topic;
this.title = title;
this.message = message;
this.priority = 3;
}
}
}

View File

@ -362,10 +362,7 @@ public class Server : GlobalBase
} }
AddNotificationConnector(new Gotify(this, gotifyUrl, gotifyAppToken)); AddNotificationConnector(new Gotify(this, gotifyUrl, gotifyAppToken));
SendResponse(HttpStatusCode.Accepted, response); SendResponse(HttpStatusCode.Accepted, response);
break; }else if (notificationConnectorType is NotificationConnector.NotificationConnectorType.LunaSea)
}
if (notificationConnectorType is NotificationConnector.NotificationConnectorType.LunaSea)
{ {
if (!requestVariables.TryGetValue("lunaseaWebhook", out string? lunaseaWebhook)) if (!requestVariables.TryGetValue("lunaseaWebhook", out string? lunaseaWebhook))
{ {
@ -374,7 +371,20 @@ public class Server : GlobalBase
} }
AddNotificationConnector(new LunaSea(this, lunaseaWebhook)); AddNotificationConnector(new LunaSea(this, lunaseaWebhook));
SendResponse(HttpStatusCode.Accepted, response); SendResponse(HttpStatusCode.Accepted, response);
break; }else if (notificationConnectorType is NotificationConnector.NotificationConnectorType.Ntfy)
{
if (!requestVariables.TryGetValue("ntfyUrl", out string? ntfyUrl) ||
!requestVariables.TryGetValue("ntfyAuth", out string? ntfyAuth))
{
SendResponse(HttpStatusCode.BadRequest, response);
break;
}
AddNotificationConnector(new Ntfy(this, ntfyUrl, ntfyAuth));
SendResponse(HttpStatusCode.Accepted, response);
}
else
{
SendResponse(HttpStatusCode.BadRequest, response);
} }
break; break;
case "LibraryConnectors/Update": case "LibraryConnectors/Update":