Browse Source

Selecting combine stickers

Tigran 4 years ago
parent
commit
e69b293b61

+ 3 - 3
CardCollector.sln.DotSettings.user

@@ -1,12 +1,12 @@
 <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:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FCommand/@EntryIndexedValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FCommand/@EntryIndexedValue">True</s:Boolean>
 	
 	
 	
 	
-	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FMessages/@EntryIndexedValue">True</s:Boolean>
+	<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">True</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FText/@EntryIndexedValue">False</s:Boolean>
 	
 	<s:Boolean x:Key="/Default/ResxEditorPersonal/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>

+ 23 - 0
CardCollector/Commands/CallbackQuery/BackToCombine.cs

@@ -0,0 +1,23 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    public class BackToCombine : CallbackQuery
+    {
+        protected override string CommandText => Command.back_to_combine;
+        public override async Task Execute()
+        {
+            await User.ClearChat();
+            var message = await MessageController.SendMessage(User, User.Session.GetCombineMessage(), 
+                Keyboard.GetCombineKeyboard(User.Session));
+            User.Session.Messages.Add(message.MessageId);
+        }
+
+        public BackToCombine() { }
+        public BackToCombine(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -15,6 +15,7 @@ namespace CardCollector.Commands.CallbackQuery
             /* Удаляем пользователя из очереди */
             EnterEmojiMessage.RemoveFromQueue(User.Id);
             User.Session.SelectedSticker = null;
+            User.Session.CombineList.Clear();
             /* Очищаем чат, если был передан параметр очистки */
             var clearChat = CallbackData.Contains(Command.clear_chat);
             if (clearChat) await User.ClearChat();

+ 13 - 0
CardCollector/Commands/CallbackQuery/CallbackQuery.cs

@@ -25,6 +25,9 @@ namespace CardCollector.Commands.CallbackQuery
         /* Id сообщения, под которым нажали на кнопку */
         protected int CallbackMessageId;
         
+        /* Id запроса */
+        protected string CallbackQueryId;
+        
         /* Список команд, распознаваемых ботом */
         private static readonly List<CallbackQuery> List = new()
         {
@@ -52,6 +55,14 @@ namespace CardCollector.Commands.CallbackQuery
             new BuyStickerQuery(),
             /* Команда возврата к стикеру */
             new BackToStickerQuery(),
+            /* Команда возврата к комбинированию */
+            new BackToCombine(),
+            /* Команда добавления к комбинироавнию */
+            new CombineCallback(),
+            /* Команда удаления из комбинации */
+            new DeleteCombine(),
+            /* Команда удаления из комбинации */
+            new CombineStickers(),
             
             /* Отмена в момент выбора "значения фильтра", не в самом меню */
             new BackToFiltersMenu(),
@@ -87,7 +98,9 @@ namespace CardCollector.Commands.CallbackQuery
         {
             CallbackData = update.CallbackQuery!.Data;
             CallbackMessageId = update.CallbackQuery!.Message!.MessageId;
+            CallbackQueryId = update.CallbackQuery!.Id;
         }
+
         protected CallbackQuery() { }
     }
 }

+ 2 - 4
CardCollector/Commands/CallbackQuery/CollectIncomeQuery.cs

@@ -2,7 +2,6 @@
 using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
-using Telegram.Bot;
 using Telegram.Bot.Types;
 
 namespace CardCollector.Commands.CallbackQuery
@@ -12,19 +11,18 @@ namespace CardCollector.Commands.CallbackQuery
         protected override string CommandText => Command.collect_income;
         public override async Task Execute()
         {
-            await MessageController.DeleteMessage(User, Update.CallbackQuery!.Message!.MessageId);
             await User.Session.PayOut();
-            await Bot.Client.AnswerCallbackQueryAsync(Update.CallbackQuery.Id, 
+            await MessageController.AnswerCallbackQuery(User, CallbackQueryId, 
                 $"{Messages.you_collected}: " +
                 $"{User.Session.IncomeCoins}{Text.coin} " +
                 $"{User.Session.IncomeGems}{Text.gem}" +
                 $"\n\n{Messages.your_cash}: " +
                 $"{User.Cash.Coins}{Text.coin} " +
                 $"{User.Cash.Gems}{Text.gem}", true);
+            await MessageController.DeleteMessage(User, Update.CallbackQuery!.Message!.MessageId);
         }
 
         public CollectIncomeQuery() { }
-
         public CollectIncomeQuery(UserEntity user, Update update) : base(user, update) { }
     }
 }

+ 20 - 3
CardCollector/Commands/CallbackQuery/CombineCallback.cs

