namespace FileFlows.Telegram.Communication; /// /// A Telegram flow element that sends a message /// public class Telegram: 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 => "fab fa-telegram-plane"; /// /// Gets if this can be used in a failure flow /// public override bool FailureNode => true; /// public override string CustomColor => "#0088CC"; /// /// Gets the Help URL /// public override string HelpUrl => "https://fileflows.com/docs/plugins/telegram"; /// /// Gets or sets the message /// [Required] [Template(1, nameof(MessageTemplates))] public string Message { get; set; } = string.Empty; private static List? _MessageTemplates; 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; } } /// /// Sends a telegram message /// /// the bot token /// the chat id /// the message to send /// true if successful, otherwise false internal static bool SendMessage(string botToken, string chatId, string message) { using (HttpClient client = new HttpClient()) { string apiUrl = $"https://api.telegram.org/bot{botToken}/sendMessage"; var content = new FormUrlEncodedContent(new[] { new KeyValuePair("chat_id", chatId), new KeyValuePair("text", message) }); var response = client.PostAsync(apiUrl, content).Result; return response.IsSuccessStatusCode; } } /// /// Executes the flow element /// /// the node parameters /// the output to call next public override int Execute(NodeParameters args) { try { var settings = args.GetPluginSettings(); if (settings == null) { args.Logger?.ILog("Failed to load plugin settings"); return 2; } if (string.IsNullOrWhiteSpace(settings?.BotToken)) { args.Logger?.WLog("No Bot Token set"); return 2; } if (string.IsNullOrWhiteSpace(settings?.ChatId)) { args.Logger?.WLog("No Chat ID set"); return 2; } var message = args.RenderTemplate!(Message); var result = SendMessage(settings.BotToken, settings.ChatId, message); return result ? 1 : 2; } catch (Exception ex) { args.Logger?.WLog("Error sending message: " + ex.Message); return 2; } } }