Browse Source

Merge remote-tracking branch 'origin/Develop' into Develop

DarkGolly 4 years ago
parent
commit
c95449a858

+ 1 - 1
CardCollector.sln.DotSettings.user

@@ -2,7 +2,7 @@
 	<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">False</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/Initialized/@EntryValue">True</s:Boolean></wpf:ResourceDictionary>

+ 29 - 0
CardCollector/Commands/CallbackQuery/AuthorCallback.cs

@@ -0,0 +1,29 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.DataBase.EntityDao;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    /* Реализует нажатие на кнопку "Автор" (открывается меню с выбором автора) */
+    public class AuthorCallback : CallbackQuery
+    {
+        protected override string Command => CallbackQueryCommands.author;
+
+        public override async Task Execute()
+        {
+            /* Получаем из бд список всех авторов */
+            var list = await StickerDao.GetAuthorsList();
+            /* Сортируем по алфавиту */
+            list.Sort();
+            /* Заменяем сообщение меню на сообщение со списком */
+            await MessageController.EditMessage(User, CallbackMessageId,
+                Messages.choose_author, Keyboard.GetAuthorsKeyboard(list));
+        }
+
+        public AuthorCallback() { }
+        public AuthorCallback(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -0,0 +1,29 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    public class BackToFiltersMenu : CallbackQuery
+    {
+        protected override string Command => CallbackQueryCommands.back;
+        public override async Task Execute()
+        {
+            /* Формируем сообщение с имеющимися фильтрами у пользователя */
+            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.price} {User.Filters["price"]}-∞\n" +
+                       $"{Messages.sorting} {User.Filters["sorting"]}\n" +
+                       $"\n{Messages.select_filter}";
+            /* Редактируем сообщение */
+            await MessageController.EditMessage(User, CallbackMessageId, text, Keyboard.SortingOptions);
+        }
+        
+        public BackToFiltersMenu() { }
+        public BackToFiltersMenu(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -2,7 +2,6 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
-using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.DataBase.EntityDao;
 using Telegram.Bot.Types;
@@ -20,10 +19,22 @@ namespace CardCollector.Commands.CallbackQuery
      Update - обновление, полученное от сервера Телеграм */
     public abstract class CallbackQuery : UpdateModel
     {
+        /* Данные, поступившие после нажатия на кнокпку */
+        protected string CallbackData;
+        
+        /* Id сообщения, под которым нажали на кнопку */
+        protected int CallbackMessageId;
+        
         /* Список команд, распознаваемых ботом */
         private static readonly List<CallbackQuery> List = new()
         {
-
+            /* Кнопка "Автор" */
+            new AuthorCallback(),
+            /* Выбор автора из списка */
+            new SelectAuthorCallback(),
+            
+            /* Отмена в момент выбора "значения фильтра", не в самом меню */
+            new BackToFiltersMenu(),
         };
 
         /* Метод, создающий объекты команд исходя из полученного обновления */
@@ -44,7 +55,11 @@ namespace CardCollector.Commands.CallbackQuery
             return new CommandNotFound(user, update, command);
         }
 
-        protected CallbackQuery(UserEntity user, Update update) : base(user, update) { }
+        protected CallbackQuery(UserEntity user, Update update) : base(user, update)
+        {
+            CallbackData = update.CallbackQuery!.Data;
+            CallbackMessageId = update.CallbackQuery!.Message!.MessageId;
+        }
         protected CallbackQuery() { }
     }
 }

+ 21 - 0
CardCollector/Commands/CallbackQuery/SelectAuthorCallback.cs

@@ -0,0 +1,21 @@
+using System.Threading.Tasks;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    public class SelectAuthorCallback : CallbackQuery
+    {
+        protected override string Command => CallbackQueryCommands.author_callback;
+        public override async Task Execute()
+        {
+            var result = CallbackData.Split('=')[1];
+            User.Filters["author"] = result;
+            await new BackToFiltersMenu(User, Update).Execute();
+        }
+        
+        public SelectAuthorCallback() { }
+        public SelectAuthorCallback(UserEntity user, Update update) : base (user, update) { }
+    }
+}

+ 31 - 0
CardCollector/Commands/Custom/ShowFiltersMenu.cs

