Tigran 3 anni fa
parent
commit
56f89623d5
78 ha cambiato i file con 158 aggiunte e 258 eliminazioni
  1. 1 0
      CardCollector.sln.DotSettings.user
  2. 4 8
      CardCollector/Bot.cs
  3. 0 1
      CardCollector/Commands/CallbackQuery/AuthorsMenu.cs
  4. 4 3
      CardCollector/Commands/CallbackQuery/Back.cs
  5. 0 1
      CardCollector/Commands/CallbackQuery/BuyAuthorPackMenu.cs
  6. 0 2
      CardCollector/Commands/CallbackQuery/BuyCoins.cs
  7. 1 5
      CardCollector/Commands/CallbackQuery/BuyGems.cs
  8. 0 1
      CardCollector/Commands/CallbackQuery/BuyPack.cs
  9. 4 8
      CardCollector/Commands/CallbackQuery/BuyShopItem.cs
  10. 1 3
      CardCollector/Commands/CallbackQuery/BuySticker.cs
  11. 0 2
      CardCollector/Commands/CallbackQuery/CollectIncome.cs
  12. 5 6
      CardCollector/Commands/CallbackQuery/Combine.cs
  13. 0 2
      CardCollector/Commands/CallbackQuery/CombineMenu.cs
  14. 2 7
      CardCollector/Commands/CallbackQuery/CombineStickers.cs
  15. 3 3
      CardCollector/Commands/CallbackQuery/ConfirmBuying.cs
  16. 0 2
      CardCollector/Commands/CallbackQuery/ConfirmExchange.cs
  17. 1 2
      CardCollector/Commands/CallbackQuery/ConfirmationSelling.cs
  18. 1 3
      CardCollector/Commands/CallbackQuery/Count.cs
  19. 1 5
      CardCollector/Commands/CallbackQuery/DailyTasks.cs
  20. 1 2
      CardCollector/Commands/CallbackQuery/DeleteCombine.cs
  21. 4 5
      CardCollector/Commands/CallbackQuery/EndUploadStickers.cs
  22. 1 4
      CardCollector/Commands/CallbackQuery/MyPacks.cs
  23. 0 1
      CardCollector/Commands/CallbackQuery/OpenAuthorPackMenu.cs
  24. 2 7
      CardCollector/Commands/CallbackQuery/OpenPack.cs
  25. 0 2
      CardCollector/Commands/CallbackQuery/PackInfo.cs
  26. 2 6
      CardCollector/Commands/CallbackQuery/PutForAuction.cs
  27. 0 2
      CardCollector/Commands/CallbackQuery/SelectEmoji.cs
  28. 1 6
      CardCollector/Commands/CallbackQuery/SelectOffer.cs
  29. 0 2
      CardCollector/Commands/CallbackQuery/SelectPrice.cs
  30. 1 4
      CardCollector/Commands/CallbackQuery/SelectShopPack.cs
  31. 0 2
      CardCollector/Commands/CallbackQuery/SelectSort.cs
  32. 0 2
      CardCollector/Commands/CallbackQuery/SelectTier.cs
  33. 0 2
      CardCollector/Commands/CallbackQuery/SetFilter.cs
  34. 0 2
      CardCollector/Commands/CallbackQuery/ShowInfo.cs
  35. 0 1
      CardCollector/Commands/CallbackQuery/SpecialOffers.cs
  36. 0 3
      CardCollector/Commands/CallbackQueryCommand.cs
  37. 0 2
      CardCollector/Commands/ChosenInlineResult/GetUnlimitedStickerAndExecuteCommand.cs
  38. 2 7
      CardCollector/Commands/ChosenInlineResult/SelectStickerInline.cs
  39. 1 7
      CardCollector/Commands/ChosenInlineResult/SelectTrader.cs
  40. 1 4
      CardCollector/Commands/ChosenInlineResult/SendPrivateSticker.cs
  41. 0 2
      CardCollector/Commands/ChosenInlineResult/SendSticker.cs
  42. 0 2
      CardCollector/Commands/ChosenInlineResult/StickerInfo.cs
  43. 1 4
      CardCollector/Commands/CommandNotFound.cs
  44. 0 2
      CardCollector/Commands/IgnoreUpdate.cs
  45. 0 2
      CardCollector/Commands/InlineQuery/ShowAuctionStickers.cs
  46. 0 2
      CardCollector/Commands/InlineQuery/ShowCollectionStickers.cs
  47. 0 2
      CardCollector/Commands/InlineQuery/ShowCombineStickers.cs
  48. 0 2
      CardCollector/Commands/InlineQuery/ShowStickersInBotChat.cs
  49. 0 2
      CardCollector/Commands/InlineQuery/ShowStickersInGroup.cs
  50. 0 2
      CardCollector/Commands/InlineQuery/ShowStickersInPrivate.cs
  51. 0 2
      CardCollector/Commands/InlineQuery/ShowStickersInShopPack.cs
  52. 0 2
      CardCollector/Commands/InlineQuery/ShowTradersInBotChat.cs
  53. 7 5
      CardCollector/Commands/Message/Auction.cs
  54. 6 5
      CardCollector/Commands/Message/Collection.cs
  55. 1 4
      CardCollector/Commands/Message/CreateToken.cs
  56. 5 5
      CardCollector/Commands/Message/DownloadStickerPack.cs
  57. 0 2
      CardCollector/Commands/Message/EnterEmoji.cs
  58. 0 2
      CardCollector/Commands/Message/EnterGemsExchange.cs
  59. 0 2
      CardCollector/Commands/Message/EnterGemsPrice.cs
  60. 1 4
      CardCollector/Commands/Message/Menu.cs
  61. 2 4
      CardCollector/Commands/Message/Profile.cs
  62. 8 7
      CardCollector/Commands/Message/Shop.cs
  63. 1 5
      CardCollector/Commands/Message/ShowFiltersMenu.cs
  64. 0 2
      CardCollector/Commands/Message/ShowSample.cs
  65. 0 2
      CardCollector/Commands/Message/Start.cs
  66. 2 5
      CardCollector/Commands/Message/StopBot.cs
  67. 4 4
      CardCollector/Commands/Message/UploadFile.cs
  68. 0 2
      CardCollector/Commands/Message/UploadSticker.cs
  69. 0 2
      CardCollector/Commands/MyChatMember/MyChatMemberCommand.cs
  70. 1 5
      CardCollector/Commands/PreCheckoutQuery/BuyGems.cs
  71. 0 2
      CardCollector/Commands/PreCheckoutQuery/Test.cs
  72. 4 2
      CardCollector/Commands/UpdateModel.cs
  73. 57 17
      CardCollector/Controllers/MessageController.cs
  74. 0 1
      CardCollector/DailyTasks/DailyTask.cs
  75. 0 2
      CardCollector/DataBase/Entity/UserStickerRelationEntity.cs
  76. 1 1
      CardCollector/Session/Modules/CollectionModule.cs
  77. 12 1
      CardCollector/Session/Session.cs
  78. 1 2
      CardCollector/StickerEffects/EffectFunctions.cs

+ 1 - 0
CardCollector.sln.DotSettings.user

@@ -1,4 +1,5 @@
 <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
