Browse Source

Bug fix. Add back buttons

Tigran 3 years ago
parent
commit
77bb60241a

+ 1 - 1
CardCollector.sln.DotSettings.user

@@ -18,7 +18,7 @@
 	
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FMessages/@EntryIndexedValue">False</s:Boolean>
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FSortingTypes/@EntryIndexedValue">False</s:Boolean>
-	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FText/@EntryIndexedValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FText/@EntryIndexedValue">True</s:Boolean>
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FStickerEffects_002FEffectTranslations/@EntryIndexedValue">False</s:Boolean>
 	
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>

+ 3 - 0
CardCollector/Commands/CallbackQuery/AuthorsMenu.cs

@@ -22,7 +22,10 @@ namespace CardCollector.Commands.CallbackQuery
             var totalCount = list.Count;
             list = list.GetRange((page - 1) * 10, list.Count >= page * 10 ? 10 : list.Count % 10);
             if (list.Count == 0)
+            {
+                User.Session.UndoCurrentCommand();
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.page_not_found);
+            }
             /* Заменяем сообщение меню на сообщение со списком */
             else
                 await MessageController.EditMessage(User, CallbackMessageId, Messages.choose_author,

+ 3 - 0
CardCollector/Commands/CallbackQuery/BuyAuthorPackMenu.cs

@@ -20,7 +20,10 @@ namespace CardCollector.Commands.CallbackQuery
             var totalCount = packs.Count;
             packs = packs.GetRange((page - 1) * 10, packs.Count >= page * 10 ? 10 : packs.Count % 10);
             if (packs.Count == 0)
+            {
+                User.Session.UndoCurrentCommand();
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.page_not_found);
+            }
             else
                 await MessageController.EditMessage(User, CallbackMessageId, Messages.choose_author,
                     Keyboard.GetShopPacksKeyboard(packs, Keyboard.GetPagePanel(page, totalCount, CommandText)));

+ 1 - 1
CardCollector/Commands/CallbackQuery/BuyGems.cs

@@ -18,7 +18,7 @@ namespace CardCollector.Commands.CallbackQuery
             await User.ClearChat();
             var messages = await MessageController.SendInvoice(User, Text.gems_title, Text.gems_description, 
                 Command.buy_gems_item, new[] {new LabeledPrice(Text.gems_label50, 100)},
-                1000000, new [] {500, 1000, 2500, 5000});
+                1000000, new [] {500, 1000, 2500, 5000}, Keyboard.BuyGemsKeyboard);
             User.Session.Messages.Add(messages.MessageId);
         }
 

+ 1 - 1
CardCollector/Commands/CallbackQuery/DailyTasks.cs

@@ -25,7 +25,7 @@ namespace CardCollector.Commands.CallbackQuery
                     userTasks.Add((int)key, await DailyTaskDao.AddNew(User.Id, (int)key));
                 text += $"\n{task.Title} ({task.Goal - userTasks[(int) key].Progress}/{task.Goal})";
             }
-            var message = await MessageController.SendMessage(User, text);
+            var message = await MessageController.SendMessage(User, text, Keyboard.BackKeyboard);
             User.Session.Messages.Add(message.MessageId);
         }
 

+ 6 - 0
CardCollector/Commands/CallbackQuery/OpenAuthorPackMenu.cs

@@ -19,14 +19,20 @@ namespace CardCollector.Commands.CallbackQuery
             var packs = (await UserPacksDao.GetUserPacks(User.Id))
                 .Where(item => item.Count > 0 && item.PackId != 1).ToList();
             if (packs.Count == 0)
+            {
+                User.Session.UndoCurrentCommand();
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.packs_count_zero, true);
+            }
             else
             {
                 var page = int.Parse(CallbackData.Split('=')[1]);
                 var totalCount = packs.Count;
                 packs = packs.GetRange((page - 1) * 10, packs.Count >= page * 10 ? 10 : packs.Count % 10);
                 if (packs.Count == 0)
+                {
+                    User.Session.UndoCurrentCommand();
                     await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.page_not_found);
+                }
                 else
                     await MessageController.EditMessage(User, CallbackMessageId, Messages.choose_author,
                         await Keyboard.GetUserPacksKeyboard(packs, Keyboard.GetPagePanel(page, totalCount, CommandText)));