@@ -0,0 +1,31 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.Custom
+{
+    /* Этот класс реализует отправку нового сообщения с фильтрами пользователя */
+    public class ShowFiltersMenu : Message.Message
+    {
+        protected override string Command => "Message";
+        public override async Task Execute()
+        {
+            /* Формируем сообщение с имеющимися фильтрами у пользователя */
+            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.price} {User.Filters["price"]}-∞\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 ShowFiltersMenu(UserEntity user, Update update) : base(user, update) { }
+    }
+}

+ 3 - 12
CardCollector/Commands/Message/AuctionMessage.cs

@@ -1,4 +1,5 @@
 using System.Threading.Tasks;
+using CardCollector.Commands.Custom;
 using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
@@ -16,18 +17,8 @@ namespace CardCollector.Commands.Message
             await User.ClearChat();
             /* Переводим состояние пользователя в меню аукциона */
             User.State = UserState.AuctionMenu;
-            /* Формируем сообщение с имеющимися фильтрами у пользователя */
-            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.price} {User.Filters["price"]}-∞\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);
+            /* Отображаем сообщение с фильтрами */
+            await new ShowFiltersMenu(User, Update).Execute();
         }
         
         public AuctionMessage() { }

+ 17 - 9
CardCollector/DataBase/Entity/UserEntity.cs

@@ -66,17 +66,25 @@ namespace CardCollector.DataBase.Entity
         public async Task<IEnumerable<InlineQueryResult>> GetStickersList(string command, string filter)
         {
             var result = new List<InlineQueryResult>();
-            foreach (var sticker in Stickers.Values.Where(i => i.Count > 0))
-            {
-                if (filter != "")
+            if (Constants.UNLIMITED_ALL_STICKERS)
+                foreach (var sticker in await StickerDao.GetAll())
                 {
-                    var stickerInfo = await StickerDao.GetStickerInfo(sticker.StickerId);
-                    if (!stickerInfo.Title.Contains(filter)) break;
+                    var item = new InlineQueryResultCachedSticker($"unlimited_sticker={sticker.Title}", sticker.Id);
+                    result.Add(item);
+                    if (result.Count > 49) return result;
+                }
+            else
+                foreach (var sticker in Stickers.Values.Where(i => i.Count > 0))
+                {
+                    if (filter != "")
+                    {
+                        var stickerInfo = await StickerDao.GetStickerInfo(sticker.StickerId);
+                        if (!stickerInfo.Title.Contains(filter)) break;
+                    }
+                    var item = new InlineQueryResultCachedSticker($"{command}={sticker.ShortHash}", sticker.StickerId);
+                    result.Add(item);
+                    if (result.Count > 49) return result;
                 }
-                var item = new InlineQueryResultCachedSticker($"{command}={sticker.ShortHash}", sticker.StickerId);
-                result.Add(item);
-                if (result.Count > 49) return result;
-            }
             return result;
         }
     }

+ 16 - 1
CardCollector/DataBase/EntityDao/StickerDao.cs

@@ -1,4 +1,6 @@
-using System.Threading.Tasks;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
 using CardCollector.DataBase.Entity;
 using Microsoft.EntityFrameworkCore;
 
@@ -38,5 +40,18 @@ namespace CardCollector.DataBase.EntityDao
             var result = await Table.AddAsync(cash);
             return result.Entity;
         }
+
+        public static async Task<List<string>> GetAuthorsList()
+        {
+            return await Table
+                .Select(item => item.Author)
+                .Distinct()
+                .ToListAsync();
+        }
+
+        public static async Task<List<StickerEntity>> GetAll()
+        {
+            return await Table.ToListAsync();
+        }
     }
 }

+ 83 - 2
CardCollector/Resources/CallbackQueryCommands.Designer.cs

