浏览代码

Author packs opening

Tigran 3 年之前
父节点
当前提交
921c951af1

+ 22 - 2
CardCollector/Commands/CallbackQuery/AuthorMenuQuery.cs

@@ -1,5 +1,8 @@
-using System.Threading.Tasks;
+using System.Linq;
+using System.Threading.Tasks;
+using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
+using CardCollector.DataBase.EntityDao;
 using CardCollector.Resources;
 using Telegram.Bot.Types;
 
@@ -10,7 +13,24 @@ namespace CardCollector.Commands.CallbackQuery
         protected override string CommandText => Command.author_menu;
         public override async Task Execute()
         {
-            
+            var packs = (await UsersPacksDao.GetUserPacks(User.Id))
+                .Where(item => item.Id != 0 && item.Count > 0)
+                .ToList();
+            if (packs.Count == 0)
+                await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.packs_count_zero, true);
+            else
+            {
+                var page = int.Parse(CallbackData.Split('=')[1]);
+                var low = page * 10 - 10;
+                var up = page * 10;
+                packs = packs.Where((_, index) => index >= low && index < up).ToList();
+                var info = await Task.WhenAll(packs.Select(item => PacksDao.GetById(item.PackId)));
+                if (packs.Count == 0)
+                    await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.page_not_found);
+                else
+                    await MessageController.EditMessage(User, CallbackMessageId, Messages.choose_author,
+                        Keyboard.GetAuthorsKeyboard(packs, info.ToList(), page));
+            }
         }
 
         public AuthorMenuQuery() { }

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

@@ -67,8 +67,6 @@ namespace CardCollector.Commands.CallbackQuery
             new MyPacksQuery(),
             /* Показывает меню по автору */
             new AuthorMenuQuery(),
-            /* Открытие рандомного пака */
-            new OpenRandomQuery(),
             /* Открытие пака автора */
             new OpenPackCallback(),
             /* Команда которая показывает список ежедневных заданий */

+ 46 - 3
CardCollector/Commands/CallbackQuery/OpenPackCallback.cs

@@ -1,5 +1,10 @@
-using System.Threading.Tasks;
+using System;
+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
 {
@@ -9,9 +14,47 @@ namespace CardCollector.Commands.CallbackQuery
         
         public override async Task Execute()
         {
-            await User.ClearChat();
             var packId = int.Parse(CallbackData.Split("=")[1]);
-            
+            var pack = await UsersPacksDao.GetPackInfo(User.Id, packId);
+            var packInfo = await PacksDao.GetById(pack.PackId);
+            if (pack.Count < 1)
+                await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.packs_count_zero, true);
+            else
+            {
+                await User.ClearChat();
+                pack.Count--;
+                var rnd = new Random();
+                var tier = GetTier(rnd.NextDouble() * 100);
+                var stickers = await StickerDao.GetListWhere(item => 
+                    item.Tier == tier && (packId == 0 || item.Author == packInfo.Author));
+                var sticker = stickers[rnd.Next(stickers.Count)];
+                if (User.Stickers.ContainsKey(sticker.Md5Hash))
+                {
+                    await MessageController.AnswerCallbackQuery(User, CallbackQueryId,
+                        $"{Messages.you_collected} {await User.Cash.Payout(User.Stickers)}");
+                    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);
+            }
         }
+
+        private int GetTier(double chance)
+        {
+            return chance switch
+            {
+                < 0.7 => 4,
+                < 3.3 => 3,
+                < 16 => 2,
+                _ => 1
+            };
+        }
+
+        public OpenPackCallback() { }
+        public OpenPackCallback(UserEntity user, Update update) : base(user, update) { }
     }
 }

+ 0 - 63
CardCollector/Commands/CallbackQuery/OpenRandomQuery.cs

@@ -1,63 +0,0 @@
-using System;
-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 OpenRandomQuery : CallbackQuery
-    {
-        protected override string CommandText => Command.open_random;
-
-        public override async Task Execute()
-        {
-            var pack = await UsersPacksDao.GetPackInfo(User.Id, 0);
-            if (pack.Count < 1)
-                await MessageController.AnswerCallbackQuery(User, CallbackQueryId, Messages.packs_count_zero, true);
-            else
-            {
-                await User.ClearChat();
-                pack.Count--;
-                var rnd = new Random();
-                var tier = GetTier(rnd.NextDouble() * 100);
-                var stickers = await StickerDao.GetListWhere(item => item.Tier == tier);
-                var sticker = stickers[rnd.Next(stickers.Count)];
-                if (User.Stickers.ContainsKey(sticker.Md5Hash))
-                {
-                    await MessageController.AnswerCallbackQuery(User, CallbackQueryId,
-                        $"{Messages.you_collected} {await User.Cash.Payout(User.Stickers)}");
-                    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);
-            }
-        }
-
-        private int GetTier(double chance)
-        {
-            return chance switch
-            {
-                < 0.7 => 4,
-                < 3.3 => 3,
-                < 16 => 2,
-                _ => 1
-            };
-        }
-
-        public OpenRandomQuery()
-        {
-        }
-
-        public OpenRandomQuery(UserEntity user, Update update) : base(user, update)
-        {
-        }
-    }
-}

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