+ 1 - 1
CardCollector/Commands/CallbackQuery/PackInfo.cs

@@ -14,7 +14,7 @@ namespace CardCollector.Commands.CallbackQuery
 
         public override async Task Execute()
         {
-            await MessageController.EditMessage(User, CallbackMessageId, Messages.pack_info);
+            await MessageController.EditMessage(User, CallbackMessageId, Messages.pack_info, Keyboard.BackKeyboard);
         }
 
         public PackInfo() { }

+ 1 - 1
CardCollector/Commands/CallbackQuery/ShowInfo.cs

@@ -27,7 +27,7 @@ namespace CardCollector.Commands.CallbackQuery
                 ? module.SelectedPosition?.TimeLimit.ToString(CultureInfo.CurrentCulture).Split(' ')[0]
                 : Text.unexpired;
             if (module.SelectedPosition != null) message += $"\n{Text.time_limit} {dateText}";
-            if (module.SelectedPack != null) message += $"\n{Text.opened_count} {module.SelectedPack.OpenedCount}";
+            if (module.SelectedPack != null) message += $"\n{Text.opened_count} {module.SelectedPack.OpenedCount}{Text.items}";
             if (description != "") message += $"\n{Text.description}: {description}";
             await MessageController.AnswerCallbackQuery(User, CallbackQueryId, message, true);
         }

+ 3 - 0
CardCollector/Commands/CallbackQuery/SpecialOffers.cs

@@ -20,7 +20,10 @@ namespace CardCollector.Commands.CallbackQuery
                 .WhereAsync(async offer => offer.IsInfinite || !await SpecialOfferUsersDao.NowUsed(User.Id, offer.Id));
             var shopEntities = specialOffers.ToList();
             if (shopEntities.Count < 1)
+            {
+                User.Session.UndoCurrentCommand();
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.offers_not_found, true);
+            }
             else
                 await MessageController.EditMessage(User, CallbackMessageId, Messages.available_offers,
                     Keyboard.SpecialOffersKeyboard(shopEntities));

+ 4 - 2
CardCollector/Controllers/MessageController.cs

@@ -231,13 +231,15 @@ namespace CardCollector.Controllers
         }
 
         public static async Task<Message> SendInvoice(UserEntity user, string title, string description, 
-            string payload, IEnumerable<LabeledPrice> prices, int maxTip = 0, IEnumerable<int> tips = null, Currency currency = Currency.USD)
+            string payload, IEnumerable<LabeledPrice> prices, int maxTip = 0, IEnumerable<int> tips = null,
+            InlineKeyboardMarkup keyboard = null, Currency currency = Currency.USD)
         {
             try
             {
                 if (!user.IsBlocked)
                     return await Bot.Client.SendInvoiceAsync(user.ChatId, title, description, payload, 
-                        AppSettings.PAYMENT_PROVIDER, currency.ToString(), prices, maxTip, tips, disableNotification: true);
+                        AppSettings.PAYMENT_PROVIDER, currency.ToString(), prices, maxTip, tips, 
+                        replyMarkup: keyboard, disableNotification: true);
             }
             catch (Exception e)
             {

+ 7 - 0
CardCollector/Resources/Keyboard.cs

@@ -96,6 +96,13 @@ namespace CardCollector.Resources
             new[] {InlineKeyboardButton.WithCallbackData(Text.back, Command.back)},
         });
 