+	<s:String x:Key="/Default/CodeInspection/Highlighting/SweaWarningsMode/@EntryValue">ShowAndRun</s:String>
 	<s:String x:Key="/Default/CodeInspection/PencilsConfiguration/ActualSeverity/@EntryValue">WARNING</s:String>
 	<s:String x:Key="/Default/CodeInspection/PencilsConfiguration/FiltersState/=CodeStyle/@EntryIndexedValue">On</s:String>
 	<s:String x:Key="/Default/CodeInspection/PencilsConfiguration/FiltersState/=NamingFilter/@EntryIndexedValue">On</s:String>

+ 4 - 8
CardCollector/Bot.cs

@@ -58,15 +58,11 @@ namespace CardCollector
             cts.Cancel();
         }
 
-        public static void StopProgram()
+        public static async Task StopProgram()
         {
-            _timer.Elapsed += OnTimerOnElapsed;
-            static async void OnTimerOnElapsed(object o, ElapsedEventArgs elapsedEventArgs)
-            {
-                _timer.Stop();
-                await UserDao.ClearMemory();
-                _end.Set();
-            }
+            await CardCollectorDatabase.SaveAllChangesAsync();
+            await UserDao.ClearMemory();
+            _end.Set();
         }
 
         private static async void SavingChanges(object o, ElapsedEventArgs e)

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