@@ -1,4 +1,6 @@
-using System.Threading.Tasks;
+using System.Linq;
+using System.Threading.Tasks;
+using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
 using Telegram.Bot.Types;
@@ -10,8 +12,23 @@ namespace CardCollector.Commands.CallbackQuery
         protected override string CommandText => Command.combine;
         public override async Task Execute()
         {
-            User.Session.CombineList.Add(User.Session.SelectedSticker);
-            
+            var combineCount = User.Session.GetCombineCount();
+            if (combineCount == Constants.COMBINE_COUNT)
+                await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.cant_combine, true);
+            else
+            {
+                if (combineCount + User.Session.SelectedSticker.Count > Constants.COMBINE_COUNT)
+                {
+                    User.Session.SelectedSticker.Count = Constants.COMBINE_COUNT - combineCount;
+                    await MessageController.AnswerCallbackQuery(User, CallbackQueryId, $"{Messages.combine_added_only} " +
+                        $"{User.Session.SelectedSticker.Count}{Text.items}", true);
+                }
+
+                if (User.Session.CombineList.ContainsKey(User.Session.SelectedSticker.Md5Hash))
+                    User.Session.CombineList[User.Session.SelectedSticker.Md5Hash].Count += User.Session.SelectedSticker.Count;
+                else User.Session.CombineList.Add(User.Session.SelectedSticker.Md5Hash, User.Session.SelectedSticker);
+            }
+            await new BackToCombine(User, Update).Execute();
         }
 
         public CombineCallback() { }

+ 19 - 0
CardCollector/Commands/CallbackQuery/CombineStickers.cs

@@ -0,0 +1,19 @@
+using System.Threading.Tasks;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    public class CombineStickers : CallbackQuery
+    {
+        protected override string CommandText => Command.combine_stickers;
+        public override async Task Execute()
+        {
+            
+        }
+
+        public CombineStickers() { }
+        public CombineStickers(UserEntity user, Update update) : base(user, update) { }
+    }
+}

+ 25 - 0
CardCollector/Commands/CallbackQuery/DeleteCombine.cs

