Procházet zdrojové kódy

Add collection command, release pinning profile message and deleting previous message

Tigran před 4 roky
rodič
revize
75b9a22f15

+ 4 - 2
CardCollector.sln.DotSettings.user

@@ -1,6 +1,8 @@
 <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_002FCallbackQueryCommands/@EntryIndexedValue">False</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FCallbackQueryCommands/@EntryIndexedValue">True</s:Boolean>
 	
-	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FMessageCommands/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/ResxEditorPersonal/CheckedGroups/=CardCollector_002FResources_002FMessageCommands/@EntryIndexedValue">False</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/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>

+ 18 - 0
CardCollector/CardCollector.csproj

@@ -26,6 +26,14 @@
         <Generator>ResXFileCodeGenerator</Generator>
         <LastGenOutput>CallbackQueryCommands.Designer.cs</LastGenOutput>
       </EmbeddedResource>
+      <EmbeddedResource Update="Resources\SortingTypes.resx">
+        <Generator>ResXFileCodeGenerator</Generator>
+        <LastGenOutput>SortingTypes.Designer.cs</LastGenOutput>
+      </EmbeddedResource>
+      <EmbeddedResource Update="Resources\SortingTypes.resx">
+        <Generator>ResXFileCodeGenerator</Generator>
+        <LastGenOutput>SortingTypes.Designer.cs</LastGenOutput>
+      </EmbeddedResource>
     </ItemGroup>
 
     <ItemGroup>
@@ -44,6 +52,16 @@
         <AutoGen>True</AutoGen>
         <DependentUpon>CallbackQueryCommands.resx</DependentUpon>
       </Compile>
+      <Compile Update="Resources\SortingTypes.Designer.cs">
+        <DesignTime>True</DesignTime>
+        <AutoGen>True</AutoGen>
+        <DependentUpon>SortingTypes.resx</DependentUpon>
+      </Compile>
+      <Compile Update="Resources\SortingTypes.Designer.cs">
+        <DesignTime>True</DesignTime>
+        <AutoGen>True</AutoGen>
+        <DependentUpon>SortingTypes.resx</DependentUpon>
+      </Compile>
     </ItemGroup>
 
 </Project>

+ 2 - 13
CardCollector/Commands/IgnoreUpdate.cs

@@ -1,22 +1,11 @@
 using System.Threading.Tasks;
-using CardCollector.Controllers;
-using CardCollector.DataBase.Entity;
-using Telegram.Bot.Types;
-using Telegram.Bot.Types.Enums;
 
 namespace CardCollector.Commands
 {
-    /* Данный класс позволяет проигнорировать действие пользователя */
+    /* Данный класс позволяет проигнорировать входящее обновление */
     public class IgnoreUpdate : UpdateModel
     {
         protected override string Command => "";
-        public override async Task Execute()
-        {
-            if (Update.Message?.Chat.Type is ChatType.Private)
-                await MessageController.DeleteMessage(User, Update.Message.MessageId);
-        }
-        
-        public IgnoreUpdate(UserEntity user, Update update) : base(user, update) { }
-        public IgnoreUpdate() { }
+        public override async Task Execute() { }
     }
 }

+ 35 - 0
CardCollector/Commands/Message/CollectionMessage.cs