@@ -11,7 +11,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class AuthorsMenu : CallbackQueryCommand
     {
         protected override string CommandText => Command.authors_menu;
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
 
         public override async Task Execute()

+ 4 - 3
CardCollector/Commands/CallbackQuery/Back.cs

@@ -1,4 +1,5 @@
 using System.Threading.Tasks;
+using CardCollector.Commands.Message;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
 using Telegram.Bot.Types;
@@ -8,12 +9,12 @@ namespace CardCollector.Commands.CallbackQuery
     public class Back : CallbackQueryCommand
     {
         protected override string CommandText => Command.back;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
         
         public override async Task Execute()
         {
-            await User.ClearChat();
+            EnterEmoji.RemoveFromQueue(User.Id);
+            EnterGemsExchange.RemoveFromQueue(User.Id);
+            EnterGemsPrice.RemoveFromQueue(User.Id);
             if (User.Session.TryGetPreviousMenu(out var menu))
                 await menu.BackToThis(User.Session);
             else await User.Session.EndSession();

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

@@ -10,7 +10,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class BuyAuthorPackMenu : CallbackQueryCommand
     {
         protected override string CommandText => Command.buy_author_pack_menu;
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
         
         public override async Task Execute()

+ 0 - 2
CardCollector/Commands/CallbackQuery/BuyCoins.cs

@@ -11,8 +11,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class BuyCoins : CallbackQueryCommand
     {
         protected override string CommandText => Command.buy_coins;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

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

@@ -10,16 +10,12 @@ namespace CardCollector.Commands.CallbackQuery
     public class BuyGems : CallbackQueryCommand
     {
         protected override string CommandText => Command.buy_gems;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
         
         public override async Task Execute()
         {
-            await User.ClearChat();
-            var messages = await MessageController.SendInvoice(User, Text.gems_title, Text.gems_description, 
+            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}, Keyboard.BuyGemsKeyboard);
-            User.Session.Messages.Add(messages.MessageId);
         }
 
         public BuyGems() { }

+ 0 - 1
CardCollector/Commands/CallbackQuery/BuyPack.cs

@@ -9,7 +9,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class BuyPack : CallbackQueryCommand
     {
         protected override string CommandText => Command.buy_pack;
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
         
         public override async Task Execute()

+ 4 - 8
CardCollector/Commands/CallbackQuery/BuyShopItem.cs

@@ -13,7 +13,7 @@ namespace CardCollector.Commands.CallbackQuery
     {
         protected override string CommandText => Command.buy_shop_item;
         protected override bool ClearMenu => true;
-        protected override bool AddToStack => false;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
@@ -40,7 +40,6 @@ namespace CardCollector.Commands.CallbackQuery
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.you_already_use_this_offer);
             else
             {
-                await User.ClearChat();
                 if (currency == "coins") User.Cash.Coins -= resultPriceCoins;
                 else if (currency == "gems") User.Cash.Gems -= resultPriceGems;
                 
@@ -50,9 +49,8 @@ namespace CardCollector.Commands.CallbackQuery
                 var userPack = await UserPacksDao.GetOne(User.Id, packId);
                 userPack.Count += module.SelectedPosition?.Count ?? module.Count;
                 if (module.SelectedPosition?.AdditionalPrize != "") await GivePrize(module.SelectedPosition?.AdditionalPrize);
-                var message = await MessageController.SendMessage(User, Messages.thanks_for_buying);
+                await MessageController.SendMessage(User, Messages.thanks_for_buying);
                 User.Session.ResetModule<ShopModule>();
-                User.Session.Messages.Add(message.MessageId);
             }
         }
 
@@ -79,10 +77,8 @@ namespace CardCollector.Commands.CallbackQuery
                     await UserStickerRelationDao.AddNew(User, sticker, 1);
                 else
                     User.Stickers[sticker.Md5Hash].Count ++;
-                var stickerMessage = await MessageController.SendSticker(User, sticker.Id);
-                var message = await MessageController.SendMessage(User, $"{Messages.congratulation}\n{sticker}");
-                User.Session.Messages.Add(stickerMessage.MessageId);
-                User.Session.Messages.Add(message.MessageId);
+                await MessageController.SendSticker(User, sticker.Id);
+                await MessageController.SendMessage(User, $"{Messages.congratulation}\n{sticker}");
             }
         }
 

+ 1 - 3
CardCollector/Commands/CallbackQuery/BuySticker.cs

@@ -11,8 +11,7 @@ namespace CardCollector.Commands.CallbackQuery
     public class BuySticker : CallbackQueryCommand
     {
         protected override string CommandText => Command.buy_sticker;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
@@ -34,7 +33,6 @@ namespace CardCollector.Commands.CallbackQuery
                 else
                     User.Stickers[auctionModule.SelectedSticker.Md5Hash].Count += auctionModule.Count;
                 User.Session.ResetModule<AuctionModule>();
-                await User.ClearChat();
             }
         }
 

+ 0 - 2
CardCollector/Commands/CallbackQuery/CollectIncome.cs

@@ -9,8 +9,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class CollectIncome : CallbackQueryCommand
     {
         protected override string CommandText => Command.collect_income;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 5 - 6
CardCollector/Commands/CallbackQuery/Combine.cs

@@ -10,15 +10,11 @@ namespace CardCollector.Commands.CallbackQuery
     public class Combine : CallbackQueryCommand
     {
         protected override string CommandText => Command.combine;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
             var combineModule = User.Session.GetModule<CombineModule>();
-            if (User.Session.State != UserState.CombineMenu)
-                combineModule.CombineList.Clear();
-            User.Session.State = UserState.CombineMenu;
             if (combineModule.SelectedSticker == null)
             {
                 var collectionModule = User.Session.GetModule<CollectionModule>();
@@ -51,6 +47,9 @@ namespace CardCollector.Commands.CallbackQuery
         }
 
         public Combine() { }
-        public Combine(UserEntity user, Update update) : base(user, update) { }
+        public Combine(UserEntity user, Update update) : base(user, update)
+        {
+            User.Session.State = UserState.CombineMenu;
+        }
     }
 }

+ 0 - 2
CardCollector/Commands/CallbackQuery/CombineMenu.cs

@@ -10,13 +10,11 @@ namespace CardCollector.Commands.CallbackQuery
     public class CombineMenu : CallbackQueryCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
 
         public override async Task Execute()
         {
             var combineModule = User.Session.GetModule<CombineModule>();
-            await User.ClearChat();
             await MessageController.EditMessage(User, combineModule.ToString(), Keyboard.GetCombineKeyboard(combineModule));
         }
 

+ 2 - 7
CardCollector/Commands/CallbackQuery/CombineStickers.cs

@@ -13,8 +13,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class CombineStickers : CallbackQueryCommand
     {
         protected override string CommandText => Command.combine_stickers;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
@@ -24,7 +22,6 @@ namespace CardCollector.Commands.CallbackQuery
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.not_enougth_coins);
             else
             {
-                await User.ClearChat();
                 User.Cash.Coins -= price;
                 foreach (var (item, count) in combineModule.CombineList)
                     User.Stickers[item.Md5Hash].Count -= count;
@@ -36,11 +33,9 @@ namespace CardCollector.Commands.CallbackQuery
                 var sticker = stickers[rnd.Next(stickers.Count)];
                 await UserStickerRelationDao.AddNew(User, sticker, 1);
                 var text = $"{Messages.combined_sticker}:\n" + sticker;
-                var stickerMessage = await MessageController.SendSticker(User, sticker.Id);
-                var message = await MessageController.SendMessage(User, text, Keyboard.BackToFilters(sticker.Title));
+                await MessageController.SendSticker(User, sticker.Id);
+                await MessageController.SendMessage(User, text, Keyboard.BackToFilters(sticker.Title));
                 User.Session.DeleteModule<CombineModule>();
-                User.Session.Messages.Add(stickerMessage.MessageId);
-                User.Session.Messages.Add(message.MessageId);
             }
         }
 

+ 3 - 3
CardCollector/Commands/CallbackQuery/ConfirmBuying.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class ConfirmBuying : CallbackQueryCommand
     {
         protected override string CommandText => Command.confirm_buying;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
@@ -21,7 +19,9 @@ namespace CardCollector.Commands.CallbackQuery
                 await MessageController.AnswerCallbackQuery(User, Update.CallbackQuery!.Id, Messages.not_enougth_gems);
             else
             {
-                var text = $"{Messages.confirm_buying}\n{auctionModule.Count}{Text.items} {Text.per} {price}{Text.gem}\n{Messages.are_you_sure}";
+                var text = $"{Messages.confirm_buying}" +
+                           $"\n{auctionModule.Count}{Text.items} {Text.per} {price}{Text.gem}" +
+                           $"\n{Messages.are_you_sure}";
                 await MessageController.EditMessage(User, text, Keyboard.GetConfirmationKeyboard(Command.buy_sticker));
             }
         }

+ 0 - 2
CardCollector/Commands/CallbackQuery/ConfirmExchange.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class ConfirmExchange : CallbackQueryCommand
     {
         protected override string CommandText => Command.confirm_exchange;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 1 - 2
CardCollector/Commands/CallbackQuery/ConfirmationSelling.cs

@@ -11,8 +11,7 @@ namespace CardCollector.Commands.CallbackQuery
     public class ConfirmationSelling : CallbackQueryCommand
     {
         protected override string CommandText => Command.confirm_selling;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {

+ 1 - 3
CardCollector/Commands/CallbackQuery/Count.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class Count : CallbackQueryCommand
     {
         protected override string CommandText => Command.count;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
@@ -48,7 +46,7 @@ namespace CardCollector.Commands.CallbackQuery
                     User.Session.GetModule<CombineModule>().Count = stickerCount;
                     break;
             }
-            if (changed) await MessageController.EditReplyMarkup(User, CallbackMessageId, Keyboard.GetStickerKeyboard(User.Session));
+            if (changed) await MessageController.EditReplyMarkup(User, Keyboard.GetStickerKeyboard(User.Session));
             else await MessageController.AnswerCallbackQuery(User, Update.CallbackQuery!.Id, Messages.cant_change_count);
         }
 

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

@@ -11,12 +11,9 @@ namespace CardCollector.Commands.CallbackQuery
     public class DailyTasks : CallbackQueryCommand
     {
         protected override string CommandText => Command.daily_tasks;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
-            await User.ClearChat();
             var text = Messages.your_daily_tasks;
             var userTasks = await DailyTaskDao.GetUserTasks(User.Id);
             foreach (var (key, task) in DailyTask.List)
@@ -25,8 +22,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, Keyboard.BackKeyboard);
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendMessage(User, text, Keyboard.BackKeyboard);
         }
 
         public DailyTasks() { }

+ 1 - 2
CardCollector/Commands/CallbackQuery/DeleteCombine.cs

@@ -11,11 +11,10 @@ namespace CardCollector.Commands.CallbackQuery
     public class DeleteCombine : CallbackQueryCommand
     {
         protected override string CommandText => Command.delete_combine;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
+            User.Session.UndoCurrentCommand();
             var sticker = await StickerDao.GetByHash(CallbackData.Split('=')[1]);
             var module = User.Session.GetModule<CombineModule>();
             module.CombineList.Remove(sticker);

+ 4 - 5
CardCollector/Commands/CallbackQuery/EndUploadStickers.cs

@@ -2,7 +2,6 @@
 using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
-using CardCollector.Session.Modules;
 using Telegram.Bot.Types;
 
 namespace CardCollector.Commands.CallbackQuery
@@ -10,16 +9,16 @@ namespace CardCollector.Commands.CallbackQuery
     public class EndUploadStickers : CallbackQueryCommand
     {
         protected override string CommandText => Command.end_sticker_upload;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
-            User.Session.State = UserState.UploadFile;
             await MessageController.EditMessage(User, Messages.upload_your_file, Keyboard.BackKeyboard);
         }
 
         public EndUploadStickers() { }
-        public EndUploadStickers(UserEntity user, Update update) : base(user, update) { }
+        public EndUploadStickers(UserEntity user, Update update) : base(user, update)
+        {
+            User.Session.State = UserState.UploadFile;
+        }
     }
 }

+ 1 - 4
CardCollector/Commands/CallbackQuery/MyPacks.cs

@@ -11,20 +11,17 @@ namespace CardCollector.Commands.CallbackQuery
     public class MyPacks : CallbackQueryCommand
     {
         protected override string CommandText => Command.my_packs;
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
 
         public override async Task Execute()
         {
-            await User.ClearChat();
             var random = await UserPacksDao.GetOne(User.Id, 1);
             var authorCount = (await UserPacksDao.GetUserPacks(User.Id)).Sum(item => item.PackId != 1 ? item.Count : 0);
-            var message = await MessageController.SendMessage(User, 
+            await MessageController.SendMessage(User, 
                 $"{Messages.your_packs}" +
                 $"\n{Messages.random_packs}: {random.Count}{Text.items}" +
                 $"\n{Messages.author_pack}: {authorCount}{Text.items}",
                 Keyboard.PackMenu);
-            User.Session.Messages.Add(message.MessageId);
         }
 
         public MyPacks() { }

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

@@ -11,7 +11,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class OpenAuthorPackMenu : CallbackQueryCommand
     {
         protected override string CommandText => Command.open_author_pack_menu;
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
 
         public override async Task Execute()

+ 2 - 7
CardCollector/Commands/CallbackQuery/OpenPack.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class OpenPack : CallbackQueryCommand
     {
         protected override string CommandText => Command.open_pack;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
@@ -21,7 +19,6 @@ namespace CardCollector.Commands.CallbackQuery
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.packs_count_zero, true);
             else
             {
-                await User.ClearChat();
                 var packInfo = await PacksDao.GetById(packId);
                 packInfo.OpenedCount++;
                 userPack.Count--;
@@ -33,10 +30,8 @@ namespace CardCollector.Commands.CallbackQuery
                     User.Stickers[sticker.Md5Hash].Count++;
                 else
                     await UserStickerRelationDao.AddNew(User, sticker, 1);
-                var stickerMessage = await MessageController.SendSticker(User, sticker.Id);
-                var message = await MessageController.SendMessage(User, $"{Messages.congratulation}\n{sticker}");
-                User.Session.Messages.Add(stickerMessage.MessageId);
-                User.Session.Messages.Add(message.MessageId);
+                await MessageController.SendSticker(User, sticker.Id);
+                await MessageController.SendMessage(User, $"{Messages.congratulation}\n{sticker}");
             }
         }
 

+ 0 - 2
CardCollector/Commands/CallbackQuery/PackInfo.cs

@@ -9,8 +9,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class PackInfo : CallbackQueryCommand
     {
         protected override string CommandText => Command.pack_info;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 2 - 6
CardCollector/Commands/CallbackQuery/PutForAuction.cs

@@ -12,22 +12,18 @@ namespace CardCollector.Commands.CallbackQuery
     public class PutForAuction : CallbackQueryCommand
     {
         protected override string CommandText => Command.sell_on_auction;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
             await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.comission_warning, true);
-            await User.ClearChat();
             var module = User.Session.GetModule<CollectionModule>();
             var priceList = (await AuctionController.GetPriceList(module.SelectedSticker.Id)).ToList();
             var lowerPrice = priceList.Count > 0 ? priceList.Min() : 0;
-            var message = await MessageController.SendMessage(User,
+            await MessageController.SendMessage(User,
                 $"{Messages.current_price} {module.SellPrice}{Text.gem}" +
                 $"\n{Messages.lower_price} {lowerPrice}{Text.gem}" +
-                $"\n{Messages.enter_your_gems_price} {Text.gem}:", Keyboard.AuctionPutCancelKeyboard);
+                $"\n{Messages.enter_your_gems_price} {Text.gem}:", Keyboard.BackKeyboard);
             EnterGemsPrice.AddToQueue(User.Id);
-            User.Session.Messages.Add(message.MessageId);
         }
 
         public PutForAuction() { }

+ 0 - 2
CardCollector/Commands/CallbackQuery/SelectEmoji.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class SelectEmoji : CallbackQueryCommand
     {
         protected override string CommandText => Command.emoji;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 1 - 6
CardCollector/Commands/CallbackQuery/SelectOffer.cs

@@ -11,19 +11,14 @@ namespace CardCollector.Commands.CallbackQuery
     public class SelectOffer : CallbackQueryCommand
     {
         protected override string CommandText => Command.select_offer;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
-            Logs.LogOut("here");
-            await User.ClearChat();
             var offerId = int.Parse(CallbackData.Split('=')[1]);
             var offerInfo = await ShopDao.GetById(offerId);
             var module = User.Session.GetModule<ShopModule>();
             module.SelectedPosition = offerInfo;
-            var message = await MessageController.SendSticker(User, offerInfo.ImageId, Keyboard.OfferKeyboard(module));
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendSticker(User, offerInfo.ImageId, Keyboard.OfferKeyboard(module));
         }
 
         public SelectOffer() { }

+ 0 - 2
CardCollector/Commands/CallbackQuery/SelectPrice.cs

@@ -9,8 +9,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class SelectPrice : CallbackQueryCommand
     {
         protected override string CommandText => Command.select_price;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 1 - 4
CardCollector/Commands/CallbackQuery/SelectShopPack.cs

@@ -11,20 +11,17 @@ namespace CardCollector.Commands.CallbackQuery
     public class SelectShopPack : CallbackQueryCommand
     {
         protected override string CommandText => Command.select_shop_pack;
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
 
         public override async  Task Execute()
         {
-            await User.ClearChat();
             var packId = int.Parse(CallbackData.Split('=')[1]);
             var packInfo = await PacksDao.GetById(packId);
             var module = User.Session.GetModule<ShopModule>();
             module.SelectedPack = packInfo;
             var stickers = await StickerDao.GetListWhere(item => packId == 1 || item.PackId == packId);
             var sticker = stickers[Utilities.rnd.Next(stickers.Count)];
-            var message = await MessageController.SendSticker(User, sticker.Id, Keyboard.OfferKeyboard(module));
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendSticker(User, sticker.Id, Keyboard.OfferKeyboard(module));
         }
 
         public SelectShopPack() { }

+ 0 - 2
CardCollector/Commands/CallbackQuery/SelectSort.cs

@@ -9,8 +9,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class SelectSort : CallbackQueryCommand
     {
         protected override string CommandText => Command.sort;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/CallbackQuery/SelectTier.cs

@@ -9,8 +9,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class SelectTier : CallbackQueryCommand
     {
         protected override string CommandText => Command.tier;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/CallbackQuery/SetFilter.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class SetFilter : CallbackQueryCommand
     {
         protected override string CommandText => Command.set;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/CallbackQuery/ShowInfo.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class ShowInfo : CallbackQueryCommand
     {
         protected override string CommandText => Command.show_offer_info;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

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

@@ -11,7 +11,6 @@ namespace CardCollector.Commands.CallbackQuery
     public class SpecialOffers : CallbackQueryCommand
     {
         protected override string CommandText => Command.special_offers;
-        protected override bool ClearMenu => false;
         protected override bool AddToStack => true;
 
         public override async Task Execute()

+ 0 - 3
CardCollector/Commands/CallbackQueryCommand.cs

@@ -22,8 +22,6 @@ namespace CardCollector.Commands
     {
         /* Данные, поступившие после нажатия на кнокпку */
         protected string CallbackData;
-        /* Id сообщения, под которым нажали на кнопку */
-        protected int CallbackMessageId;
         /* Id запроса */
         protected string CallbackQueryId;
 
@@ -89,7 +87,6 @@ namespace CardCollector.Commands
         protected CallbackQueryCommand(UserEntity user, Update update) : base(user, update)
         {
             CallbackData = update.CallbackQuery!.Data;
-            CallbackMessageId = user.Session.Messages.LastOrDefault();
             CallbackQueryId = update.CallbackQuery!.Id;
         }
     }

+ 0 - 2
CardCollector/Commands/ChosenInlineResult/GetUnlimitedStickerAndExecuteCommand.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.ChosenInlineResult
     public class GetUnlimitedStickerAndExecuteCommand : ChosenInlineResultCommand
     {
         protected override string CommandText => Command.unlimited_stickers;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 2 - 7
CardCollector/Commands/ChosenInlineResult/SelectStickerInline.cs

@@ -11,12 +11,9 @@ namespace CardCollector.Commands.ChosenInlineResult
     public class SelectStickerInline : ChosenInlineResultCommand
     {
         protected override string CommandText => Command.select_sticker;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
-            await User.ClearChat();
             var hash = InlineResult.Split('=')[1];
             var sticker = await StickerDao.GetByHash(hash);
             var stickerCount = User.Session.State switch
@@ -42,11 +39,9 @@ namespace CardCollector.Commands.ChosenInlineResult
                     User.Session.GetModule<DefaultModule>().SelectedSticker = sticker;
                     break;
             }
-            var stickerMessage = await MessageController.SendSticker(User, sticker.Id);
-            var infoMessage = await MessageController.SendMessage(User, sticker.ToString(stickerCount), Keyboard.GetStickerKeyboard(User.Session));
+            await MessageController.SendSticker(User, sticker.Id);
+            await MessageController.SendMessage(User, sticker.ToString(stickerCount), Keyboard.GetStickerKeyboard(User.Session));
             if (User.Session.State == UserState.AuctionMenu) User.Session.State = UserState.ProductMenu;
-            User.Session.Messages.Add(stickerMessage.MessageId);
-            User.Session.Messages.Add(infoMessage.MessageId);
         }
 
         protected internal override bool IsMatches(UserEntity user, Update update)

+ 1 - 7
CardCollector/Commands/ChosenInlineResult/SelectTrader.cs

@@ -11,23 +11,17 @@ namespace CardCollector.Commands.ChosenInlineResult
     public class SelectTrader : ChosenInlineResultCommand
     {
         protected override string CommandText => Command.buy_sticker;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
-            await User.ClearChat();
             var productId = int.Parse(InlineResult.Split('=')[1]);
             var product = await AuctionDao.GetProduct(productId);
             var module = User.Session.GetModule<AuctionModule>();
             if (module.SelectedSticker is not {} sticker) return;
             module.SelectedPosition = product;
             var discount = 1.0 - await User.AuctionDiscount() / 100.0;
-            var messageSticker = await MessageController.SendSticker(User, sticker.Id);
-            var message = await MessageController.SendMessage(User, sticker.ToString(module.MaxCount), 
+            await MessageController.SendMessage(User, sticker.ToString(module.MaxCount), 
                 Keyboard.GetStickerKeyboard(User.Session, discount));
-            User.Session.Messages.Add(messageSticker.MessageId);
-            User.Session.Messages.Add(message.MessageId);
         }
 
         public SelectTrader() { }

+ 1 - 4
CardCollector/Commands/ChosenInlineResult/SendPrivateSticker.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.ChosenInlineResult
     public class SendPrivateSticker : ChosenInlineResultCommand
     {
         protected override string CommandText => Command.send_private_sticker;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
@@ -19,8 +17,7 @@ namespace CardCollector.Commands.ChosenInlineResult
             if (await dailyTask.Execute(User.Id))
             {
                 await dailyTask.GiveReward(User.Id);
-                var message = await MessageController.SendMessage(User, Messages.pack_prize);
-                User.Session.Messages.Add(message.MessageId);
+                await MessageController.SendMessage(User, Messages.pack_prize);
             }
         }
 

+ 0 - 2
CardCollector/Commands/ChosenInlineResult/SendSticker.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.ChosenInlineResult
     {
         /* Ключевое слово для данной команды send_sticker */
         protected override string CommandText => Command.send_sticker;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override Task Execute()
         {

+ 0 - 2
CardCollector/Commands/ChosenInlineResult/StickerInfo.cs

@@ -10,8 +10,6 @@ namespace CardCollector.Commands.ChosenInlineResult
     public class StickerInfo : ChosenInlineResultCommand
     {
         protected override string CommandText => Command.sticker_info;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
         
         public override async Task Execute()
         {

+ 1 - 4
CardCollector/Commands/CommandNotFound.cs

@@ -9,15 +9,12 @@ namespace CardCollector.Commands
     public class CommandNotFound : UpdateModel
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         private readonly string _command;
 
         public override async Task Execute()
         {
-            var message = await MessageController.SendMessage(User, "Команда не найдена " + _command);
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendMessage(User, "Команда не найдена " + _command);
         }
 
         protected internal override bool IsMatches(UserEntity user, Update update) => true;

+ 0 - 2
CardCollector/Commands/IgnoreUpdate.cs

@@ -8,8 +8,6 @@ namespace CardCollector.Commands
     public class IgnoreUpdate : UpdateModel
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override Task PrepareAndExecute() => Task.CompletedTask;
         public override Task Execute() => Task.CompletedTask;

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowAuctionStickers.cs

@@ -11,8 +11,6 @@ namespace CardCollector.Commands.InlineQuery
     public class ShowAuctionStickers : InlineQueryCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowCollectionStickers.cs

@@ -11,8 +11,6 @@ namespace CardCollector.Commands.InlineQuery
     public class ShowCollectionStickers : InlineQueryCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowCombineStickers.cs

@@ -11,8 +11,6 @@ namespace CardCollector.Commands.InlineQuery
     public class ShowCombineStickers : InlineQueryCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowStickersInBotChat.cs

@@ -13,8 +13,6 @@ namespace CardCollector.Commands.InlineQuery
         /* Команда - пустая строка, поскольку пользователь может вводить любые слова
          после @имя_бота, введенная фраза будет использоваться для фильтрации стикеров */
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowStickersInGroup.cs

@@ -13,8 +13,6 @@ namespace CardCollector.Commands.InlineQuery
         /* Команда - пустая строка, поскольку пользователь может вводить любые слова
          после @имя_бота, введенная фраза будет использоваться для фильтрации стикеров */
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowStickersInPrivate.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.InlineQuery
         /* Команда - пустая строка, поскольку пользователь может вводить любые слова
          после @имя_бота, введенная фраза будет использоваться для фильтрации стикеров */
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowStickersInShopPack.cs

@@ -14,8 +14,6 @@ namespace CardCollector.Commands.InlineQuery
     public class ShowStickersInShopPack : InlineQueryCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
         
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/InlineQuery/ShowTradersInBotChat.cs

@@ -11,8 +11,6 @@ namespace CardCollector.Commands.InlineQuery
     public class ShowTradersInBotChat : InlineQueryCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 7 - 5
CardCollector/Commands/Message/Auction.cs

@@ -12,19 +12,21 @@ namespace CardCollector.Commands.Message
         protected override string CommandText => Text.auction;
         protected override bool ClearMenu => true;
         protected override bool AddToStack => true;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
-            /* Очищаем чат с пользователем */
-            await User.ClearChat();
-            /* Переводим состояние пользователя в меню аукциона */
-            User.Session.State = UserState.AuctionMenu;
             User.Session.InitNewModule<AuctionModule>();
             /* Отображаем сообщение с фильтрами */
             await new ShowFiltersMenu(User, Update).Execute();
         }
         
         public Auction() { }
-        public Auction(UserEntity user, Update update) : base(user, update) { }
+
+        public Auction(UserEntity user, Update update) : base(user, update)
+        {
+            /* Переводим состояние пользователя в меню аукциона */
+            User.Session.State = UserState.AuctionMenu;
+        }
     }
 }

+ 6 - 5
CardCollector/Commands/Message/Collection.cs

@@ -12,19 +12,20 @@ namespace CardCollector.Commands.Message
         protected override string CommandText => Text.collection;
         protected override bool ClearMenu => true;
         protected override bool AddToStack => true;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
-            /* Очищаем чат с пользователем */
-            await User.ClearChat();
-            /* Переводим состояние пользователя в меню коллекции */
-            User.Session.State = UserState.CollectionMenu;
             User.Session.InitNewModule<CollectionModule>();
             /* Отображаем сообщение с фильтрами */
             await new ShowFiltersMenu(User, Update).Execute();
         }
         
         public Collection() { }
-        public Collection(UserEntity user, Update update) : base(user, update) { }
+        public Collection(UserEntity user, Update update) : base(user, update) 
+        {
+            /* Переводим состояние пользователя в меню коллекции */
+            User.Session.State = UserState.CollectionMenu;
+         }
     }
 }

+ 1 - 4
CardCollector/Commands/Message/CreateToken.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.Message
     public class CreateToken : MessageCommand
     {
         protected override string CommandText => "create_token";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         private const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890-_";
         private const string site = "http://127.0.0.1:8080/";
@@ -23,9 +21,8 @@ namespace CardCollector.Commands.Message
             var token = GenerateNewToken();
             await SessionTokenDao.AddNew(User.Id, token);
             var loginLink = $"{site}login?token={token}";
-            var message = await MessageController.SendTextWithHtml(User,
+            await MessageController.SendTextWithHtml(User,
                 $"<a href=\"{loginLink}\">{Messages.your_login_link}</a>", Keyboard.LoginKeyboard(loginLink));
-            User.Session.Messages.Add(message.MessageId);
         }
 
         private string GenerateNewToken()

+ 5 - 5
CardCollector/Commands/Message/DownloadStickerPack.cs

@@ -15,10 +15,7 @@ namespace CardCollector.Commands.Message
 
         public override async Task Execute()
         {
-            await User.ClearChat();
-            User.Session.State = UserState.UploadSticker;
-            var result = await MessageController.SendMessage(User, Messages.upload_your_stickers, Keyboard.BackKeyboard);
-            User.Session.Messages.Add(result.MessageId);
+            await MessageController.SendMessage(User, Messages.upload_your_stickers, Keyboard.BackKeyboard);
         }
 
         protected internal override bool IsMatches(UserEntity user, Update update)
@@ -27,6 +24,9 @@ namespace CardCollector.Commands.Message
         }
 
         public DownloadStickerPack() { }
-        public DownloadStickerPack(UserEntity user, Update update) : base(user, update) { }
+        public DownloadStickerPack(UserEntity user, Update update) : base(user, update) 
+        {
+            User.Session.State = UserState.UploadSticker;
+        }
     }
 }

+ 0 - 2
CardCollector/Commands/Message/EnterEmoji.cs

@@ -13,8 +13,6 @@ namespace CardCollector.Commands.Message
     public class EnterEmoji : MessageCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         private const string oneEmojiPattern =
             "^\\u00a9$|^\\u00ae$|^[\\u2000-\\u3300]$|^\\ud83c[\\ud000-\\udfff]$|^\\ud83d[\\ud000-\\udfff]$|^\\ud83e[\\ud000-\\udfff]$";

+ 0 - 2
CardCollector/Commands/Message/EnterGemsExchange.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.Message
     public class EnterGemsExchange : MessageCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         private static readonly List<long> Queue = new ();
         public override async Task Execute()

+ 0 - 2
CardCollector/Commands/Message/EnterGemsPrice.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.Message
     public class EnterGemsPrice : MessageCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
         
         private static readonly List<long> Queue = new ();
         public override async Task Execute()

+ 1 - 4
CardCollector/Commands/Message/Menu.cs

@@ -9,14 +9,11 @@ namespace CardCollector.Commands.Message
     public class Menu : MessageCommand
     {
         protected override string CommandText => Text.menu;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
             /* Отправляем пользователю сообщение со стандартной клавиатурой */
-            var message = await MessageController.SendMessage(User, Messages.menu_message, Keyboard.Menu);
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendMessage(User, Messages.menu_message, Keyboard.Menu);
         }
 
         public Menu() { }

+ 2 - 4
CardCollector/Commands/Message/Profile.cs

@@ -13,14 +13,14 @@ namespace CardCollector.Commands.Message
         protected override string CommandText => Text.profile;
         protected override bool ClearMenu => true;
         protected override bool AddToStack => true;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
-            await User.ClearChat();
             /* Подсчитываем прибыль */
             var income = await User.Cash.CalculateIncome(User.Stickers);
             /* Отправляем сообщение */
-            var message = await MessageController.SendMessage(User, 
+            await MessageController.SendMessage(User, 
                 /* Имя пользователя */
                 $"{User.Username}\n" +
                 /* Количество монет */
@@ -29,8 +29,6 @@ namespace CardCollector.Commands.Message
                 $"{Messages.gems}: {User.Cash.Gems}{Text.gem}",
                 /* Клавиатура профиля */
                 Keyboard.GetProfileKeyboard(income, User.PrivilegeLevel));
-            /* Записываем id нового сообщения */
-            User.Session.Messages.Add(message.MessageId);
         }
         
         public Profile() { }

+ 8 - 7
CardCollector/Commands/Message/Shop.cs

@@ -14,21 +14,22 @@ namespace CardCollector.Commands.Message
         protected override string CommandText => Text.shop;
         protected override bool ClearMenu => true;
         protected override bool AddToStack => true;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
-            /* Очищаем чат с пользователем */
-            await User.ClearChat();
-            /* Переводим состояние пользователя в меню магазина */
-            User.Session.State = UserState.ShopMenu;
             User.Session.InitNewModule<ShopModule>();
             var haveSpecialOffers = await (await ShopDao.GetSpecialPositions())
                 .AnyAsync(async offer => offer.IsInfinite || !await SpecialOfferUsersDao.NowUsed(User.Id, offer.Id));
-            var message = await MessageController.SendMessage(User, Messages.shop_message, Keyboard.ShopKeyboard(haveSpecialOffers));
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendMessage(User, Messages.shop_message, Keyboard.ShopKeyboard(haveSpecialOffers));
         }
         
         public Shop() { }
-        public Shop(UserEntity user, Update update) : base(user, update) { }
+        public Shop(UserEntity user, Update update) : base(user, update) 
+        {
+            /* Переводим состояние пользователя в меню магазина */
+            User.Session.State = UserState.ShopMenu;
+            
+        }
     }
 }

+ 1 - 5
CardCollector/Commands/Message/ShowFiltersMenu.cs

@@ -11,17 +11,13 @@ namespace CardCollector.Commands.Message
     public class ShowFiltersMenu : MessageCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
             /* Формируем сообщение с имеющимися фильтрами у пользователя */
             var text = User.Session.GetModule<FiltersModule>().ToString(User.Session.State);
             /* Отправляем сообщение */
-            var message = await MessageController.SendMessage(User, text, Keyboard.GetSortingMenu(User.Session.State));
-            /* Добавляем это сообщение в список для удаления */
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendMessage(User, text, Keyboard.GetSortingMenu(User.Session.State));
         }
         
         public ShowFiltersMenu(UserEntity user, Update update) : base(user, update) { }

+ 0 - 2
CardCollector/Commands/Message/ShowSample.cs

@@ -13,8 +13,6 @@ namespace CardCollector.Commands.Message
     public class ShowSample : MessageCommand
     {
         protected override string CommandText => Text.show_sample;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/Message/Start.cs

@@ -11,8 +11,6 @@ namespace CardCollector.Commands.Message
     {
         /* */
         protected override string CommandText => Text.start;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 2 - 5
CardCollector/Commands/Message/StopBot.cs

@@ -9,14 +9,11 @@ namespace CardCollector.Commands.Message
     public class StopBot : MessageCommand
     {
         protected override string CommandText => Text.stop_bot;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
-            var message = await MessageController.SendMessage(User, "Stopping bot");
-            User.Session.Messages.Add(message.MessageId);
-            Bot.StopProgram();
+            await MessageController.SendMessage(User, "Stopping bot");
+            await Bot.StopProgram();
         }
 
         protected internal override bool IsMatches(UserEntity user, Update update)

+ 4 - 4
CardCollector/Commands/Message/UploadFile.cs

@@ -18,12 +18,9 @@ namespace CardCollector.Commands.Message
     public class UploadFile : MessageCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
-            User.Session.State = UserState.Default;
             var module = User.Session.GetModule<UploadedStickersModule>();
             try
             {
@@ -94,6 +91,9 @@ namespace CardCollector.Commands.Message
         }
 
         public UploadFile() { }
-        public UploadFile(UserEntity user, Update update) : base(user, update) { }
+        public UploadFile(UserEntity user, Update update) : base(user, update)
+        {
+            User.Session.State = UserState.Default;
+        }
     }
 }

+ 0 - 2
CardCollector/Commands/Message/UploadSticker.cs

@@ -11,8 +11,6 @@ namespace CardCollector.Commands.Message
     public class UploadSticker : MessageCommand
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 0 - 2
CardCollector/Commands/MyChatMember/MyChatMemberCommand.cs

@@ -12,8 +12,6 @@ namespace CardCollector.Commands.MyChatMember
     public class MyChatMemberCommand : UpdateModel
     {
         protected override string CommandText => "";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         private readonly ChatMemberStatus _status;
         public override Task Execute()

+ 1 - 5
CardCollector/Commands/PreCheckoutQuery/BuyGems.cs

@@ -10,16 +10,12 @@ namespace CardCollector.Commands.PreCheckoutQuery
     public class BuyGems : PreCheckoutQueryCommand
     {
         protected override string CommandText => Command.buy_gems_item;
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {
             await Bot.Client.AnswerPreCheckoutQueryAsync(PreCheckoutQueryId);
             User.Cash.Gems += 50 * Amount / 100;
-            await User.ClearChat();
-            var message = await MessageController.SendMessage(User, Messages.thanks_for_buying);
-            User.Session.Messages.Add(message.MessageId);
+            await MessageController.SendMessage(User, Messages.thanks_for_buying);
         }
 
         public BuyGems() { }

+ 0 - 2
CardCollector/Commands/PreCheckoutQuery/Test.cs

@@ -8,8 +8,6 @@ namespace CardCollector.Commands.PreCheckoutQuery
     public class Test : PreCheckoutQueryCommand
     {
         protected override string CommandText => "test";
-        protected override bool ClearMenu => false;
-        protected override bool AddToStack => false;
 
         public override async Task Execute()
         {

+ 4 - 2
CardCollector/Commands/UpdateModel.cs

@@ -14,8 +14,9 @@ namespace CardCollector.Commands
     public abstract class UpdateModel
     {
         protected abstract string CommandText { get; }
-        protected abstract bool ClearMenu { get; }
-        protected abstract bool AddToStack { get; }
+        protected virtual bool ClearMenu => false;
+        protected virtual bool AddToStack => false;
+        protected virtual bool ClearStickers => false;
         protected UserEntity User;
         protected Update Update;
 
@@ -26,6 +27,7 @@ namespace CardCollector.Commands
             User.Session.SetCurrentCommand(GetType());
             if (ClearMenu) User.Session.ClearMenuStack();
             if (AddToStack) User.Session.AddMenuToStack(this);
+            if (ClearStickers) await User.Session.ClearStickers();
             await Execute();
         }
 

+ 57 - 17
CardCollector/Controllers/MessageController.cs

@@ -91,10 +91,13 @@ namespace CardCollector.Controllers
             {
                 if (!user.IsBlocked)
                 {
-                    if (user.Session.Messages.Count > 0 && keyboard is InlineKeyboardMarkup k)
-                        return await EditMessage(user, message, k, user.Session.Messages.Last());
-                    return await Bot.Client.SendTextMessageAsync(user.ChatId, message, replyMarkup: keyboard,
+                    if (user.Session.Messages.Count > 0 && (keyboard is null || keyboard is InlineKeyboardMarkup))
+                        return await EditMessage(user, message, (InlineKeyboardMarkup)keyboard, 
+                            user.Session.Messages.Last());
+                    var result = await Bot.Client.SendTextMessageAsync(user.ChatId, message, replyMarkup: keyboard,
                         disableNotification: true);
+                    user.Session?.Messages.Add(result.MessageId);
+                    return result;
                 }
             }
             catch (Exception e)
@@ -113,7 +116,15 @@ namespace CardCollector.Controllers
             try
             {
                 if (!user.IsBlocked)
-                    return await Bot.Client.SendTextMessageAsync(user.ChatId, message, ParseMode.Html, replyMarkup: keyboard, disableNotification: true);
+                {
+                    if (user.Session.Messages.Count > 0 && (keyboard is null || keyboard is InlineKeyboardMarkup))
+                        return await EditMessage(user, message, (InlineKeyboardMarkup)keyboard, 
+                            user.Session.Messages.Last(), ParseMode.Html);
+                    var result = await Bot.Client.SendTextMessageAsync(user.ChatId, message, ParseMode.Html,
+                        replyMarkup: keyboard, disableNotification: true);
+                    user.Session?.Messages.Add(result.MessageId);
+                    return result;
+                }
             }
             catch (Exception e)
             {
@@ -130,7 +141,12 @@ namespace CardCollector.Controllers
             try
             {
                 if (!user.IsBlocked)
-                    return await Bot.Client.SendStickerAsync(user.ChatId, fileId, true, replyMarkup: keyboard);
+                {
+                    await user.ClearChat();
+                    var result = await Bot.Client.SendStickerAsync(user.ChatId, fileId, true, replyMarkup: keyboard);
+                    user.Session.StickerMessages.Add(result.MessageId);
+                    return result;
+                }
             }
             catch (Exception e)
             {
@@ -144,22 +160,35 @@ namespace CardCollector.Controllers
          messageId - id сообщения
          message - текст сообщения
          keyboard - клавиатура, которую надо добавить к сообщению */
-        public static async Task<Message> EditMessage(UserEntity user, string message, InlineKeyboardMarkup keyboard = null, int messageId = -1)
+        public static async Task<Message> EditMessage(UserEntity user, string message,
+            InlineKeyboardMarkup keyboard = null, int messageId = -1, ParseMode? parseMode = null)
         {
             try
             {
                 if (!user.IsBlocked)
                 {
                     var msgId = messageId != -1 ? messageId : user.Session.Messages.Last();
-                    return await Bot.Client.EditMessageTextAsync(user.ChatId, msgId, message, replyMarkup: keyboard);
+                    return await Bot.Client.EditMessageTextAsync(user.ChatId, msgId, message, replyMarkup: keyboard,
+                        parseMode: parseMode);
                 }
             }
             catch (Exception)
             {
                 await user.ClearChat();
-                var msg = await SendMessage(user, message, keyboard);
-                user.Session.Messages.Add(msg.MessageId);
-                return msg;
+                try
+                {
+                    if (!user.IsBlocked)
+                    {
+                        var msg = await Bot.Client.SendTextMessageAsync(user.ChatId, message, parseMode, 
+                            replyMarkup: keyboard, disableNotification: true);
+                        user.Session.Messages.Add(msg.MessageId);
+                        return msg;
+                    }
+                }
+                catch (Exception e1)
+                {
+                    LogOut("Cant edit message: " + e1.Message);
+                }
             }
             return new Message();
         }
@@ -168,12 +197,15 @@ namespace CardCollector.Controllers
          user - пользователь, которому необходимо отредактировать сообщение
          messageId - Id сообщения
          keyboard - новая клавиатура, которую надо добавить к сообщению */
-        public static async Task<Message> EditReplyMarkup(UserEntity user, int messageId, InlineKeyboardMarkup keyboard)
+        public static async Task<Message> EditReplyMarkup(UserEntity user, InlineKeyboardMarkup keyboard, int messageId = -1)
         {
             try
             {
                 if (!user.IsBlocked)
-                    return await Bot.Client.EditMessageReplyMarkupAsync(user.ChatId, messageId, keyboard);
+                {
+                    var msgId = messageId != -1 ? messageId : user.Session.Messages.Last();
+                    return await Bot.Client.EditMessageReplyMarkupAsync(user.ChatId, msgId, keyboard);
+                }
             }
             catch (Exception e)
             {
@@ -218,7 +250,8 @@ namespace CardCollector.Controllers
          inputOnlineFile - фото, которое необходимо отправить
          message - текст сообщения
          keyboard - клавиатура, которую надо добавить к сообщению */
-        public static async Task<Message> SendImage(UserEntity user, string fileId, string message = null, InlineKeyboardMarkup keyboard = null)
+        public static async Task<Message> SendImage(UserEntity user, string fileId, string message = null, 
+            InlineKeyboardMarkup keyboard = null)
         {
             try
             {
@@ -235,9 +268,11 @@ namespace CardCollector.Controllers
         /* Метод для ответа на запрос @имя_бота
          queryId - Id запроса
          results - массив объектов InlineQueryResult */
-        public static async Task AnswerInlineQuery(string queryId, IEnumerable<InlineQueryResult> results, string offset = null)
+        public static async Task AnswerInlineQuery(string queryId, IEnumerable<InlineQueryResult> results, 
+            string offset = null)
         {
-            await Bot.Client.AnswerInlineQueryAsync(queryId, results, isPersonal: true, nextOffset: offset, cacheTime: Constants.INLINE_RESULTS_CACHE_TIME);
+            await Bot.Client.AnswerInlineQueryAsync(queryId, results, isPersonal: true, nextOffset: offset, 
+                cacheTime: Constants.INLINE_RESULTS_CACHE_TIME);
         }
 
         public static async Task<Message> SendInvoice(UserEntity user, string title, string description, 
@@ -247,9 +282,14 @@ namespace CardCollector.Controllers
             try
             {
                 if (!user.IsBlocked)
-                    return await Bot.Client.SendInvoiceAsync(user.ChatId, title, description, payload, 
-                        AppSettings.PAYMENT_PROVIDER, currency.ToString(), prices, maxTip, tips, 
+                {
+                    await user.ClearChat();
+                    var result = await Bot.Client.SendInvoiceAsync(user.ChatId, title, description, payload,
+                        AppSettings.PAYMENT_PROVIDER, currency.ToString(), prices, maxTip, tips,
                         replyMarkup: keyboard, disableNotification: true);
+                    user.Session.Messages.Add(result.MessageId);
+                    return result;
+                }
             }
             catch (Exception e)
             {

+ 0 - 1
CardCollector/DailyTasks/DailyTask.cs

@@ -3,7 +3,6 @@ using System.Threading.Tasks;
 using System.Timers;
 using CardCollector.DailyTasks.CustomTasks;
 using CardCollector.DataBase.EntityDao;
-using CardCollector.Resources;
 
 namespace CardCollector.DailyTasks
 {

+ 0 - 2
CardCollector/DataBase/Entity/UserStickerRelationEntity.cs

@@ -1,8 +1,6 @@
 using System;
 using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
-using System.Threading.Tasks;
-using CardCollector.DataBase.EntityDao;
 
 namespace CardCollector.DataBase.Entity
 {

+ 1 - 1
CardCollector/Session/Modules/CollectionModule.cs

@@ -11,7 +11,7 @@ namespace CardCollector.Session.Modules
         public void Reset()
         {
             SelectedSticker = null;
-            Count = 0;
+            Count = 1;
             SellPrice = 0;
         }
     }

+ 12 - 1
CardCollector/Session/Session.cs

@@ -21,6 +21,7 @@ namespace CardCollector.Session
         /* Подключаемые модули */
         private readonly Dictionary<Type, Module> Modules = new();
         /* Сообщения в чате пользователя */
+        public readonly List<int> StickerMessages = new();
         public readonly List<int> Messages = new();
         /* Последовательность вызова списка меню */
         private readonly Stack<MenuInformation> MenuStack = new();
@@ -68,14 +69,23 @@ namespace CardCollector.Session
             return (int) (DateTime.Now - _lastAccess).TotalMinutes;
         }
 
-
         public async Task ClearMessages()
         {
             foreach (var messageId in Messages.ToList())
                 await MessageController.DeleteMessage(user, messageId, false);
+            foreach (var messageId in StickerMessages.ToList())
+                await MessageController.DeleteMessage(user, messageId, false);
+            StickerMessages.Clear();
             Messages.Clear();
         }
 
+        public async Task ClearStickers()
+        {
+            foreach (var messageId in StickerMessages.ToList())
+                await MessageController.DeleteMessage(user, messageId, false);
+            StickerMessages.Clear();
+        }
+
         public async Task EndSession()
         {
             await ClearMessages();
@@ -113,6 +123,7 @@ namespace CardCollector.Session
         public void ClearMenuStack()
         {
             MenuStack.Clear();
+            foreach (var module in Modules.Values) module.Reset();
         }
     }
 

+ 1 - 2
CardCollector/StickerEffects/EffectFunctions.cs

@@ -1,5 +1,4 @@
-using System.Linq;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
 using System.Timers;
 using CardCollector.Controllers;
 using CardCollector.DataBase.EntityDao;