Fix: TeleBot variant callbacks now use CallbackDataMapper to decode short IDs - fixes GUID parsing errors

This commit is contained in:
SysAdmin 2025-10-05 22:48:53 +01:00
parent 76707eb565
commit 0801fb004c

View File

@ -1268,11 +1268,16 @@ namespace TeleBot.Handlers
private async Task HandleSelectVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
{
// Format: selectvar:productId:quantity:multiBuyId
var productId = Guid.Parse(data[1]);
var quantity = int.Parse(data[2]);
var multiBuyId = data.Length > 3 && data[3] != "null" ? data[3] : null;
// Use mapper to decode short IDs back to GUIDs
var (_, productId, quantity, multiBuyId) = _mapper.ParseCallback(string.Join(":", data));
var product = await _shopService.GetProductAsync(productId);
if (!productId.HasValue || !quantity.HasValue)
{
_logger.LogError("Invalid callback data for selectvar: {Data}", string.Join(":", data));
return;
}
var product = await _shopService.GetProductAsync(productId.Value);
if (product == null)
{
await bot.SendTextMessageAsync(message.Chat.Id, "Product not found.");
@ -1281,14 +1286,14 @@ namespace TeleBot.Handlers
// Clear any previous selections
session.TempData["selected_variants"] = new List<string>();
session.TempData["current_product"] = productId;
session.TempData["current_quantity"] = quantity;
session.TempData["current_multibuy"] = multiBuyId;
session.TempData["current_product"] = productId.Value;
session.TempData["current_quantity"] = quantity.Value;
session.TempData["current_multibuy"] = multiBuyId?.ToString();
await bot.EditMessageReplyMarkupAsync(
message.Chat.Id,
message.MessageId,
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity, multiBuyId)
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity.Value, multiBuyId?.ToString())
);
session.State = SessionState.SelectingVariants;
@ -1297,10 +1302,17 @@ namespace TeleBot.Handlers
private async Task HandleSetVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
{
// Format: setvariant:productId:variantName (for single item)
var productId = Guid.Parse(data[1]);
// Use mapper to decode short IDs back to GUIDs
var (_, productId, _, _) = _mapper.ParseCallback(string.Join(":", data.Take(2)));
var variantName = data[2];
var product = await _shopService.GetProductAsync(productId);
if (!productId.HasValue)
{
_logger.LogError("Invalid callback data for setvariant: {Data}", string.Join(":", data));
return;
}
var product = await _shopService.GetProductAsync(productId.Value);
if (product == null) return;
// For single item, replace selection
@ -1325,12 +1337,17 @@ namespace TeleBot.Handlers
private async Task HandleAddVariant(ITelegramBotClient bot, Message message, UserSession session, string[] data)
{
// Format: addvariant:productId:quantity:variantName:multiBuyId (for multi-buy)
var productId = Guid.Parse(data[1]);
var quantity = int.Parse(data[2]);
// Use mapper to decode short IDs back to GUIDs
var (_, productId, quantity, multiBuyId) = _mapper.ParseCallback(string.Join(":", data.Take(4)));
var variantName = data[3];
var multiBuyId = data.Length > 4 && data[4] != "null" ? data[4] : null;
var product = await _shopService.GetProductAsync(productId);
if (!productId.HasValue || !quantity.HasValue)
{
_logger.LogError("Invalid callback data for addvariant: {Data}", string.Join(":", data));
return;
}
var product = await _shopService.GetProductAsync(productId.Value);
if (product == null) return;
// Get current selections
@ -1339,7 +1356,7 @@ namespace TeleBot.Handlers
: new List<string>();
// Add variant if not at quantity limit
if (selectedVariants.Count < quantity)
if (selectedVariants.Count < quantity.Value)
{
selectedVariants.Add(variantName);
session.TempData["selected_variants"] = selectedVariants;
@ -1348,34 +1365,39 @@ namespace TeleBot.Handlers
await bot.EditMessageReplyMarkupAsync(
message.Chat.Id,
message.MessageId,
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity, multiBuyId, selectedVariants)
replyMarkup: MenuBuilder.VariantSelectionMenu(product, quantity.Value, multiBuyId?.ToString(), selectedVariants)
);
}
private async Task HandleConfirmVariant(ITelegramBotClient bot, CallbackQuery callbackQuery, UserSession session, string[] data)
{
// Format: confirmvar:productId:quantity:multiBuyId:variantList
var productId = Guid.Parse(data[1]);
var quantity = int.Parse(data[2]);
var multiBuyId = data[3] != "null" ? Guid.Parse(data[3]) : (Guid?)null;
// Use mapper to decode short IDs back to GUIDs
var (_, productId, quantity, multiBuyId) = _mapper.ParseCallback(string.Join(":", data.Take(4)));
var variantString = data[4];
var selectedVariants = variantString.Split(',').ToList();
var product = await _shopService.GetProductAsync(productId);
if (!productId.HasValue || !quantity.HasValue)
{
_logger.LogError("Invalid callback data for confirmvar: {Data}", string.Join(":", data));
return;
}
var product = await _shopService.GetProductAsync(productId.Value);
if (product == null) return;
// Add to cart with selected variants
var cartItem = session.Cart.AddItem(product, quantity, multiBuyId, variantId: null, selectedVariants);
var cartItem = session.Cart.AddItem(product, quantity.Value, multiBuyId, variantId: null, selectedVariants);
// Show success message
await bot.AnswerCallbackQueryAsync(
callbackQuery.Id,
$"✅ Added {quantity}x {product.Name} with {string.Join(", ", selectedVariants)} to cart!",
$"✅ Added {quantity.Value}x {product.Name} with {string.Join(", ", selectedVariants)} to cart!",
showAlert: true
);
// Return to product view
await HandleProductDetail(bot, callbackQuery.Message!, session, productId);
await HandleProductDetail(bot, callbackQuery.Message!, session, productId.Value);
// Clear temp data
session.TempData.Remove("selected_variants");