@@ -0,0 +1,35 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.Message
+{
+    /* Реализует команду "Коллекция" */
+    public class CollectionMessage : Message
+    {
+        protected override string Command => MessageCommands.collection;
+        public override async Task Execute()
+        {
+            /* Очищаем чат с пользователем */
+            await User.ClearChat();
+            /* Переводим состояние пользователя в меню коллекции */
+            User.State = UserState.CollectionMenu;
+            /* Формируем сообщение с имеющимися фильтрами у пользователя */
+            var text = $"{Messages.current_filters}\n" +
+                       $"{Messages.author} {(User.Filters["author"].Equals("") ? Messages.all : User.Filters["author"])}\n" +
+                       $"{Messages.tier} {(User.Filters["tier"].Equals(-1) ? Messages.all : new string('⭐', (int)User.Filters["tier"]))}\n" +
+                       $"{Messages.emoji} {(User.Filters["emoji"].Equals("") ? Messages.all : User.Filters["emoji"])}\n" +
+                       $"{Messages.sorting} {User.Filters["sorting"]}\n" +
+                       $"\n{Messages.select_filter}";
+            /* Отправляем сообщение */
+            var message = await MessageController.SendMessage(User, text, Keyboard.SortingOptions);
+            /* Добавляем это сообщение в список для удаления */
+            User.Messages.Add(message.MessageId);
+        }
+        
+        public CollectionMessage() { }
+        public CollectionMessage(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -5,6 +5,8 @@ using System.Collections.Generic;
 using System.Linq;
 using CardCollector.DataBase.Entity;
 using CardCollector.DataBase.EntityDao;
+using CardCollector.Resources;
+using Telegram.Bot;
 using Telegram.Bot.Types;
 
 namespace CardCollector.Commands.Message
@@ -27,6 +29,8 @@ namespace CardCollector.Commands.Message
             new ProfileMessage(),
             // Команда "/start"
             new StartMessage(),
+            // Команда "Коллекция"
+            new CollectionMessage(),
             
             // Команда "Показать пример"
             new ShowSample()
@@ -35,16 +39,23 @@ namespace CardCollector.Commands.Message
         /* Метод, создающий объекты команд исходя из полученного обновления */
         public static async Task<UpdateModel> Factory(Update update)
         {
+            // Если сообщение от нашего бота
+            if (update.Message!.From!.Username == AppSettings.NAME)
+            {
+                await Bot.Client.DeleteMessageAsync(update.Message.Chat.Id, update.Message.MessageId);
+                return new IgnoreUpdate();
+            }
+            
             // Объект пользователя
             var user = await UserDao.GetUser(update.Message!.From);
             
-            //Если сообщение не содержит текст
-            if (update.Message!.Text == null) return new IgnoreUpdate(user, update);
-            
+            // Если пользователь заблокирован или сообщение не содержит текст или пользователь - бот
+            if (user.IsBlocked || update.Message!.Text == null || update.Message!.From!.IsBot) return new IgnoreUpdate();
+
             // Текст команды
             var command = update.Message!.Text;
         
-            // Добавляем сообщения пользователя в пул для удаления
+            // Удаляем сообщение пользователя, оно нам больше не нужно
             await MessageController.DeleteMessage(user, update.Message.MessageId);
             
             // Возвращаем объект, если команда совпала

+ 10 - 1
CardCollector/Commands/Message/ProfileMessage.cs

@@ -2,6 +2,7 @@
 using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
+using Telegram.Bot;
 using Telegram.Bot.Types;
 
 namespace CardCollector.Commands.Message
@@ -14,7 +15,7 @@ namespace CardCollector.Commands.Message
         public override async Task Execute()
         {
             /* Отправляем сообщение */
-            await MessageController.SendMessage(User, 
+            var message = await MessageController.SendMessage(User, 
                 /* Имя пользователя */
                 $"{User.Username}\n" +
                 /* Количество монет */
@@ -23,6 +24,14 @@ namespace CardCollector.Commands.Message
                 $"Алмазы: {User.Cash.Gems}",
                 /* Клавиатура профиля */
                 Keyboard.ProfileKeyboard);
+            /* Открепляем все закрепы */
+            await Bot.Client.UnpinAllChatMessages(User.ChatId);
+            /* Удаляем предыдущее сообщение профиля пользователя */
+            if (User.CurrentProfileMessageId != default) await MessageController.DeleteMessage(User, User.CurrentProfileMessageId);
+            /* Записываем id нового сообщения */
+            User.CurrentProfileMessageId = message.MessageId;
+            /* Закрепляем новое сообщение профиля */
+            await Bot.Client.PinChatMessageAsync(User.ChatId, message.MessageId, true);
         }
         
         public ProfileMessage() { }

+ 1 - 1
CardCollector/Commands/Message/ShowSample.cs

@@ -8,7 +8,7 @@ using Telegram.Bot.Types.ReplyMarkups;
 namespace CardCollector.Commands.Message
 {
     /* Этот класс можно использовать для тестирования или наброски эскизов
-     Команда "Показать пример" доступна только пользователям суровнем доступа "Разработчик" и выше
+     Команда "Показать пример" доступна только пользователям с уровнем доступа "Разработчик" и выше
      PrivilegeLevel = 5 */
     public class ShowSample : Message
     {

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

@@ -15,7 +15,10 @@ namespace CardCollector.Commands.Message
         public override async Task Execute()
         {
             /* Отправляем пользователю сообщение со стандартной клавиатурой */
-            await MessageController.SendMessage(User,"Привет!", Keyboard.Menu);
+            await MessageController.SendMessage(User, Messages.start_message, Keyboard.Menu);
+            
+            /* Отправляем пользователю его профиль */
+            await new ProfileMessage(User, Update).Execute();
         }
         
         public StartMessage(UserEntity user, Update update) : base(user, update) { }

+ 28 - 0
CardCollector/DataBase/Entity/UserEntity.cs

@@ -3,7 +3,9 @@ using System.ComponentModel.DataAnnotations;
 using System.ComponentModel.DataAnnotations.Schema;
 using System.Linq;
 using System.Threading.Tasks;
+using CardCollector.Controllers;
 using CardCollector.DataBase.EntityDao;
+using CardCollector.Resources;
 using Telegram.Bot.Types.InlineQueryResults;
 
 namespace CardCollector.DataBase.Entity
@@ -28,11 +30,37 @@ namespace CardCollector.DataBase.Entity
         /* Уровень привилегий пользователя */
         [Column("privilege_level"), MaxLength(32)] public int PrivilegeLevel { get; set; } = 0;
         
+        [Column("current_profile_massage_id")] public int CurrentProfileMessageId { get; set; }
+        
         /* Счет пользователя */
         [NotMapped] public CashEntity Cash { get; set; }
         
         /* Стикеры пользователя */
         [NotMapped] public Dictionary<string, UserStickerRelationEntity> Stickers { get; set; }
+
+        /* Текущее состояние пользователя */
+        [NotMapped] public UserState State = UserState.Default;
+
+        /* Фильтры, примененные пользователем в меню коллекции/магазина/аукциона */
+        [NotMapped] public readonly Dictionary<string, object> Filters = new()
+        {
+            {"author", ""},
+            {"tier", -1},
+            {"emoji", ""},
+            {"sorting", SortingTypes.None},
+            {"price", 0},
+        };
+
+        /* Сообщения в чате пользователя */
+        [NotMapped] public readonly List<int> Messages = new();
+
+        /* Удаляет из чата все сообщения, добавленные в список выше */
+        public async Task ClearChat()
+        {
+            foreach (var messageId in Messages)
+                await MessageController.DeleteMessage(this, messageId);
+            Messages.Clear();
+        }
         
         /* Возвращает стикеры в виде объектов телеграм */
         public async Task<IEnumerable<InlineQueryResult>> GetStickersList(string command, string filter)

+ 0 - 6
CardCollector/Extensions/ListExtensions.cs

@@ -1,6 +0,0 @@
-namespace CardCollector.Extensions
-{
-    public static class ListExtensions
-    {
-    }
-}

+ 3 - 3
CardCollector/Logs.cs

@@ -8,15 +8,15 @@ namespace CardCollector
     {
         public static void LogOut(object message)
         {
-            Console.WriteLine($"[INFO] [{DateTime.Now.ToString(CultureInfo.CurrentCulture)}] {message}");
+            Console.WriteLine($"[INFO] [{DateTime.Now.ToString(CultureInfo.CurrentCulture)}] {(message is Exception e ? e : Utilities.ToJson(message))}");
         }
         public static void LogOutWarning(object message)
         {
-            Console.WriteLine($"[WARNING] [{DateTime.Now.ToString(CultureInfo.CurrentCulture)}] {message}");
+            Console.WriteLine($"[WARNING] [{DateTime.Now.ToString(CultureInfo.CurrentCulture)}] {(message is Exception e ? e : Utilities.ToJson(message))}");
         }
         public static void LogOutError(object message)
         {
-            Console.WriteLine($"[ERROR] [{DateTime.Now.ToString(CultureInfo.CurrentCulture)}] {message}");
+            Console.WriteLine($"[ERROR] [{DateTime.Now.ToString(CultureInfo.CurrentCulture)}] {(message is Exception e ? e : Utilities.ToJson(message))}");
         }
     }
 }

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

@@ -60,6 +60,24 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Автор.
+        /// </summary>
+        internal static string author {
+            get {
+                return ResourceManager.GetString("author", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Отмена.
+        /// </summary>
+        internal static string cancel_menu {
+            get {
+                return ResourceManager.GetString("cancel_menu", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Собрать прибыль.
         /// </summary>
@@ -68,5 +86,41 @@ namespace CardCollector.Resources {
                 return ResourceManager.GetString("collect_income", resourceCulture);
             }
         }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Эмоция.
+        /// </summary>
+        internal static string emoji {
+            get {
+                return ResourceManager.GetString("emoji", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Показать стикеры.
+        /// </summary>
+        internal static string show_stickers {
+            get {
+                return ResourceManager.GetString("show_stickers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Сортировка.
+        /// </summary>
+        internal static string sorting {
+            get {
+                return ResourceManager.GetString("sorting", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Тир.
+        /// </summary>
+        internal static string tier {
+            get {
+                return ResourceManager.GetString("tier", resourceCulture);
+            }
+        }
     }
 }

+ 18 - 0
CardCollector/Resources/CallbackQueryCommands.resx

@@ -21,4 +21,22 @@
     <data name="collect_income" xml:space="preserve">
         <value>Собрать прибыль</value>
     </data>
+    <data name="author" xml:space="preserve">
+        <value>Автор</value>
+    </data>
+    <data name="tier" xml:space="preserve">
+        <value>Тир</value>
+    </data>
+    <data name="emoji" xml:space="preserve">
+        <value>Эмоция</value>
+    </data>
+    <data name="sorting" xml:space="preserve">
+        <value>Сортировка</value>
+    </data>
+    <data name="cancel_menu" xml:space="preserve">
+        <value>Отмена</value>
+    </data>
+    <data name="show_stickers" xml:space="preserve">
+        <value>Показать стикеры</value>
+    </data>
 </root>

+ 11 - 0
CardCollector/Resources/Keyboard.cs

@@ -18,5 +18,16 @@ namespace CardCollector.Resources
             new KeyboardButton[] { MessageCommands.profile, MessageCommands.collection },
             new KeyboardButton[] { MessageCommands.shop, MessageCommands.auction },
         }) { ResizeKeyboard = true };
+
+        /* Клавиатура меню сортировки */
+        public static readonly InlineKeyboardMarkup SortingOptions = new(new[]
+        {
+            new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.author)},
+            new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.tier)},
+            new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.emoji)},
+            new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.sorting)},
+            new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.cancel_menu)},
+            new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(CallbackQueryCommands.show_stickers)},
+        });
     }
 }

+ 81 - 0
CardCollector/Resources/Messages.Designer.cs

@@ -59,5 +59,86 @@ namespace CardCollector.Resources {
                 resourceCulture = value;
             }
         }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (все).
+        /// </summary>
+        internal static string all {
+            get {
+                return ResourceManager.GetString("all", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Автор:.
+        /// </summary>
+        internal static string author {
+            get {
+                return ResourceManager.GetString("author", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Текущие примененные фильтры:.
+        /// </summary>
+        internal static string current_filters {
+            get {
+                return ResourceManager.GetString("current_filters", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Эмоция:.
+        /// </summary>
+        internal static string emoji {
+            get {
+                return ResourceManager.GetString("emoji", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (нет).
+        /// </summary>
+        internal static string no {
+            get {
+                return ResourceManager.GetString("no", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Установите фильтры кнопками ниже:.
+        /// </summary>
+        internal static string select_filter {
+            get {
+                return ResourceManager.GetString("select_filter", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Сортировка:.
+        /// </summary>
+        internal static string sorting {
+            get {
+                return ResourceManager.GetString("sorting", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Приветственное сообщение.
+        /// </summary>
+        internal static string start_message {
+            get {
+                return ResourceManager.GetString("start_message", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Тир:.
+        /// </summary>
+        internal static string tier {
+            get {
+                return ResourceManager.GetString("tier", resourceCulture);
+            }
+        }
     }
 }

+ 27 - 0
CardCollector/Resources/Messages.resx

@@ -18,4 +18,31 @@
     <resheader name="writer">
         <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
     </resheader>
+    <data name="start_message" xml:space="preserve">
+        <value>Приветственное сообщение</value>
+    </data>
+    <data name="current_filters" xml:space="preserve">
+        <value>Текущие примененные фильтры:</value>
+    </data>
+    <data name="select_filter" xml:space="preserve">
+        <value>Установите фильтры кнопками ниже:</value>
+    </data>
+    <data name="author" xml:space="preserve">
+        <value>Автор:</value>
+    </data>
+    <data name="tier" xml:space="preserve">
+        <value>Тир:</value>
+    </data>
+    <data name="emoji" xml:space="preserve">
+        <value>Эмоция:</value>
+    </data>
+    <data name="sorting" xml:space="preserve">
+        <value>Сортировка:</value>
+    </data>
+    <data name="all" xml:space="preserve">
+        <value>(все)</value>
+    </data>
+    <data name="no" xml:space="preserve">
+        <value>(нет)</value>
+    </data>
 </root>

+ 108 - 0
CardCollector/Resources/SortingTypes.Designer.cs

@@ -0,0 +1,108 @@
+//------------------------------------------------------------------------------
+// <auto-generated>
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.42000
+//
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
+// </auto-generated>
+//------------------------------------------------------------------------------
+
+namespace CardCollector.Resources {
+    using System;
+    
+    
+    /// <summary>
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
+    /// </summary>
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
+    [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
+    [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
+    internal class SortingTypes {
+        
+        private static global::System.Resources.ResourceManager resourceMan;
+        
+        private static global::System.Globalization.CultureInfo resourceCulture;
+        
+        [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
+        internal SortingTypes() {
+        }
+        
+        /// <summary>
+        ///   Returns the cached ResourceManager instance used by this class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Resources.ResourceManager ResourceManager {
+            get {
+                if (object.ReferenceEquals(resourceMan, null)) {
+                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("CardCollector.Resources.SortingTypes", typeof(SortingTypes).Assembly);
+                    resourceMan = temp;
+                }
+                return resourceMan;
+            }
+        }
+        
+        /// <summary>
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
+        /// </summary>
+        [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
+        internal static global::System.Globalization.CultureInfo Culture {
+            get {
+                return resourceCulture;
+            }
+            set {
+                resourceCulture = value;
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to По автору.
+        /// </summary>
+        internal static string ByAuthor {
+            get {
+                return ResourceManager.GetString("ByAuthor", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to По тиру (убывание).
+        /// </summary>
+        internal static string ByTierDecrease {
+            get {
+                return ResourceManager.GetString("ByTierDecrease", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to По тиру (возрастание).
+        /// </summary>
+        internal static string ByTierIncrease {
+            get {
+                return ResourceManager.GetString("ByTierIncrease", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to По названию.
+        /// </summary>
+        internal static string ByTitle {
+            get {
+                return ResourceManager.GetString("ByTitle", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to (Нет).
+        /// </summary>
+        internal static string None {
+            get {
+                return ResourceManager.GetString("None", resourceCulture);
+            }
+        }
+    }
+}

+ 36 - 0
CardCollector/Resources/SortingTypes.resx

@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<root>
+    <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+        <xsd:element name="root" msdata:IsDataSet="true">
+            
+        </xsd:element>
+    </xsd:schema>
+    <resheader name="resmimetype">
+        <value>text/microsoft-resx</value>
+    </resheader>
+    <resheader name="version">
+        <value>1.3</value>
+    </resheader>
+    <resheader name="reader">
+        <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    </resheader>
+    <resheader name="writer">
+        <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+    </resheader>
+    <data name="None" xml:space="preserve">
+        <value>(Нет)</value>
+    </data>
+    <data name="ByTierDecrease" xml:space="preserve">
+        <value>По тиру (убывание)</value>
+    </data>
+    <data name="ByTierIncrease" xml:space="preserve">
+        <value>По тиру (возрастание)</value>
+    </data>
+    <data name="ByAuthor" xml:space="preserve">
+        <value>По автору</value>
+    </data>
+    <data name="ByTitle" xml:space="preserve">
+        <value>По названию</value>
+    </data>
+</root>

+ 16 - 0
CardCollector/Resources/UserState.cs

@@ -0,0 +1,16 @@
+namespace CardCollector.Resources
+{
+    /* Представление состояний пользователя */
+    public enum UserState
+    {
+        /* Пользователь в меню коллекции */
+        CollectionMenu,
+        /* Пользователь в меню магазина */
+        ShopMenu,
+        /* Пользователь в меню аукциона */
+        AuctionMenu,
+        
+        /* Пользователь в базовом состоянии (по умолчанию) */
+        Default
+    }
+}