@@ -240,15 +240,6 @@ namespace CardCollector.Resources {
             }
         }
         
-        /// <summary>
-        ///   Looks up a localized string similar to AAT.
-        /// </summary>
-        internal static string open_random {
-            get {
-                return ResourceManager.GetString("open_random", resourceCulture);
-            }
-        }
-        
         /// <summary>
         ///   Looks up a localized string similar to AAU.
         /// </summary>

+ 0 - 3
CardCollector/Resources/Command.resx

@@ -111,9 +111,6 @@
     <data name="send_private_sticker" xml:space="preserve">
         <value>AAX</value>
     </data>
-    <data name="open_random" xml:space="preserve">
-        <value>AAT</value>
-    </data>
     <data name="author_menu" xml:space="preserve">
         <value>AAB</value>
     </data>

+ 34 - 2
CardCollector/Resources/Keyboard.cs

@@ -20,8 +20,8 @@ namespace CardCollector.Resources
 
         public static readonly InlineKeyboardMarkup PackMenu = new(new[]
         {
-            new[] {InlineKeyboardButton.WithCallbackData(Text.open_random, Command.open_random)},
-            new[] {InlineKeyboardButton.WithCallbackData(Text.open_author, Command.author_menu)}
+            new[] {InlineKeyboardButton.WithCallbackData(Text.open_random, $"{Command.open_pack}=0")},
+            new[] {InlineKeyboardButton.WithCallbackData(Text.open_author, $"{Command.author_menu}=1")}
         });
 
         public static InlineKeyboardMarkup BackToFilters(string stickerTitle)
@@ -201,6 +201,38 @@ namespace CardCollector.Resources
             return new InlineKeyboardMarkup(keyboardList);
         }
 
+        /* Возвращает клавиатуру со списоком авторов */
+        public static InlineKeyboardMarkup GetAuthorsKeyboard(
+            List<UsersPacksEntity> list, 
+            List<PackEntity> infoList,
+            int page)
+        {
+            /* Список кнопок на клавиатуре */
+            var keyboardList = new List<InlineKeyboardButton[]>();
+            /* Копируем список */
+            foreach (var (item, i) in list.WithIndex())
+            {
+                if (i % 2 == 0) keyboardList.Add(new [] {
+                    InlineKeyboardButton.WithCallbackData($"{infoList[i].Author} {item.Count}{Text.items}",
+                        $"{Command.open_pack}={item.PackId}")
+                });
+                else keyboardList[keyboardList.Count - 1] = new [] {
+                    keyboardList[keyboardList.Count - 1][0],
+                    InlineKeyboardButton.WithCallbackData($"{infoList[i].Author} {item.Count}{Text.items}",
+                        $"{Command.open_pack}={item.PackId}")
+                };
+            }
+            keyboardList.Add(new[] {
+                InlineKeyboardButton.WithCallbackData(Text.previous, $"{Command.author_menu}={page - 1}"),
+                InlineKeyboardButton.WithCallbackData(Text.next, $"{Command.author_menu}={page + 1}")
+            });
+            keyboardList.Add(new[] {
+                InlineKeyboardButton.WithCallbackData(Text.cancel, Command.cancel)
+            });
+            /* Вовзращаем клавиатуру */
+            return new InlineKeyboardMarkup(keyboardList);
+        }
+
         public static InlineKeyboardMarkup GetCollectionStickerKeyboard(CollectionModule module)
         {
             var sticker = module.SelectedSticker;

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

@@ -393,6 +393,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Страница не найдена.
+        /// </summary>
+        internal static string page_not_found {
+            get {
+                return ResourceManager.GetString("page_not_found", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Пожалуйста, введите только эмоцию.
         /// </summary>

+ 3 - 0
CardCollector/Resources/Messages.resx

@@ -189,4 +189,7 @@
     <data name="packs_count_zero" xml:space="preserve">
         <value>У вас недостаточно паков</value>
     </data>
+    <data name="page_not_found" xml:space="preserve">
+        <value>Страница не найдена</value>
+    </data>
 </root>