+        /* Клавиатура для покупок */
+        public static readonly InlineKeyboardMarkup BuyGemsKeyboard = new (new[]
+        {
+            new[] {InlineKeyboardButton.WithPayment(Text.buy_gems_button)},
+            new[] {InlineKeyboardButton.WithCallbackData(Text.back, Command.back)},
+        });
+
         /* Клавиатура с отменой и выставлением */
         public static readonly InlineKeyboardMarkup AuctionPutCancelKeyboard = new (new[]
         {

+ 12 - 11
CardCollector/Resources/Messages.Designer.cs

@@ -495,13 +495,13 @@ namespace CardCollector.Resources {
         /// <summary>
         ///   Looks up a localized string similar to При покупке &quot;Случайного пака&quot; Вам может выпасть ЛЮБОЙ стикер от ЛЮБОГО художника
         ///
-        ///        При покупке &quot;Пака художника&quot; Вам может выпасть ЛЮБОЙ стикер от выбранного Вами художника
+        ///При покупке &quot;Пака художника&quot; Вам может выпасть ЛЮБОЙ стикер от выбранного Вами художника
         ///
-        ///        Вероятности выпадения стикера с тиром:
-        ///        1 - 80%
-        ///        2 - 16%
-        ///        3 - 3.3%
-        ///        4 - 0.7%.
+        ///Вероятности выпадения стикера с тиром:
+        ///1 - 80%
+        ///2 - 16%
+        ///3 - 3.3%
+        ///4 - 0.7%.
         /// </summary>
         internal static string pack_info {
             get {
@@ -673,11 +673,12 @@ namespace CardCollector.Resources {
         
         /// <summary>
         ///   Looks up a localized string similar to Пожалуйста, загрузите ваш xlsx файл с описанием стикеров, по одной строке на стикер. Соблюдайте порядок, в котором вы загружали стикеры.
-        ///        Структура таблицы должна сожержать столбцы в следующем порядке: Название, Автор, Тир, Эмоции, Эффект, Описание.
-        ///        Оставьте первую строку пустой или заполните ее этими заголовками, значения начинайте вписывать со !второй! строки.
-        ///        Поле &quot;Эффект&quot; Может содержать целочисленное значение. Вот описания этих значений:
-        ///        0 - Нет эффекта
-        ///        1 - У [rest of string was truncated]&quot;;.
+        ///Структура таблицы должна сожержать столбцы в следующем порядке: Название, Автор, Тир, Эмоции, Эффект, Описание.
+        ///Оставьте первую строку пустой или заполните ее этими заголовками, значения начинайте вписывать со !второй! строки.
+        ///Поле &quot;Эффект&quot; Может содержать целочисленное значение. Вот описания этих значений:
+        ///0 - Нет эффекта
+        ///1 - Увеличивает копилку на 200 монет
+        ///2 - Пол [rest of string was truncated]&quot;;.
         /// </summary>
         internal static string upload_your_file {
             get {

+ 16 - 16
CardCollector/Resources/Messages.resx

@@ -186,13 +186,13 @@
     <data name="pack_info" xml:space="preserve">
         <value>При покупке "Случайного пака" Вам может выпасть ЛЮБОЙ стикер от ЛЮБОГО художника
 
-        При покупке "Пака художника" Вам может выпасть ЛЮБОЙ стикер от выбранного Вами художника
+При покупке "Пака художника" Вам может выпасть ЛЮБОЙ стикер от выбранного Вами художника
 
-        Вероятности выпадения стикера с тиром:
-        1 - 80%
-        2 - 16%
-        3 - 3.3%
-        4 - 0.7%</value>
+Вероятности выпадения стикера с тиром:
+1 - 80%
+2 - 16%
+3 - 3.3%
+4 - 0.7%</value>
     </data>
     <data name="pack_prize" xml:space="preserve">
         <value>Поздравляем! Вы получили случайный пак! Открыть его можно во вкладке профиля.</value>
@@ -262,15 +262,15 @@
     </data>
     <data name="upload_your_file" xml:space="preserve">
         <value>Пожалуйста, загрузите ваш xlsx файл с описанием стикеров, по одной строке на стикер. Соблюдайте порядок, в котором вы загружали стикеры.
-        Структура таблицы должна сожержать столбцы в следующем порядке: Название, Автор, Тир, Эмоции, Эффект, Описание.
-        Оставьте первую строку пустой или заполните ее этими заголовками, значения начинайте вписывать со !второй! строки.
-        Поле "Эффект" Может содержать целочисленное значение. Вот описания этих значений:
-        0 - Нет эффекта
-        1 - Увеличивает копилку на 200 монет
-        2 - Пользователь получает 25% алмазов к своему кошельку
-        3 - Скидка на аукционе 5%
-        4 - Случайный пак раз в 5 дней
-        5 - Случайный стикер 2 тира раз в 3 дня
-        6 - Случайный стикер 1 тира раз в 3 дня</value>
+Структура таблицы должна сожержать столбцы в следующем порядке: Название, Автор, Тир, Эмоции, Эффект, Описание.
+Оставьте первую строку пустой или заполните ее этими заголовками, значения начинайте вписывать со !второй! строки.
+Поле "Эффект" Может содержать целочисленное значение. Вот описания этих значений:
+0 - Нет эффекта
+1 - Увеличивает копилку на 200 монет
+2 - Пользователь получает 25% алмазов к своему кошельку
+3 - Скидка на аукционе 5%
+4 - Случайный пак раз в 5 дней
+5 - Случайный стикер 2 тира раз в 3 дня
+6 - Случайный стикер 1 тира раз в 3 дня</value>
     </data>
 </root>

+ 10 - 1
CardCollector/Resources/Text.Designer.cs

@@ -159,6 +159,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to 💎 Купить алмазы 💎.
+        /// </summary>
+        internal static string buy_gems_button {
+            get {
+                return ResourceManager.GetString("buy_gems_button", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Купить пак.
         /// </summary>
@@ -502,7 +511,7 @@ namespace CardCollector.Resources {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Количество открытых:.
+        ///   Looks up a localized string similar to Пользователи открыли этот пак за все время:.
         /// </summary>
         internal static string opened_count {
             get {

+ 4 - 1
CardCollector/Resources/Text.resx

@@ -250,6 +250,9 @@
         <value>Завершить загрузку стикеров</value>
     </data>
     <data name="opened_count" xml:space="preserve">
-        <value>Количество открытых:</value>
+        <value>Пользователи открыли этот пак за все время:</value>
+    </data>
+    <data name="buy_gems_button" xml:space="preserve">
+        <value>💎 Купить алмазы 💎</value>
     </data>
 </root>

+ 22 - 1
CardCollector/Session/Session.cs

@@ -24,6 +24,7 @@ namespace CardCollector.Session
         public readonly List<int> Messages = new();
         /* Последовательность вызова списка меню */
         private readonly Stack<MenuInformation> MenuStack = new();
+        private Type PreviousCommandType;
         private Type CurrentCommandType;
 
         public UserSession(UserEntity user)
@@ -93,17 +94,37 @@ namespace CardCollector.Session
 
         public void AddMenuToStack(UpdateModel menu)
         {
-            MenuStack.Push(new MenuInformation(menu, State));
+            var menuInfo = new MenuInformation(menu, State);
+            if (!MenuStack.Contains(menuInfo, new MenuComparer())) MenuStack.Push(menuInfo);
         }
 
         public void SetCurrentCommand(Type commandType)
         {
+            PreviousCommandType = CurrentCommandType;
             if(commandType != typeof(Back)) CurrentCommandType = commandType;
         }
 
+        public void UndoCurrentCommand()
+        {
+            CurrentCommandType = PreviousCommandType;
+        }
+
         public void ClearMenuStack()
         {
             MenuStack.Clear();
         }
     }
+
+    public class MenuComparer : IEqualityComparer<MenuInformation>
+    {
+        public bool Equals(MenuInformation x, MenuInformation y)
+        {
+            return x?.GetMenuType() == y?.GetMenuType();
+        }
+
+        public int GetHashCode(MenuInformation obj)
+        {
+            return base.GetHashCode();
+        }
+    }
 }