From 5ce2360cc765aeacdc8c1d8ee64ce022cbdb7049 Mon Sep 17 00:00:00 2001 From: Florian Zevedei Date: Sun, 12 May 2024 19:01:50 +0300 Subject: [PATCH] Adding callbackdata too long exception and checks --- TelegramBotBase/Constants/Telegram.cs | 5 +++ .../CallbackDataTooLongException.cs | 31 ++++++++++++++++ TelegramBotBase/Form/CallbackData.cs | 35 ++++++++----------- 3 files changed, 50 insertions(+), 21 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..a2ccd92 --- /dev/null +++ b/TelegramBotBase/Exceptions/CallbackDataTooLongException.cs @@ -0,0 +1,31 @@ +using System; +using Telegram.Bot.Exceptions; + +namespace TelegramBotBase.Exceptions; + +public sealed class CallbackDataTooLongException : Exception +{ + 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"; + + static String _message_with_bytes = $"You have exceeded the maximum {Constants.Telegram.MaxCallBackDataBytes} bytes of callback data with @current_callback_bytes@ bytes.\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) + { + + } + + public CallbackDataTooLongException(int current_callback_bytes) : base(getMessage(current_callback_bytes), _innerException) + { + + } + + static String getMessage(int current_callback_bytes = -1) + { + if (current_callback_bytes == -1) + return _message; + + return _message_with_bytes.Replace("@current_callback_bytes@", current_callback_bytes.ToString()); + } +} \ No newline at end of file diff --git a/TelegramBotBase/Form/CallbackData.cs b/TelegramBotBase/Form/CallbackData.cs index 8385551..13b701a 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; @@ -23,22 +25,24 @@ public class CallbackData public static string Create(string method, string value) { - return new CallbackData(method, value).Serialize(); + return new CallbackData(method, value).Serialize(true); } /// /// Serializes data to json string /// /// - public string Serialize() + public string Serialize(bool throwExceptionOnOverflow = false) { - var s = ""; - try - { - s = JsonConvert.SerializeObject(this); - } - catch + var s = string.Empty; + + s = JsonConvert.SerializeObject(this); + + //Is data over 64 bytes ? + int byte_count = Encoding.UTF8.GetByteCount(s); + if (throwExceptionOnOverflow && byte_count > Constants.Telegram.MaxCallBackDataBytes) { + throw new CallbackDataTooLongException(byte_count); } return s; @@ -51,19 +55,8 @@ public class CallbackData /// public static CallbackData Deserialize(string data) { - CallbackData cd = null; - try - { - cd = JsonConvert.DeserializeObject(data); - - return cd; - } - catch - { - } - - return null; + return JsonConvert.DeserializeObject(data); } - public static implicit operator string(CallbackData callbackData) => callbackData.Serialize(); + public static implicit operator string(CallbackData callbackData) => callbackData.Serialize(true); }