@@ -0,0 +1,25 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    public class DeleteCombine : CallbackQuery
+    {
+        protected override string CommandText => Command.delete_combine;
+        public override async Task Execute()
+        {
+            var hash = CallbackData.Split('=')[1];
+            User.Session.CombineList.Remove(hash);
+            if (User.Session.CombineList.Count == 0)
+                await new BackToFiltersMenu(User, Update).Execute();
+            else await MessageController.EditMessage(User, CallbackMessageId, 
+                User.Session.GetCombineMessage(), Keyboard.GetCombineKeyboard(User.Session));
+        }
+
+        public DeleteCombine() { }
+        public DeleteCombine(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -32,6 +32,8 @@ namespace CardCollector.Commands.InlineQuery
             new ShowAuctionStickers(),
             // Показать стикеры в коллекции
             new ShowCollectionStickers(),
+            // Показать стикеры для комбинации
+            new ShowCombineStickers(),
             // Показать стикеры в магазине
             new ShowShopStickers(),
             // Показать список продавцов

+ 1 - 1
CardCollector/Commands/InlineQuery/ShowCollectionStickers.cs

@@ -28,7 +28,7 @@ namespace CardCollector.Commands.InlineQuery
         {
             return User == null 
                 ? command.Contains("Sender")
-                : User.Session.State == UserState.CollectionMenu;
+                : User.Session.State == UserState.CollectionMenu && User.Session.CombineList.Count == 0;
         }
 
         public ShowCollectionStickers() { }

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

@@ -0,0 +1,36 @@
+using System.Linq;
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.InlineQuery
+{
+    public class ShowCombineStickers : InlineQuery
+    {
+        protected override string CommandText => "";
+        public override async Task Execute()
+        {
+            // Фильтр - введенная пользователем фраза
+            var filter = Update.InlineQuery!.Query;
+            // Получаем список стикеров
+            var stickersList = await User.GetStickersList(filter, User.Session.CombineList.First().Value.Tier);
+            var results = stickersList.ToTelegramResults(Command.select_sticker);
+            // Посылаем пользователю ответ на его запрос
+            await MessageController.AnswerInlineQuery(InlineQueryId, results);
+        }
+        
+        /* Команда пользователя удовлетворяет условию, если она вызвана
+         в личных сообщениях с ботом и пользователь в меню коллекции */
+        protected internal override bool IsMatches(string command)
+        {
+            return User == null 
+                ? command.Contains("Sender")
+                : User.Session.State == UserState.CollectionMenu && User.Session.CombineList.Count > 0;
+        }
+
+        public ShowCombineStickers() { }
+        public ShowCombineStickers(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -19,7 +19,7 @@ namespace CardCollector.Commands.InlineQuery
             var filter = Update.InlineQuery!.Query;
             // Получаем список стикеров
             var stickersList = await User.GetStickersList(filter);
-            var results = stickersList.ToTelegramResults(Command.send_sticker);
+            var results = stickersList.ToTelegramResults(Command.select_sticker);
             // Посылаем пользователю ответ на его запрос
             await MessageController.AnswerInlineQuery(InlineQueryId, results);
         }
@@ -30,7 +30,7 @@ namespace CardCollector.Commands.InlineQuery
         {
             return User == null 
                 ? command.Contains("Sender")
-                : User.Session.State == UserState.Default && User.Session.SelectedSticker == null;
+                : User.Session.State == UserState.Default;
         }
 
         public ShowStickersInBotChat() { }

+ 5 - 2
CardCollector/DataBase/Entity/UserEntity.cs

@@ -7,6 +7,7 @@ using System.Threading.Tasks;
 using CardCollector.DataBase.EntityDao;
 using CardCollector.Others;
 using CardCollector.Resources;
+using Telegram.Bot.Types;
 
 namespace CardCollector.DataBase.Entity
 {
@@ -46,13 +47,15 @@ namespace CardCollector.DataBase.Entity
         }
         
         /* Возвращает стикеры пользователя */
-        public async Task<IEnumerable<StickerEntity>> GetStickersList(string filter)
+        public async Task<IEnumerable<StickerEntity>> GetStickersList(string filter, int tier = -1)
         {
             if (Constants.UNLIMITED_ALL_STICKERS) return await StickerDao.GetAll(filter);
-            return Stickers.Values
+            var result = Stickers.Values
                 .Where(relation => relation.Count > 0)
                 .Select(rel => StickerDao.GetStickerByHash(rel.ShortHash).Result)
                 .Where(sticker => sticker.Title.Contains(filter, StringComparison.CurrentCultureIgnoreCase));
+            if (tier != -1) result = result.Where(sticker => sticker.Tier == tier);
+            return result;
         }
 
         public UserEntity()

+ 23 - 5
CardCollector/Others/Session.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading.Tasks;
 using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
@@ -21,13 +22,13 @@ namespace CardCollector.Others
 
         /* Текущее состояние пользователя */
         public UserState State = UserState.Default;
-        
+
         /* Выбранный пользователем стикер для покупки (продажи, слияния) */
         public StickerInfo SelectedSticker { get; set; }
-        
+
         /* Выбранные пользователем стикеры для слияния */
-        public List<StickerInfo> CombineList { get; set; } = new();
-        
+        public Dictionary<string, StickerInfo> CombineList { get; set; } = new();
+
 
         public void UpdateLastAccess()
         {
@@ -99,6 +100,7 @@ namespace CardCollector.Others
                 IncomeCoins += stickerInfo.IncomeCoins * multiplier;
                 IncomeGems += stickerInfo.IncomeGems * multiplier;
             }
+
             user.Cash.Coins += IncomeCoins;
             user.Cash.Gems += IncomeGems;
         }
@@ -120,17 +122,33 @@ namespace CardCollector.Others
             user.Cash.Gems += IncomeGems;
         }
 
+        public int GetCombineCount()
+        {
+            return CombineList.Values.Sum(e => e.Count);
+        }
+
         public async void EndSession()
         {
             await ClearMessages();
             SelectedSticker = null;
             CombineList.Clear();
         }
-        
+
         public void Dispose()
         {
             EndSession();
             GC.SuppressFinalize(this);
         }
+
+        public string GetCombineMessage()
+        {
+            var message = $"{Text.added_stickers} {GetCombineCount()}/{Constants.COMBINE_COUNT}:";
+            var i = 0;
+            foreach (var sticker in CombineList.Values){
+                message += $"\n{Text.sticker} {i + 1}: {sticker.Title} {sticker.Count}{Text.items}";
+                ++i;
+            }
+            return message;
+        }
     }
 }

+ 27 - 0
CardCollector/Resources/Command.Designer.cs

