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);
}