@@ -60,6 +60,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <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>
@@ -69,12 +78,39 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to author.
+        /// </summary>
+        internal static string author_callback {
+            get {
+                return ResourceManager.GetString("author_callback", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to back.
+        /// </summary>
+        internal static string back {
+            get {
+                return ResourceManager.GetString("back", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Отмена.
         /// </summary>
-        internal static string cancel_menu {
+        internal static string cancel {
             get {
-                return ResourceManager.GetString("cancel_menu", resourceCulture);
+                return ResourceManager.GetString("cancel", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to change_page.
+        /// </summary>
+        internal static string change_page {
+            get {
+                return ResourceManager.GetString("change_page", resourceCulture);
             }
         }
         
@@ -96,6 +132,33 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to emoji.
+        /// </summary>
+        internal static string emoji_callback {
+            get {
+                return ResourceManager.GetString("emoji_callback", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to →.
+        /// </summary>
+        internal static string next {
+            get {
+                return ResourceManager.GetString("next", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to ←.
+        /// </summary>
+        internal static string previous {
+            get {
+                return ResourceManager.GetString("previous", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Показать стикеры.
         /// </summary>
@@ -114,6 +177,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to sorting.
+        /// </summary>
+        internal static string sorting_callback {
+            get {
+                return ResourceManager.GetString("sorting_callback", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Тир.
         /// </summary>
@@ -122,5 +194,14 @@ namespace CardCollector.Resources {
                 return ResourceManager.GetString("tier", resourceCulture);
             }
         }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to tier.
+        /// </summary>
+        internal static string tier_callback {
+            get {
+                return ResourceManager.GetString("tier_callback", resourceCulture);
+            }
+        }
     }
 }

+ 28 - 1
CardCollector/Resources/CallbackQueryCommands.resx

@@ -33,10 +33,37 @@
     <data name="sorting" xml:space="preserve">
         <value>Сортировка</value>
     </data>
-    <data name="cancel_menu" xml:space="preserve">
+    <data name="cancel" xml:space="preserve">
         <value>Отмена</value>
     </data>
     <data name="show_stickers" xml:space="preserve">
         <value>Показать стикеры</value>
     </data>
+    <data name="All" xml:space="preserve">
+        <value>Все</value>
+    </data>
+    <data name="back" xml:space="preserve">
+        <value>back</value>
+    </data>
+    <data name="author_callback" xml:space="preserve">
+        <value>author</value>
+    </data>
+    <data name="emoji_callback" xml:space="preserve">
+        <value>emoji</value>
+    </data>
+    <data name="sorting_callback" xml:space="preserve">
+        <value>sorting</value>
+    </data>
+    <data name="tier_callback" xml:space="preserve">
+        <value>tier</value>
+    </data>
+    <data name="previous" xml:space="preserve">
+        <value>←</value>
+    </data>
+    <data name="next" xml:space="preserve">
+        <value>→</value>
+    </data>
+    <data name="change_page" xml:space="preserve">
+        <value>change_page</value>
+    </data>
 </root>

+ 2 - 0
CardCollector/Resources/Constants.cs

@@ -9,6 +9,8 @@ namespace CardCollector.Resources
         public const double SAVING_CHANGES_INTERVAL = DEBUG ? 10 * 1000 : 5 * 60 * 1000;
         /* Время кэширования результатов @имя_бота команд */
         public const int INLINE_RESULTS_CACHE_TIME = 1;
+        /* Включает бесконечные стикеры без наличия их в коллекции */
+        public const bool UNLIMITED_ALL_STICKERS = DEBUG;
 
 
         /* Уровни привилегий пользователей системы */

+ 85 - 8
CardCollector/Resources/Keyboard.cs

@@ -1,4 +1,6 @@
-using Telegram.Bot.Types.ReplyMarkups;
+using System.Collections.Generic;
+using System.Linq;
+using Telegram.Bot.Types.ReplyMarkups;
 
 namespace CardCollector.Resources
 {
@@ -6,18 +8,18 @@ namespace CardCollector.Resources
     public static class Keyboard
     {
         /* Клавиатура, отображаемая вместе с сообщением профиля */
-        public static readonly InlineKeyboardMarkup ProfileKeyboard = new (new[]
+        public static readonly InlineKeyboardMarkup ProfileKeyboard = new(new[]
             {
                 InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.collect_income)
             }
         );
-        
+
         /* Клавиатура, отображаемая с первым сообщением пользователя */
-        public static readonly ReplyKeyboardMarkup Menu = new (new []
+        public static readonly ReplyKeyboardMarkup Menu = new(new[]
         {
-            new KeyboardButton[] { MessageCommands.profile, MessageCommands.collection },
-            new KeyboardButton[] { MessageCommands.shop, MessageCommands.auction },
-        }) { ResizeKeyboard = true };
+            new KeyboardButton[] {MessageCommands.profile, MessageCommands.collection},
+            new KeyboardButton[] {MessageCommands.shop, MessageCommands.auction},
+        }) {ResizeKeyboard = true};
 
         /* Клавиатура меню сортировки */
         public static readonly InlineKeyboardMarkup SortingOptions = new(new[]
@@ -26,8 +28,83 @@ namespace CardCollector.Resources
             new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.tier)},
             new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.emoji)},
             new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.sorting)},
-            new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.cancel_menu)},
+            new[] {InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.cancel)},
             new[] {InlineKeyboardButton.WithSwitchInlineQueryCurrentChat(CallbackQueryCommands.show_stickers)},
         });
+
+
+        /* Возвращает клавиатуру со списоком авторов */
+        public static InlineKeyboardMarkup GetAuthorsKeyboard(List<string> list, int page = 1)
+        {
+            /* Список авторов, отображаемый на текущей странице */
+            var sublist = list.GetRange((page - 1) * 10,
+                list.Count >= page * 10 ? 10 : list.Count % 10);
+            /* Список кнопок на клавиатуре */
+            var keyboardList = new List<InlineKeyboardButton[]>
+            {
+                new[]
+                {
+                    /* Добавляем в список кнопку "Все" */
+                    InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.All,
+                        $"{CallbackQueryCommands.author_callback}=")
+                }
+            };
+            /* Копируем список */
+            var copyList = sublist.ToList();
+            while (copyList.Count > 0)
+            {
+                /* Берем первый элемент и запихиваем его в строку */
+                var author = copyList[0];
+                copyList.RemoveAt(0);
+                var keyRow = new List<InlineKeyboardButton>
+                {
+                    InlineKeyboardButton.WithCallbackData(author,
+                            $"{CallbackQueryCommands.author_callback}={author}")
+                };
+                /* Если есть еще элементы, то добавляем в строку вторую кнопку */
+                if (copyList.Count > 0)
+                {
+                    author = copyList[0];
+                    copyList.RemoveAt(0);
+                    keyRow.Add(InlineKeyboardButton.WithCallbackData(author,
+                            $"{CallbackQueryCommands.author_callback}={author}"));
+                }
+                /* Добавляем строку кнопок в клавиатуру */
+                keyboardList.Add(keyRow.ToArray());
+            }
+
+            /* Если всего авторов больше 10, то добавляем стрелочки */
+            if (list.Count > 10)
+                keyboardList.Add(
+                    sublist.Count switch
+                    {
+                        <10 => new[]
+                        {
+                            InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.previous,
+                                $"{CallbackQueryCommands.change_page}={page - 1}")
+                        },
+                        >=10 when page == 1 => new[]
+                        {
+                            InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.next,
+                                $"{CallbackQueryCommands.change_page}={page + 1}")
+                        },
+                        _ => new[]
+                        {
+                            InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.previous,
+                                $"{CallbackQueryCommands.change_page}={page - 1}"),
+                            InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.next,
+                                $"{CallbackQueryCommands.change_page}={page + 1}")
+                        }
+                    }
+                );
+            /* Добавляем кнопку отмены */
+            keyboardList.Add(new[]
+            {
+                InlineKeyboardButton.WithCallbackData(CallbackQueryCommands.cancel,
+                    CallbackQueryCommands.back)
+            });
+            /* Вовзращаем клавиатуру */
+            return new InlineKeyboardMarkup(keyboardList);
+        }
     }
 }

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

@@ -78,6 +78,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Выберите автора из списка ниже:.
+        /// </summary>
+        internal static string choose_author {
+            get {
+                return ResourceManager.GetString("choose_author", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Текущие примененные фильтры:.
         /// </summary>

+ 3 - 0
CardCollector/Resources/Messages.resx

@@ -45,4 +45,7 @@
     <data name="price" xml:space="preserve">
         <value>Стоимость:</value>
     </data>
+    <data name="choose_author" xml:space="preserve">
+        <value>Выберите автора из списка ниже:</value>
+    </data>
 </root>