@@ -78,6 +78,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to back_to_combine.
+        /// </summary>
+        internal static string back_to_combine {
+            get {
+                return ResourceManager.GetString("back_to_combine", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to back_to_sticker.
         /// </summary>
@@ -132,6 +141,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to comb_stickers.
+        /// </summary>
+        internal static string combine_stickers {
+            get {
+                return ResourceManager.GetString("combine_stickers", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to confirm_buying.
         /// </summary>
@@ -159,6 +177,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to delete.
+        /// </summary>
+        internal static string delete_combine {
+            get {
+                return ResourceManager.GetString("delete_combine", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to emoji.
         /// </summary>

+ 9 - 0
CardCollector/Resources/Command.resx

@@ -93,4 +93,13 @@
     <data name="back_to_sticker" xml:space="preserve">
         <value>back_to_sticker</value>
     </data>
+    <data name="back_to_combine" xml:space="preserve">
+        <value>back_to_combine</value>
+    </data>
+    <data name="delete_combine" xml:space="preserve">
+        <value>delete</value>
+    </data>
+    <data name="combine_stickers" xml:space="preserve">
+        <value>comb_stickers</value>
+    </data>
 </root>

+ 2 - 1
CardCollector/Resources/Constants.cs

@@ -10,7 +10,7 @@ namespace CardCollector.Resources
         /* Время кэширования результатов @имя_бота команд */
         public const int INLINE_RESULTS_CACHE_TIME = 1;
         /* Включает бесконечные стикеры без наличия их в коллекции */
-        public static readonly bool UNLIMITED_ALL_STICKERS = DEBUG;
+        public static readonly bool UNLIMITED_ALL_STICKERS = !DEBUG;
 
 
         /* Уровни привилегий пользователей системы */
@@ -19,5 +19,6 @@ namespace CardCollector.Resources
         public const int PROGRAMMER_PRIVILEGE_LEVEL = 5;
         public const int ARTIST_PRIVILEGE_LEVEL = 4;
         public const int SESSION_ACTIVE_PERIOD = DEBUG ? 1 : 60;
+        public const int COMBINE_COUNT = 5;
     }
 }

+ 32 - 3
CardCollector/Resources/Keyboard.cs

@@ -205,7 +205,7 @@ namespace CardCollector.Resources
                     InlineKeyboardButton.WithCallbackData(Text.plus, $"{Command.count}+"),
                 }
             };
-            if (stickerInfo.Tier != 5) keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData(Text.combine, Command.combine)});
+            if (stickerInfo.Tier != 5) keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData($"{Text.combine} ({stickerInfo.Count})", Command.combine)});
             keyboard.Add(new[] {InlineKeyboardButton.WithCallbackData(Text.back, $"{Command.back}={Command.clear_chat}")});
             return new InlineKeyboardMarkup(keyboard);
         }
@@ -264,12 +264,41 @@ namespace CardCollector.Resources
                 UserState.AuctionMenu when session.SelectedSticker.TraderInfo is not null => GetAuctionProductKeyboard(session.SelectedSticker),
                 UserState.AuctionMenu => GetAuctionStickerKeyboard(),
                 UserState.ShopMenu => GetShopStickerKeyboard(session.SelectedSticker),
-                UserState.CollectionMenu when session.CombineList.Count > 0 => GetCollectionStickerKeyboard(session.SelectedSticker),
+                UserState.CollectionMenu when session.CombineList.Count > 0 => GetCombineStickerKeyboard(session.SelectedSticker),
                 UserState.CollectionMenu => GetCollectionStickerKeyboard(session.SelectedSticker),
                 _ => GetStickerKeyboard(session.SelectedSticker)
             };
         }
