using System.ComponentModel; using System.Text.Json; namespace FileFlows.Pushover.Communication; /// /// A Pushover flow element that sends a message /// public class Pushover: Node { /// /// Gets the number of inputs to this flow element /// public override int Inputs => 1; /// /// Gets the number of outputs to this flow element /// public override int Outputs => 2; /// /// Gets the type of flow element /// public override FlowElementType Type => FlowElementType.Communication; /// /// Gets the icon for this flow element /// public override string Icon => "svg:pushover"; /// /// Gets if this can be used in a failure flow /// public override bool FailureNode => true; /// public override string CustomColor => "#40a6eb"; /// /// Gets the Help URL /// public override string HelpUrl => "https://fileflows.com/docs/plugins/pushover"; /// /// Gets or sets the priority of the message /// [Select(nameof(Priorities), 1)] [DefaultValue(0)] public int Priority { get; set; } = 2; /// /// Gets or sets the expiry in seconds for the message /// [ConditionEquals(nameof(Priority), 2)] [NumberInt(2)] [DefaultValue(600)] [Range(1, 86400)] public int Expire { get; set; } = 2; /// /// Gets or sets the retry time in seconds /// [ConditionEquals(nameof(Priority), 2)] [NumberInt(2)] [DefaultValue(600)] [Range(30, 86400)] public int Retry { get; set; } = 2; private static List? _Priorities; /// /// Gets a list of message templates /// public static List Priorities { get { if (_Priorities == null) { _Priorities = new List { new () { Label = "Lowest", Value = -1 }, new () { Label = "Normal", Value = 0 }, new () { Label = "High", Value = 1 }, new () { Label = "Emergency", Value = 2 } }; } return _Priorities; } } /// /// Gets or sets the message /// [Required] [Template(3, nameof(MessageTemplates))] public string Message { get; set; } = string.Empty; private static List? _MessageTemplates; /// /// Gets a list of message templates /// public static List MessageTemplates { get { if (_MessageTemplates == null) { _MessageTemplates = new List { new () { Label = "Basic", Value = @"File: {{ file.Orig.FullName }} Size: {{ file.Size }}" }, new () { Label = "File Size Changes", Value = @" {{ difference = file.Size - file.Orig.Size }} {{ percent = (difference / file.Orig.Size) * 100 | math.round 2 }} Input File: {{ file.Orig.FullName }} Output File: {{ file.FullName }} Original Size: {{ file.Orig.Size | file_size }} Final Size: {{ file.Size | file_size }} {{- if difference > 0 }} File grew in size: {{ difference | math.abs | file_size }} {{ else }} File shrunk in size by: {{ difference | file_size }} / {{ percent }}% {{ end }}"} }; } return _MessageTemplates; } } /// /// Executes the flow element /// /// the node parameters /// the output to call next public override int Execute(NodeParameters args) { try { var settings = args.GetPluginSettings(); if (string.IsNullOrWhiteSpace(settings?.UserKey)) { args.Logger?.WLog("No user set"); return 2; } if (string.IsNullOrWhiteSpace(settings?.ApiToken)) { args.Logger?.WLog("No API Token set"); return 2; } string message = args.RenderTemplate!(this.Message); if (string.IsNullOrWhiteSpace(message)) { args.Logger?.WLog("No message to send"); return 2; } List> parameters = new () { new ("token", settings.ApiToken), new ("user", settings.UserKey), new ("message", message), new ("priority", Priority.ToString()) }; if (Priority == 2) { int expire = Expire < 1 ? 1 : (Expire > 86400 ? 86400 : Expire); parameters.Add(new("expire", expire.ToString())); int retry = Retry < 30 ? 30 : (Retry > 86400 ? 86400 : Retry); parameters.Add(new("retry", retry.ToString())); } var content = new FormUrlEncodedContent(parameters); using var httpClient = new HttpClient(); var response = httpClient.PostAsync("https://api.pushover.net/1/messages.json", content).Result; if (response.IsSuccessStatusCode) return 1; string error = response.Content.ReadAsStringAsync().Result; args.Logger?.WLog("Error from Pushover: " + error); return 2; } catch (Exception ex) { args.Logger?.WLog("Error sending message: " + ex.Message); return 2; } } }