From 53886fa6bf647df3ddad99ff4df00b15c78e111c Mon Sep 17 00:00:00 2001 From: Florian Zevedei Date: Sat, 3 Feb 2024 01:39:12 +0100 Subject: [PATCH] Adding exception for too long callback data. - right now only in DEBUG compilation and only for the static operator --- TelegramBotBase/Constants/Telegram.cs | 5 +++++ .../CallbackDataTooLongException.cs | 21 +++++++++++++++++++ TelegramBotBase/Form/CallbackData.cs | 16 ++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 TelegramBotBase/Exceptions/CallbackDataTooLongException.cs diff --git a/TelegramBotBase/Constants/Telegram.cs b/TelegramBotBase/Constants/Telegram.cs index a2837d7..f91642d 100644 --- a/TelegramBotBase/Constants/Telegram.cs +++ b/TelegramBotBase/Constants/Telegram.cs @@ -16,4 +16,9 @@ public static class Telegram public const int MaxReplyKeyboardCols = 12; public const int MessageDeletionsPerSecond = 30; + + /// + /// The maximum length of callback data. Will raise an exception of it exceeds it. + /// + public const int MaxCallBackDataBytes = 64; } \ No newline at end of file diff --git a/TelegramBotBase/Exceptions/CallbackDataTooLongException.cs b/TelegramBotBase/Exceptions/CallbackDataTooLongException.cs new file mode 100644 index 0000000..300e0e5 --- /dev/null +++ b/TelegramBotBase/Exceptions/CallbackDataTooLongException.cs @@ -0,0 +1,21 @@ +using System; +using Telegram.Bot.Exceptions; + +namespace TelegramBotBase.Exceptions; + +public sealed class CallbackDataTooLongException : Exception +{ + //public override string Message => + // $"You have exceeded the maximum {Constants.Telegram.MaxCallBackDataBytes} bytes."; + + static ApiRequestException _innerException = new Telegram.Bot.Exceptions.ApiRequestException("Bad Request: BUTTON_DATA_INVALID", 400); + + static String _message = $"You have exceeded the maximum {Constants.Telegram.MaxCallBackDataBytes} bytes of callback data.\r\nThis is a pre-sending message from the TelegramBotBase framework.\r\nread more: https://core.telegram.org/bots/api#inlinekeyboardbutton"; + + public CallbackDataTooLongException() : base(_message, _innerException) + { + + } + + +} diff --git a/TelegramBotBase/Form/CallbackData.cs b/TelegramBotBase/Form/CallbackData.cs index 8385551..84c699e 100644 --- a/TelegramBotBase/Form/CallbackData.cs +++ b/TelegramBotBase/Form/CallbackData.cs @@ -1,4 +1,6 @@ using Newtonsoft.Json; +using System.Text; +using TelegramBotBase.Exceptions; namespace TelegramBotBase.Form; @@ -30,7 +32,7 @@ public class CallbackData /// Serializes data to json string /// /// - public string Serialize() + public string Serialize(bool throwExceptionOnOverflow = false) { var s = ""; try @@ -41,6 +43,16 @@ public class CallbackData { } +#if DEBUG + + //Data is over 64 bytes + if(throwExceptionOnOverflow && Encoding.UTF8.GetByteCount(s) > Constants.Telegram.MaxCallBackDataBytes) + { + throw new CallbackDataTooLongException(); + } + +#endif + return s; } @@ -65,5 +77,5 @@ public class CallbackData return null; } - public static implicit operator string(CallbackData callbackData) => callbackData.Serialize(); + public static implicit operator string(CallbackData callbackData) => callbackData.Serialize(true); }