-        
+
+        public static InlineKeyboardMarkup GetCombineStickerKeyboard(StickerInfo stickerInfo)
+        {
+            return new InlineKeyboardMarkup(new[] {
+                new[] {InlineKeyboardButton.WithCallbackData($"{Text.add} ({stickerInfo.Count})", Command.combine)},
+                new[]
+                {
+                    InlineKeyboardButton.WithCallbackData(Text.minus, $"{Command.count}-"),
+                    InlineKeyboardButton.WithCallbackData(Text.plus, $"{Command.count}+"),
+                },
+                new[] {InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back_to_combine)},
+                new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(Text.select_another)},
+            });
+        }
+
+        public static InlineKeyboardMarkup GetCombineKeyboard(UserSession session)
+        {
+            var keyboard = new List<InlineKeyboardButton[]>();
+            foreach (var (id, _) in session.CombineList)
+            {
+                keyboard.Add(new []{InlineKeyboardButton.WithCallbackData($"{Text.delete} {Text.sticker} {keyboard.Count + 1}",
+                    $"{Command.delete_combine}={id}")});
+            }
+            keyboard.Add(new []{InlineKeyboardButton.WithCallbackData(Text.cancel, Command.back)});
+            keyboard.Add(session.GetCombineCount() == Constants.COMBINE_COUNT
+                ? new[] {InlineKeyboardButton.WithCallbackData(Text.combine, Command.combine_stickers)}
+                : new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(Text.add_sticker)});
+            return new InlineKeyboardMarkup(keyboard);
+        }
+
         /* Клавиатура, отображаемая вместе с сообщением профиля */
         public static InlineKeyboardMarkup GetProfileKeyboard(UserEntity user)
         {

+ 20 - 2
CardCollector/Resources/Messages.Designer.cs

@@ -87,6 +87,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Не удалось добавить стикеры. Необходимое количество уже собрано..
+        /// </summary>
+        internal static string cant_combine {
+            get {
+                return ResourceManager.GetString("cant_combine", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Невозможно уменьшить количество стикеров!.
         /// </summary>
@@ -150,6 +159,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Не удалось добавить все стикеры. Было добавлено только.
+        /// </summary>
+        internal static string combine_added_only {
+            get {
+                return ResourceManager.GetString("combine_added_only", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Подтвердите покупку:.
         /// </summary>
@@ -367,7 +385,7 @@ namespace CardCollector.Resources {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Вы получили.
+        ///   Looks up a localized string similar to Получено.
         /// </summary>
         internal static string you_collected {
             get {
@@ -385,7 +403,7 @@ namespace CardCollector.Resources {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Ваш баланс.
+        ///   Looks up a localized string similar to Баланс.
         /// </summary>
         internal static string your_cash {
             get {

+ 8 - 2
CardCollector/Resources/Messages.resx

@@ -97,13 +97,13 @@
         <value>Несобранная прибыль</value>
     </data>
     <data name="you_collected" xml:space="preserve">
-        <value>Вы получили</value>
+        <value>Получено</value>
     </data>
     <data name="menu_message" xml:space="preserve">
         <value>Вы можете выбрать одну из опций ниже</value>
     </data>
     <data name="your_cash" xml:space="preserve">
-        <value>Ваш баланс</value>
+        <value>Баланс</value>
     </data>
     <data name="cant_increase" xml:space="preserve">
         <value>Невозможно увеличить количество стикеров!</value>
@@ -129,4 +129,10 @@
     <data name="you_sold" xml:space="preserve">
         <value>Вы продали</value>
     </data>
+    <data name="cant_combine" xml:space="preserve">
+        <value>Не удалось добавить стикеры. Необходимое количество уже собрано.</value>
+    </data>
+    <data name="combine_added_only" xml:space="preserve">
+        <value>Не удалось добавить все стикеры. Было добавлено только</value>
+    </data>
 </root>

+ 54 - 0
CardCollector/Resources/Text.Designer.cs

@@ -60,6 +60,33 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Добавить.
+        /// </summary>
+        internal static string add {
+            get {
+                return ResourceManager.GetString("add", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Добавить стикер.
+        /// </summary>
+        internal static string add_sticker {
+            get {
+                return ResourceManager.GetString("add_sticker", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Добавлено стикеров.
+        /// </summary>
+        internal static string added_stickers {
+            get {
+                return ResourceManager.GetString("added_stickers", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Все.
         /// </summary>
@@ -168,6 +195,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Удалить.
+        /// </summary>
+        internal static string delete {
+            get {
+                return ResourceManager.GetString("delete", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Описание.
         /// </summary>
@@ -339,6 +375,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Выбрать другой стикер.
+        /// </summary>
+        internal static string select_another {
+            get {
+                return ResourceManager.GetString("select_another", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Выставить на аукцион.
         /// </summary>
@@ -420,6 +465,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Стикер.
+        /// </summary>
+        internal static string sticker {
+            get {
+                return ResourceManager.GetString("sticker", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Тир.
         /// </summary>

+ 18 - 0
CardCollector/Resources/Text.resx

@@ -150,4 +150,22 @@
     <data name="select" xml:space="preserve">
         <value>Выбрать</value>
     </data>
+    <data name="select_another" xml:space="preserve">
+        <value>Выбрать другой стикер</value>
+    </data>
+    <data name="add" xml:space="preserve">
+        <value>Добавить</value>
+    </data>
+    <data name="added_stickers" xml:space="preserve">
+        <value>Добавлено стикеров</value>
+    </data>
+    <data name="sticker" xml:space="preserve">
+        <value>Стикер</value>
+    </data>
+    <data name="add_sticker" xml:space="preserve">
+        <value>Добавить стикер</value>
+    </data>
+    <data name="delete" xml:space="preserve">
+        <value>Удалить</value>
+    </data>
 </root>