add preset list

This commit is contained in:
Slavasil 2025-04-20 22:43:33 +03:00
parent a457ea1a19
commit 19599933e3
2 changed files with 33 additions and 9 deletions

View File

@ -23,11 +23,13 @@ internal static class Interactions
public static readonly string backButtonText = "↩️Назад"; public static readonly string backButtonText = "↩️Назад";
public static readonly string gotoPresetsButtonText = "🎨Сохранённые стили"; public static readonly string gotoPresetsButtonText = "🎨Сохранённые стили";
public static readonly string doneButtonText = "✅Готово"; 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 mainReplyMarkup = new ReplyKeyboardMarkup([[new KeyboardButton("▶️Начать")], [new KeyboardButton("⚙️Настройки")]]);
public static readonly IReplyMarkup backButtonReplyMarkup = new ReplyKeyboardMarkup(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 resultActionReplyMarkup = new ReplyKeyboardMarkup([new KeyboardButton(doneButtonText)]);
public static readonly IReplyMarkup settingsReplyMarkup = new ReplyKeyboardMarkup([[new KeyboardButton(gotoPresetsButtonText)], [new KeyboardButton(backButtonText)]]); 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⃣"]; 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; return message == backButtonText;
} }
public static string MakePresetListMessage(string[] presetNames) public static string MakePresetListMessage(string[] presetNames, int activePresetIndex)
{ {
StringBuilder msg = new StringBuilder(); StringBuilder msg = new StringBuilder();
msg.Append("Твои сохранённые стили:\n"); msg.Append("Твои сохранённые стили:\n");
@ -68,6 +70,10 @@ internal static class Interactions
msg.Append(DigitsToEmoji((i + 1).ToString())); msg.Append(DigitsToEmoji((i + 1).ToString()));
msg.Append(' '); msg.Append(' ');
msg.Append(presetNames[i]); msg.Append(presetNames[i]);
if (i == activePresetIndex)
{
msg.Append(" (выбран)");
}
msg.Append('\n'); msg.Append('\n');
} }
if (presetNames.Length == 0) if (presetNames.Length == 0)

View File

@ -212,7 +212,17 @@ internal class TelegramBot
{ {
replied = true; replied = true;
dialogData.state = DialogState.ViewingPresets; 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) else if (messageText == Interactions.backButtonText)
{ {
@ -349,19 +359,27 @@ internal class TelegramBot
cmd = database.CreateCommand(); cmd = database.CreateCommand();
UserPreset defaultPreset = UserPreset.Default(); UserPreset defaultPreset = UserPreset.Default();
defaultPreset.OwnerId = u.Id; 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<long> AddPresetToDatabase(UserPreset p)
{ {
var cmd = database.CreateCommand(); 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("$1", p.OwnerId);
cmd.Parameters.AddWithValue("$2", p.Name); cmd.Parameters.AddWithValue("$2", p.Name);
cmd.Parameters.AddWithValue("$3", (long)p.OutlineColor.ToArgb() & 0xFFFFFFL); cmd.Parameters.AddWithValue("$3", (long)p.OutlineColor.ToArgb() & 0xFFFFFFL);
cmd.Parameters.AddWithValue("$4", (long)p.TitleColor.ToArgb() & 0xFFFFFFL); cmd.Parameters.AddWithValue("$4", (long)p.TitleColor.ToArgb() & 0xFFFFFFL);
cmd.Parameters.AddWithValue("$5", (long)p.SubtitleColor.ToArgb() & 0xFFFFFFL); cmd.Parameters.AddWithValue("$5", (long)p.SubtitleColor.ToArgb() & 0xFFFFFFL);
await cmd.ExecuteNonQueryAsync(); return (long)await cmd.ExecuteScalarAsync();
} }
async Task<bool> IsUserInDatabase(User u) async Task<bool> IsUserInDatabase(User u)
@ -373,10 +391,10 @@ internal class TelegramBot
return await reader.ReadAsync(); return await reader.ReadAsync();
} }
async Task<UserPreset[]> GetUserPresets(User u) async Task<(UserPreset[], long)> GetUserPresets(User u)
{ {
var cmd = database.CreateCommand(); 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); cmd.Parameters.AddWithValue("$1", u.Id);
using var reader = await cmd.ExecuteReaderAsync(); using var reader = await cmd.ExecuteReaderAsync();
List<UserPreset> result = new List<UserPreset>(); List<UserPreset> result = new List<UserPreset>();
@ -392,7 +410,7 @@ internal class TelegramBot
SubtitleColor = System.Drawing.Color.FromArgb((int)(0xff000000L | reader.GetInt64(5))), SubtitleColor = System.Drawing.Color.FromArgb((int)(0xff000000L | reader.GetInt64(5))),
}); });
} }
return result.ToArray(); return (result.ToArray(), (await GetActiveUserPreset(u)).Id);
} }
async Task<UserPreset?> GetUserPresetByName(User u, string name) async Task<UserPreset?> GetUserPresetByName(User u, string name)