From 19599933e3b1f5720d39e54be8f9c48482415526 Mon Sep 17 00:00:00 2001 From: Slavasil Date: Sun, 20 Apr 2025 22:43:33 +0300 Subject: [PATCH] add preset list --- SimpleTGBot/Interactions.cs | 8 +++++++- SimpleTGBot/TelegramBot.cs | 34 ++++++++++++++++++++++++++-------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/SimpleTGBot/Interactions.cs b/SimpleTGBot/Interactions.cs index b440179..7089319 100644 --- a/SimpleTGBot/Interactions.cs +++ b/SimpleTGBot/Interactions.cs @@ -23,11 +23,13 @@ internal static class Interactions public static readonly string backButtonText = "↩️Назад"; public static readonly string gotoPresetsButtonText = "🎨Сохранённые стили"; public static readonly string doneButtonText = "✅Готово"; + public static readonly string choosePresetButtonText = "☑️Сделать активным"; public static readonly IReplyMarkup mainReplyMarkup = new ReplyKeyboardMarkup([[new KeyboardButton("▶️Начать")], [new KeyboardButton("⚙️Настройки")]]); public static readonly IReplyMarkup backButtonReplyMarkup = new ReplyKeyboardMarkup(new KeyboardButton("↩️Назад")); public static readonly IReplyMarkup resultActionReplyMarkup = new ReplyKeyboardMarkup([new KeyboardButton(doneButtonText)]); public static readonly IReplyMarkup settingsReplyMarkup = new ReplyKeyboardMarkup([[new KeyboardButton(gotoPresetsButtonText)], [new KeyboardButton(backButtonText)]]); + public static readonly IReplyMarkup presetsReplyMarkup = new ReplyKeyboardMarkup([[new KeyboardButton(choosePresetButtonText)], [new KeyboardButton(backButtonText)]]); static readonly string[] digitEmojis = ["0️⃣", "1️⃣", "2️⃣", "3️⃣", "4️⃣", "5️⃣", "6️⃣", "7️⃣", "8️⃣", "9️⃣"]; @@ -59,7 +61,7 @@ internal static class Interactions return message == backButtonText; } - public static string MakePresetListMessage(string[] presetNames) + public static string MakePresetListMessage(string[] presetNames, int activePresetIndex) { StringBuilder msg = new StringBuilder(); msg.Append("Твои сохранённые стили:\n"); @@ -68,6 +70,10 @@ internal static class Interactions msg.Append(DigitsToEmoji((i + 1).ToString())); msg.Append(' '); msg.Append(presetNames[i]); + if (i == activePresetIndex) + { + msg.Append(" (выбран)"); + } msg.Append('\n'); } if (presetNames.Length == 0) diff --git a/SimpleTGBot/TelegramBot.cs b/SimpleTGBot/TelegramBot.cs index 7f2fd96..78e9b9b 100644 --- a/SimpleTGBot/TelegramBot.cs +++ b/SimpleTGBot/TelegramBot.cs @@ -212,7 +212,17 @@ internal class TelegramBot { replied = true; dialogData.state = DialogState.ViewingPresets; - await botClient.SendTextMessageAsync(message.Chat.Id, Interactions.MakePresetListMessage((await GetUserPresets(user)).Select(preset => preset.Name).ToArray()), replyMarkup: Interactions.backButtonReplyMarkup); + (UserPreset[] presets, long activePresetId) = await GetUserPresets(user); + int activePresetIndex = 0; + for (int i = 0; i < presets.Length; ++i) + { + if (presets[i].Id == activePresetId) + { + activePresetIndex = i; + break; + } + } + await botClient.SendTextMessageAsync(message.Chat.Id, Interactions.MakePresetListMessage(presets.Select(preset => preset.Name).ToArray(), activePresetIndex), replyMarkup: Interactions.backButtonReplyMarkup); } else if (messageText == Interactions.backButtonText) { @@ -349,19 +359,27 @@ internal class TelegramBot cmd = database.CreateCommand(); UserPreset defaultPreset = UserPreset.Default(); defaultPreset.OwnerId = u.Id; - await AddPresetToDatabase(defaultPreset); + long defaultPresetId = await AddPresetToDatabase(defaultPreset); + + cmd = database.CreateCommand(); + cmd.CommandText = "UPDATE users SET selected_preset = $1 WHERE id = $2"; + cmd.Parameters.AddWithValue("$1", defaultPresetId); + cmd.Parameters.AddWithValue("$2", u.Id); + await cmd.ExecuteNonQueryAsync(); } - async Task AddPresetToDatabase(UserPreset p) + async Task AddPresetToDatabase(UserPreset p) { var cmd = database.CreateCommand(); - cmd.CommandText = "INSERT INTO user_presets (user_id, name, outline_color, title_color, subtitle_color) VALUES ($1, $2, $3, $4, $5)"; + cmd.CommandText = @" + INSERT INTO user_presets (user_id, name, outline_color, title_color, subtitle_color) VALUES ($1, $2, $3, $4, $5); + SELECT last_insert_rowid();"; cmd.Parameters.AddWithValue("$1", p.OwnerId); cmd.Parameters.AddWithValue("$2", p.Name); cmd.Parameters.AddWithValue("$3", (long)p.OutlineColor.ToArgb() & 0xFFFFFFL); cmd.Parameters.AddWithValue("$4", (long)p.TitleColor.ToArgb() & 0xFFFFFFL); cmd.Parameters.AddWithValue("$5", (long)p.SubtitleColor.ToArgb() & 0xFFFFFFL); - await cmd.ExecuteNonQueryAsync(); + return (long)await cmd.ExecuteScalarAsync(); } async Task IsUserInDatabase(User u) @@ -373,10 +391,10 @@ internal class TelegramBot return await reader.ReadAsync(); } - async Task GetUserPresets(User u) + async Task<(UserPreset[], long)> GetUserPresets(User u) { var cmd = database.CreateCommand(); - cmd.CommandText = "SELECT id, user_id, name, outline_color, title_color, subtitle_color FROM user_presets WHERE id = $1"; + cmd.CommandText = "SELECT id, user_id, name, outline_color, title_color, subtitle_color FROM user_presets WHERE user_id = $1"; cmd.Parameters.AddWithValue("$1", u.Id); using var reader = await cmd.ExecuteReaderAsync(); List result = new List(); @@ -392,7 +410,7 @@ internal class TelegramBot SubtitleColor = System.Drawing.Color.FromArgb((int)(0xff000000L | reader.GetInt64(5))), }); } - return result.ToArray(); + return (result.ToArray(), (await GetActiveUserPreset(u)).Id); } async Task GetUserPresetByName(User u, string name)