using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using TelegramBotBase.Args; using TelegramBotBase.Attributes; using TelegramBotBase.Base; namespace TelegramBotBase.Form { [IgnoreState] public class ConfirmDialog : ModalDialog { /// /// The message the users sees. /// public String Message { get; set; } /// /// An additional optional value. /// public object Tag { get; set; } /// /// Automatically close form on button click /// public bool AutoCloseOnClick { get; set; } = true; public List Buttons { get; set; } private EventHandlerList __Events { get; set; } = new EventHandlerList(); private static object __evButtonClicked { get; } = new object(); public ConfirmDialog() { } public ConfirmDialog(String Message) { this.Message = Message; this.Buttons = new List(); } public ConfirmDialog(String Message, params ButtonBase[] Buttons) { this.Message = Message; this.Buttons = Buttons.ToList(); } /// /// Adds one Button /// /// public void AddButton(ButtonBase button) { this.Buttons.Add(button); } public override async Task Action(MessageResult message) { if (message.Handled) return; if (!message.IsFirstHandler) return; var call = message.GetData(); if (call == null) return; message.Handled = true; await message.ConfirmAction(); await message.DeleteMessage(); ButtonBase button = this.Buttons.FirstOrDefault(a => a.Value == call.Value); if (button == null) { return; } OnButtonClicked(new ButtonClickedEventArgs(button) { Tag = this.Tag }); if (AutoCloseOnClick) await CloseForm(); } public override async Task Render(MessageResult message) { ButtonForm btn = new ButtonForm(); var buttons = this.Buttons.Select(a => new ButtonBase(a.Text, CallbackData.Create("action", a.Value))).ToList(); btn.AddButtonRow(buttons); await this.Device.Send(this.Message, btn); } public event EventHandler ButtonClicked { add { this.__Events.AddHandler(__evButtonClicked, value); } remove { this.__Events.RemoveHandler(__evButtonClicked, value); } } public void OnButtonClicked(ButtonClickedEventArgs e) { (this.__Events[__evButtonClicked] as EventHandler)?.Invoke(this, e); } } }