using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using TelegramBotBase.Base; using TelegramBotBase.Sessions; namespace TelegramBotBase.Form { /// /// Base class for forms /// public class FormBase : IDisposable { public DeviceSession Device { get; set; } public MessageClient Client { get; set; } public bool CustomEventManagement { get; set; } = false; /// /// has this formular already been disposed ? /// public bool IsDisposed { get; set; } = false; public List Controls { get; set; } public FormBase() { this.Controls = new List(); } public FormBase(MessageClient Client): this() { this.Client = Client; } /// /// Will get called at the initialization (once per context) /// public virtual async Task Init(params object[] args) { } /// /// Gets invoked if gets navigated to this form /// /// public virtual async Task Opened() { } public virtual async Task Closed() { foreach (var b in this.Controls) { await b.Cleanup(); } } public virtual async Task PreLoad(MessageResult message) { } /// /// Gets invoked if the form gets loaded and on every message belongs to this context /// /// /// public virtual async Task Load(MessageResult message) { } /// /// Gets invoked if the user has clicked a button. /// /// /// public virtual async Task Action(MessageResult message) { } /// /// Gets invoked if the user has sent some media (Photo, Audio, Video, Contact, Location, Document) /// /// /// public virtual async Task SentData(DataResult message) { } /// /// Gets invoked at the end of the cycle to "Render" text, images, buttons, etc... /// /// /// public virtual async Task Render(MessageResult message) { } /// /// Navigates to a new form /// /// /// public async Task NavigateTo(FormBase newForm, params object[] args) { DeviceSession ds = this.Device; if (ds == null) return; ds.FormSwitched = true; ds.PreviousForm = ds.ActiveForm; ds.ActiveForm = newForm; newForm.Client = this.Client; newForm.Device = ds; await newForm.Init(args); await this.Closed(); await newForm.Opened(); } /// /// Cleanup /// public void Dispose() { this.Client = null; this.Device = null; this.IsDisposed = true; } } }