From 6a62d73fe071891f1612e10ace9282034c57f998 Mon Sep 17 00:00:00 2001 From: FlorianDahn Date: Thu, 2 Apr 2020 12:37:53 +0700 Subject: [PATCH] Adding Edited Features - FormBase: adding Edited method - MessageClient: adding MessageEdit event - GroupForm: adding Edited method - DeviceSession: adding ChatTitle --- TelegramBotBase/Base/FormBase.cs | 9 ++++ TelegramBotBase/Base/MessageClient.cs | 42 +++++++++++++-- TelegramBotBase/BotBase.cs | 66 +++++++++++++++++++++-- TelegramBotBase/Form/GroupForm.cs | 11 +++- TelegramBotBase/Sessions/DeviceSession.cs | 5 ++ 5 files changed, 125 insertions(+), 8 deletions(-) diff --git a/TelegramBotBase/Base/FormBase.cs b/TelegramBotBase/Base/FormBase.cs index 093aa5a..efa1a71 100644 --- a/TelegramBotBase/Base/FormBase.cs +++ b/TelegramBotBase/Base/FormBase.cs @@ -191,6 +191,15 @@ namespace TelegramBotBase.Form } + /// + /// Gets invoked, when a messages has been edited. + /// + /// + /// + public virtual async Task Edited(MessageResult message) + { + + } /// diff --git a/TelegramBotBase/Base/MessageClient.cs b/TelegramBotBase/Base/MessageClient.cs index 69e7974..d57d480 100644 --- a/TelegramBotBase/Base/MessageClient.cs +++ b/TelegramBotBase/Base/MessageClient.cs @@ -23,6 +23,8 @@ namespace TelegramBotBase.Base private static object __evOnMessage = new object(); + private static object __evOnMessageEdit = new object(); + private static object __evCallbackQuery = new object(); @@ -84,13 +86,11 @@ namespace TelegramBotBase.Base { this.TelegramClient.Timeout = new TimeSpan(0, 0, 30); - this.TelegramClient.OnMessage += TelegramClient_OnMessage; + this.TelegramClient.OnMessageEdited += TelegramClient_OnMessageEdited; this.TelegramClient.OnCallbackQuery += TelegramClient_OnCallbackQuery; - } - private async void TelegramClient_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e) { //Skip empty messages by default @@ -109,6 +109,25 @@ namespace TelegramBotBase.Base } } + + private async void TelegramClient_OnMessageEdited(object sender, Telegram.Bot.Args.MessageEventArgs e) + { + //Skip empty messages by default + if (e.Message == null) + return; + + try + { + var mr = new MessageResult(e); + mr.Client = this; + OnMessageEdit(mr); + } + catch + { + + } + } + private async void TelegramClient_OnCallbackQuery(object sender, Telegram.Bot.Args.CallbackQueryEventArgs e) { try @@ -143,6 +162,23 @@ namespace TelegramBotBase.Base (this.__Events[__evOnMessage] as EventHandler)?.Invoke(this, result); } + public event EventHandler MessageEdit + { + add + { + this.__Events.AddHandler(__evOnMessageEdit, value); + } + remove + { + this.__Events.RemoveHandler(__evOnMessageEdit, value); + } + } + + public void OnMessageEdit(MessageResult result) + { + (this.__Events[__evOnMessageEdit] as EventHandler)?.Invoke(this, result); + } + public event EventHandler Action { add diff --git a/TelegramBotBase/BotBase.cs b/TelegramBotBase/BotBase.cs index 6069582..668338b 100644 --- a/TelegramBotBase/BotBase.cs +++ b/TelegramBotBase/BotBase.cs @@ -6,6 +6,7 @@ using System.Text; using System.Threading.Tasks; using Telegram.Bot; using TelegramBotBase.Args; +using TelegramBotBase.Attributes; using TelegramBotBase.Base; using TelegramBotBase.Form; using TelegramBotBase.Interfaces; @@ -165,6 +166,7 @@ namespace TelegramBotBase return; this.Client.Message += Client_Message; + this.Client.MessageEdit += Client_MessageEdit; this.Client.Action += Client_Action; @@ -202,7 +204,7 @@ namespace TelegramBotBase } } - private void Client_Message(object sender, MessageResult e) + private async void Client_Message(object sender, MessageResult e) { if (this.SkipAllMessages) return; @@ -219,7 +221,7 @@ namespace TelegramBotBase ds?.OnMessageReceived(new MessageReceivedEventArgs(e.Message)); - Client_TryMessage(sender, e); + await Client_TryMessage(sender, e); } catch (Telegram.Bot.Exceptions.ApiRequestException ex) { @@ -232,7 +234,7 @@ namespace TelegramBotBase } } - private async void Client_TryMessage(object sender, MessageResult e) + private async Task Client_TryMessage(object sender, MessageResult e) { DeviceSession ds = e.Device; if (ds == null) @@ -245,6 +247,7 @@ namespace TelegramBotBase OnSessionBegins(new SessionBeginEventArgs(e.DeviceId, ds)); } + ds.ChatTitle = e.Message.Chat.Username ?? e.Message.Chat.Title; ds.LastAction = DateTime.Now; ds.LastMessage = e.Message; @@ -303,6 +306,61 @@ namespace TelegramBotBase } + private async void Client_MessageEdit(object sender, MessageResult e) + { + if (this.SkipAllMessages) + return; + + try + { + DeviceSession ds = this.Sessions.GetSession(e.DeviceId); + e.Device = ds; + + if (LogAllMessages) + { + OnMessage(new MessageIncomeEventArgs(e.DeviceId, ds, e)); + } + + //Call same, to handle received liked edited + ds?.OnMessageReceived(new MessageReceivedEventArgs(e.Message)); + + await Client_TryMessageEdit(sender, e); + } + catch (Telegram.Bot.Exceptions.ApiRequestException ex) + { + + } + catch (Exception ex) + { + DeviceSession ds = this.Sessions.GetSession(e.DeviceId); + OnException(new SystemExceptionEventArgs(e.Message.Text, ds?.DeviceId ?? -1, ds, ex)); + } + } + + private async Task Client_TryMessageEdit(object sender, MessageResult e) + { + DeviceSession ds = e.Device; + if (ds == null) + { + ds = await this.Sessions.StartSession(e.DeviceId); + e.Device = ds; + } + + ds.ChatTitle = e.Message.Chat.Username ?? e.Message.Chat.Title; + ds.LastAction = DateTime.Now; + ds.LastMessage = e.Message; + + //Pre Loading Event + await ds.ActiveForm.Edited(e); + + //When form has been switched due navigation within the edit method, reopen Client_Message + if (ds.FormSwitched) + { + await Client_TryMessage(sender, e); + } + + } + private void Client_Action(object sender, MessageResult e) { try @@ -333,7 +391,7 @@ namespace TelegramBotBase e.Device = ds; } - + ds.ChatTitle = e.Message.Chat.Username ?? e.Message.Chat.Title; ds.LastAction = DateTime.Now; ds.LastMessage = e.Message; diff --git a/TelegramBotBase/Form/GroupForm.cs b/TelegramBotBase/Form/GroupForm.cs index 3d7e115..b610de1 100644 --- a/TelegramBotBase/Form/GroupForm.cs +++ b/TelegramBotBase/Form/GroupForm.cs @@ -49,12 +49,16 @@ namespace TelegramBotBase.Form default: - OnMessage(message); + await OnMessage(message); break; } + } + public override async Task Edited(MessageResult message) + { + await OnMessageEdit(message); } public virtual async Task OnMemberChanges(MemberChangeEventArgs e) @@ -73,5 +77,10 @@ namespace TelegramBotBase.Form { } + + public virtual async Task OnMessageEdit(MessageResult e) + { + + } } } diff --git a/TelegramBotBase/Sessions/DeviceSession.cs b/TelegramBotBase/Sessions/DeviceSession.cs index 3c4c190..b86125f 100644 --- a/TelegramBotBase/Sessions/DeviceSession.cs +++ b/TelegramBotBase/Sessions/DeviceSession.cs @@ -29,6 +29,11 @@ namespace TelegramBotBase.Sessions /// public long DeviceId { get; set; } + /// + /// Username of user or group + /// + public String ChatTitle { get; set; } + /// /// When did any last action happend (message received or button clicked) ///