- adding Delete Options for Both sides to AutoCleanForm

- general Performance improvements
- Adding MessageReceived Event to DeviceSession, will be called before "message loop"
- AutoCleanForm optimized and clean process added to public function MessageCleanup (so you could call on your own)
- IsGroup for DeviceSession fixed to correct test
- IsChannel added to DeviceSession

Examples:
- SimpleForm (#1) derived now from AutoCleanForm to show deletion mode for both sides
This commit is contained in:
FlorianDahn 2019-05-04 16:32:48 +02:00
parent 3a78a98b9e
commit 4f1eae543d
9 changed files with 144 additions and 54 deletions

View File

@ -8,12 +8,18 @@ using TelegramBotBase.Form;
namespace TelegramBaseTest.Tests
{
public class SimpleForm : FormBase
public class SimpleForm : AutoCleanForm
{
public SimpleForm()
{
this.DeleteSide = eSide.Both;
this.DeleteMode = eDeleteMode.OnLeavingForm;
}
public override async Task Opened()
{
await this.Device.Send("Hello world! (send 'back' to get back to Start)");
await this.Device.Send("Hello world! (send 'back' to get back to Start)\r\nOr\r\nhi, hello, maybe, bye and ciao");
}

View File

@ -15,10 +15,6 @@ namespace TelegramBaseTest.Tests
String LastMessage { get; set; }
public override async Task Init(params object[] param)
{
}
public override async Task Opened()
{
@ -30,12 +26,6 @@ namespace TelegramBaseTest.Tests
await this.Device.Send("Ciao from Form 1");
}
public override async Task Load(MessageResult message)
{
}
public override async Task Action(MessageResult message)
{

View File

@ -15,10 +15,6 @@ namespace TelegramBaseTest.Tests
public class TestForm2 : FormBase
{
public override async Task Init(params object[] param)
{
}
public override async Task Opened()
{
@ -30,10 +26,6 @@ namespace TelegramBaseTest.Tests
await this.Device.Send("Ciao from Form 2");
}
public override async Task Load(MessageResult message)
{
}
public override async Task Action(MessageResult message)
{

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Telegram.Bot.Types;
namespace TelegramBotBase.Base
{
public class MessageReceivedEventArgs
{
public int MessageId
{
get
{
return this.Message.MessageId;
}
}
public Message Message { get; set; }
public MessageReceivedEventArgs(Message m)
{
this.Message = m;
}
}
}

View File

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Base
{
@ -23,6 +24,9 @@ namespace TelegramBotBase.Base
}
}
public DeviceSession Device
{ get; set; }
/// <summary>
/// The message id
/// </summary>

View File

@ -9,18 +9,18 @@ namespace TelegramBotBase.Base
{
public class MessageSentEventArgs
{
public int MessageId { get; set; }
public int MessageId
{
get
{
return this.Message.MessageId;
}
}
public Message Message { get; set; }
public MessageSentEventArgs()
public MessageSentEventArgs(Message message)
{
}
public MessageSentEventArgs(int MessageId, Message message)
{
this.MessageId = MessageId;
this.Message = message;
}

View File

@ -201,12 +201,15 @@ namespace TelegramBotBase
try
{
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
e.Device = ds;
if (LogAllMessages)
{
DeviceSession ds2 = this.Sessions.GetSession(e.DeviceId);
OnMessage(new MessageIncomeResult(e.DeviceId, ds2, e));
OnMessage(new MessageIncomeResult(e.DeviceId, ds, e));
}
ds?.OnMessageReceived(new MessageReceivedEventArgs(e.Message));
Client_TryMessage(sender, e);
}
@ -223,10 +226,11 @@ namespace TelegramBotBase
private async void Client_TryMessage(object sender, MessageResult e)
{
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
DeviceSession ds = e.Device;
if (ds == null)
{
ds = await this.Sessions.StartSession<T>(e.DeviceId);
e.Device = ds;
ds.LastMessage = e.Message;
@ -286,10 +290,12 @@ namespace TelegramBotBase
{
try
{
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
e.Device = ds;
if (LogAllMessages)
{
DeviceSession ds2 = this.Sessions.GetSession(e.DeviceId);
OnMessage(new MessageIncomeResult(e.DeviceId, ds2, e));
OnMessage(new MessageIncomeResult(e.DeviceId, ds, e));
}
Client_TryAction(sender, e);
@ -303,10 +309,11 @@ namespace TelegramBotBase
private async void Client_TryAction(object sender, MessageResult e)
{
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
DeviceSession ds = e.Device;
if (ds == null)
{
ds = await this.Sessions.StartSession<T>(e.DeviceId);
e.Device = ds;
}

View File

@ -17,6 +17,8 @@ namespace TelegramBotBase.Form
public eDeleteMode DeleteMode { get; set; }
public eSide DeleteSide { get; set; }
public enum eDeleteMode
{
None = 0,
@ -24,10 +26,18 @@ namespace TelegramBotBase.Form
OnLeavingForm = 2
}
public enum eSide
{
BotOnly = 0,
UserOnly = 1,
Both = 2
}
public AutoCleanForm()
{
this.OldMessages = new List<Message>();
this.DeleteMode = eDeleteMode.OnEveryCall;
this.DeleteSide = eSide.BotOnly;
}
@ -37,10 +47,24 @@ namespace TelegramBotBase.Form
return;
this.Device.MessageSent += Device_MessageSent;
this.Device.MessageReceived += Device_MessageReceived;
}
private void Device_MessageReceived(object sender, MessageReceivedEventArgs e)
{
if (this.DeleteSide == eSide.BotOnly)
return;
this.OldMessages.Add(e.Message);
}
private void Device_MessageSent(object sender, MessageSentEventArgs e)
{
if (this.DeleteSide == eSide.UserOnly)
return;
this.OldMessages.Add(e.Message);
}
@ -49,19 +73,11 @@ namespace TelegramBotBase.Form
if (this.DeleteMode != eDeleteMode.OnEveryCall)
return;
while (this.OldMessages.Count > 0)
{
if (!await this.Device.DeleteMessage(this.OldMessages[0].MessageId))
{
//Nachricht konnte nicht gelöscht werden, vermutlich existiert diese nicht mehr
if (this.OldMessages.Count > 0)
this.OldMessages.RemoveAt(0);
}
}
await MessageCleanup();
}
/// <summary>
/// Fügt eine Nachricht zu der Liste der löschenden hinzu.
/// Adds a message to this of removable ones
/// </summary>
/// <param name="Id"></param>
public void AddMessage(Message m)
@ -70,7 +86,7 @@ namespace TelegramBotBase.Form
}
/// <summary>
/// Behält die Nachricht mit der angegebenen Id.
/// Keeps the message by removing it from the list
/// </summary>
/// <param name="Id"></param>
public void LeaveMessage(int Id)
@ -83,7 +99,7 @@ namespace TelegramBotBase.Form
}
/// <summary>
/// Behält die zuletzt gesendete Nachricht.
/// Keeps the last sent message
/// </summary>
public void LeaveLastMessage()
{
@ -98,9 +114,24 @@ namespace TelegramBotBase.Form
if (this.DeleteMode != eDeleteMode.OnLeavingForm)
return;
foreach (var m in this.OldMessages)
await MessageCleanup();
}
/// <summary>
/// Cleans up all remembered messages.
/// </summary>
/// <returns></returns>
public async Task MessageCleanup()
{
while (this.OldMessages.Count > 0)
{
await this.Device.DeleteMessage(m.MessageId);
if (!await this.Device.DeleteMessage(this.OldMessages[0].MessageId))
{
//Message can't be deleted cause it seems not to exist anymore
if (this.OldMessages.Count > 0)
this.OldMessages.RemoveAt(0);
}
}
}
}

View File

@ -68,13 +68,25 @@ namespace TelegramBotBase.Sessions
{
get
{
return this.LastMessage != null && this.LastMessage.Chat.Id != this.LastMessage.From.Id;
return this.LastMessage != null && (this.LastMessage.Chat.Type == ChatType.Group | this.LastMessage.Chat.Type == ChatType.Supergroup);
}
}
/// <summary>
/// Returns if the messages is posted within a channel.
/// </summary>
public bool IsChannel
{
get
{
return this.LastMessage != null && this.LastMessage.Chat.Type == ChatType.Channel;
}
}
public EventHandlerList __Events = new EventHandlerList();
private static object __evMessageSent = new object();
private static object __evMessageReceived = new object();
public DeviceSession()
{
@ -151,7 +163,7 @@ namespace TelegramBotBase.Sessions
{
m = await (this.Client.TelegramClient.SendTextMessageAsync(this.DeviceId, text, replyToMessageId: replyTo, replyMarkup: markup, disableNotification: disableNotification));
OnMessageSent(new MessageSentEventArgs(m.MessageId, m));
OnMessageSent(new MessageSentEventArgs( m));
}
catch (ApiRequestException ex)
{
@ -184,7 +196,7 @@ namespace TelegramBotBase.Sessions
{
m = await (this.Client.TelegramClient.SendTextMessageAsync(this.DeviceId, text, replyToMessageId: replyTo, replyMarkup: markup, disableNotification: disableNotification));
OnMessageSent(new MessageSentEventArgs(m.MessageId, m));
OnMessageSent(new MessageSentEventArgs(m));
}
catch (ApiRequestException ex)
{
@ -223,7 +235,7 @@ namespace TelegramBotBase.Sessions
{
m = await this.Client.TelegramClient.SendPhotoAsync(this.DeviceId, file, replyToMessageId: replyTo, replyMarkup: markup, disableNotification: disableNotification);
OnMessageSent(new MessageSentEventArgs(m.MessageId, m));
OnMessageSent(new MessageSentEventArgs(m));
}
catch (ApiRequestException ex)
{
@ -319,7 +331,7 @@ namespace TelegramBotBase.Sessions
var m = await this.Client.TelegramClient.SendDocumentAsync(this.DeviceId, document, caption, replyMarkup: markup, disableNotification: disableNotification, replyToMessageId: replyTo);
OnMessageSent(new MessageSentEventArgs(m.MessageId, m));
OnMessageSent(new MessageSentEventArgs(m));
return m;
}
@ -372,7 +384,7 @@ namespace TelegramBotBase.Sessions
try
{
await this.Client.TelegramClient.DeleteMessageAsync(this.DeviceId, messageId);
return true;
}
catch (ApiRequestException ex)
@ -414,5 +426,25 @@ namespace TelegramBotBase.Sessions
(this.__Events[__evMessageSent] as EventHandler<MessageSentEventArgs>)?.Invoke(this, e);
}
/// <summary>
/// Eventhandler for received messages
/// </summary>
public event EventHandler<MessageReceivedEventArgs> MessageReceived
{
add
{
this.__Events.AddHandler(__evMessageReceived, value);
}
remove
{
this.__Events.RemoveHandler(__evMessageReceived, value);
}
}
public void OnMessageReceived(MessageReceivedEventArgs e)
{
(this.__Events[__evMessageReceived] as EventHandler<MessageReceivedEventArgs>)?.Invoke(this, e);
}
}
}