浏览代码

Plus minus keyboard

Tigran 4 年之前
父节点
当前提交
b5c9c10581

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

@@ -44,6 +44,8 @@ namespace CardCollector.Commands.CallbackQuery
             new CancelCallback(),
             /* Команда отмены */
             new CollectIncomeQuery(),
+            /* Команда для упралвения количеством стикеров */
+            new CountQuery(),
             
             /* Отмена в момент выбора "значения фильтра", не в самом меню */
             new BackToFiltersMenu(),

+ 51 - 0
CardCollector/Commands/CallbackQuery/CountQuery.cs

@@ -0,0 +1,51 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    public class CountQuery : CallbackQuery
+    {
+        protected override string CommandText => Command.count;
+        public override async Task Execute()
+        {
+            var buyPositionCount = User.Session.SelectedSticker.count;
+            var stickerCount = User.Session.State switch
+            {
+                UserState.CollectionMenu => User.Stickers[User.Session.SelectedSticker.Md5Hash].Count,
+                UserState.ShopMenu => await ShopController.GetStickerCount(
+                    User.Session.SelectedSticker.Id),
+                UserState.AuctionMenu => await AuctionController.GetStickerCount(
+                    User.Session.SelectedSticker.Id),
+                _ => 0
+            };
+            if (CallbackData.Contains('+'))
+            {
+                if (buyPositionCount < stickerCount || stickerCount == -1)
+                {
+                    User.Session.SelectedSticker.count++;
+                    await MessageController.EditReplyMarkup(User, CallbackMessageId,
+                        Keyboard.GetStickerKeyboard(User.Session.SelectedSticker, User.Session.State));
+                }
+                else await MessageController.AnswerCallbackQuery(User, 
+                    Update.CallbackQuery!.Id, Messages.cant_increase);
+            }
+            else if (CallbackData.Contains('-'))
+            {
+                if (buyPositionCount > 1)
+                {
+                    User.Session.SelectedSticker.count--;
+                    await MessageController.EditReplyMarkup(User, CallbackMessageId,
+                        Keyboard.GetStickerKeyboard(User.Session.SelectedSticker, User.Session.State));
+                }
+                else await MessageController.AnswerCallbackQuery(User, 
+                    Update.CallbackQuery!.Id, Messages.cant_decrease);
+            }
+        }
+
+        public CountQuery() { }
+        public CountQuery(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -3,6 +3,7 @@ using System.Threading.Tasks;
 using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.DataBase.EntityDao;
+using CardCollector.Others;
 using CardCollector.Resources;
 using Telegram.Bot.Types;
 
@@ -30,7 +31,9 @@ namespace CardCollector.Commands.ChosenInlineResult
                            $"\n{sticker.IncomeCoins}{Text.coin} / {sticker.IncomeGems}{Text.gem} {sticker.IncomeTime}{Text.time}{Text.minutes}";
             if (sticker.Description != "") messageText += $"\n\n{Text.description}: {sticker.Description}";
             var stickerMessage = await MessageController.SendSticker(User, sticker.Id);
-            var infoMessage = await MessageController.SendMessage(User, messageText, Keyboard.GetStickerKeyboard(User, sticker.Md5Hash, sticker.Title));
+            var stickerInfo = new StickerInfo(sticker) {count = 1};
+            User.Session.SelectedSticker = stickerInfo;
+            var infoMessage = await MessageController.SendMessage(User, messageText, Keyboard.GetStickerKeyboard(stickerInfo, User.Session.State));
             User.Session.Messages.Add(stickerMessage.MessageId);
             User.Session.Messages.Add(infoMessage.MessageId);
         }

+ 13 - 0
CardCollector/Controllers/MessageController.cs

@@ -173,6 +173,19 @@ namespace CardCollector.Controllers
             return new TgMessage();
         }
         
+        public static async Task AnswerCallbackQuery(UserEntity user, string callbackQueryId, string text)
+        {
+            try
+            {
+                if (!user.IsBlocked)
+                    await Bot.Client.AnswerCallbackQueryAsync(callbackQueryId, text);
+            }
+            catch (Exception e)
+            {
+                LogOutWarning("Can't answer callbackquery " + e.Message);
+            }
+        }
+        
         /* Метод для удаления сообщения
          user - пользователь, которому необходимо удалить сообщение
          messageId - Id сообщения */

+ 5 - 4
CardCollector/Controllers/ShopController.cs

@@ -1,4 +1,5 @@
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading.Tasks;
 using CardCollector.DataBase.Entity;
 using CardCollector.DataBase.EntityDao;
@@ -9,14 +10,14 @@ namespace CardCollector.Controllers
     {
         public static async Task<int> GetStickerCount(string stickerId)
         {
-            //TODO вернуть количество стикеров в магазине по id
-            return 0;
+            var sticker = await ShopDao.GetSticker(stickerId);
+            return sticker.IsInfinite ? -1 : sticker.Count;
         }
         
         public static async Task<List<StickerEntity>> GetStickers(string filter)
         {
-            //TODO вернуть список стикеров, имеющихся в магазине
-            return await StickerDao.GetAll(filter);
+            var result = await ShopDao.GetAllShopPositions(filter);
+            return result.ToList();
         }
     }
 }

+ 1 - 1
CardCollector/DataBase/CardCollectorDatabase.cs

@@ -31,8 +31,8 @@ namespace CardCollector.DataBase
         public DbSet<CashEntity> CashTable { get; set; }
         public DbSet<UserStickerRelationEntity> UserStickerRelations { get; set; }
         public DbSet<StickerEntity> Stickers { get; set; }
-        
         public DbSet<AuctionEntity> Auction { get; set; }
+        public DbSet<ShopEntity> Shop { get; set; }
 
         
         /* Конфигурация подключения к БД */

+ 0 - 104
CardCollector/DataBase/Entity/UserEntity.Sesion.cs

@@ -1,104 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading.Tasks;
-using CardCollector.Controllers;
-using CardCollector.DataBase.EntityDao;
-using CardCollector.Resources;
-
-namespace CardCollector.DataBase.Entity
-{
-    public partial class UserEntity
-    {
-        public class UserSession
-        {
-            private DateTime _lastAccess = DateTime.Now;
-            
-            private readonly UserEntity user;
-            public UserSession(UserEntity user)
-            {
-                this.user = user;
-            }
-            /* Текущее состояние пользователя */
-            public UserState State = UserState.Default;
-
-            public void UpdateLastAccess()
-            {
-                _lastAccess = DateTime.Now;
-            }
-
-            public int GetLastAccessInterval()
-            {
-                return (int)(DateTime.Now - _lastAccess).TotalMinutes;
-            }
-            
-            /* Фильтры, примененные пользователем в меню коллекции/магазина/аукциона */
-            public readonly Dictionary<string, object> Filters = new()
-            {
-                {Command.author, ""},
-                {Command.tier, -1},
-                {Command.emoji, ""},
-                {Command.price_coins_from, 0},
-                {Command.price_coins_to, 0},
-                {Command.price_gems_from, 0},
-                {Command.price_gems_to, 0},
-                {Command.sort, SortingTypes.None},
-            };
-            
-            /* Сообщения в чате пользователя */
-            public readonly List<int> Messages = new();
-
-            /* Прибыль, которую может получить пользователь, подсчитывается во время команды профиля */
-            public int IncomeCoins;
-            public int IncomeGems;
-            private DateTime LastPayout;
-
-            public async Task ClearMessages()
-            {
-                foreach (var messageId in Messages)
-                    await MessageController.DeleteMessage(user, messageId);
-                Messages.Clear();
-            }
-
-            public async Task CalculateIncome()
-            {
-                IncomeCoins = 0;
-                IncomeGems = 0;
-                LastPayout = DateTime.Now;
-                foreach (var sticker in user.Stickers.Values)
-                {
-                    var stickerInfo = await StickerDao.GetStickerByHash(sticker.ShortHash);
-                    var payoutInterval = LastPayout - sticker.Payout;
-                    var payoutsCount = (int)(payoutInterval.TotalMinutes / stickerInfo.IncomeTime);
-                    if (payoutsCount < 1) continue;
-                    var multiplier = payoutsCount * sticker.Count;
-                    IncomeCoins += stickerInfo.IncomeCoins * multiplier;
-                    IncomeGems += stickerInfo.IncomeGems * multiplier;
-                }
-            }
-
-            public async Task PayOut()
-            {
-                IncomeCoins = 0;
-                IncomeGems = 0;
-                foreach (var sticker in user.Stickers.Values)
-                {
-                    var stickerInfo = await StickerDao.GetStickerByHash(sticker.ShortHash);
-                    var payoutInterval = LastPayout - sticker.Payout;
-                    var payoutsCount = (int)(payoutInterval.TotalMinutes / stickerInfo.IncomeTime);
-                    if (payoutsCount < 1) continue;
-                    var multiplier = payoutsCount * sticker.Count;
-                    sticker.Payout += new TimeSpan(0, stickerInfo.IncomeTime, 0) * payoutsCount;
-                    IncomeCoins += stickerInfo.IncomeCoins * multiplier;
-                    IncomeGems += stickerInfo.IncomeGems * multiplier;
-                }
-                user.Cash.Coins += IncomeCoins;
-                user.Cash.Gems += IncomeGems;
-            }
-
-            public async void EndSession()
-            {
-                await ClearMessages();
-            }
-        }
-    }
-}

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

@@ -4,6 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema;
 using System.Threading.Tasks;
 using CardCollector.Controllers;
 using CardCollector.DataBase.EntityDao;
+using CardCollector.Others;
 using CardCollector.Resources;
 using Telegram.Bot.Types.InlineQueryResults;
 
@@ -49,12 +50,13 @@ namespace CardCollector.DataBase.Entity
         {
             var state = Session.State;
             /* Получаем список стикеров исходя из того, нужно ли для отладки получить бесконечные стикеры */
-            var stickersList = Constants.UNLIMITED_ALL_STICKERS
-                ? await StickerDao.GetAll(filter) : state switch
+            var stickersList = state switch
                 {
                     UserState.AuctionMenu => await AuctionController.GetStickers(filter),
                     UserState.ShopMenu => await ShopController.GetStickers(filter),
-                    _ => await Stickers.ToStickers(filter),
+                    _ => Constants.UNLIMITED_ALL_STICKERS 
+                        ? await StickerDao.GetAll(filter)
+                        : await Stickers.ToStickers(filter),
                 };
             /* Если пользовательская сортировка не применена, то возвращаем реультат */
             if (!userFilterEnabled || state == UserState.Default) 

+ 28 - 0
CardCollector/DataBase/EntityDao/ShopDao.cs

@@ -0,0 +1,28 @@
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using CardCollector.DataBase.Entity;
+using Microsoft.EntityFrameworkCore;
+
+namespace CardCollector.DataBase.EntityDao
+{
+    public static class ShopDao
+    {
+        private static readonly DbSet<ShopEntity> Table = CardCollectorDatabase.Instance.Shop;
+
+        public static async Task<IEnumerable<StickerEntity>> GetAllShopPositions(string filter = "")
+        {
+            var entityList = Table
+                .Where(e => e.Count > 0 || e.IsInfinite)
+                .Select(e => e.StickerId)
+                .ToHashSet();
+            var stickersList = await StickerDao.GetAll(filter);
+            return stickersList.Where(e => entityList.Contains(e.Id));
+        }
+
+        public static async Task<ShopEntity> GetSticker(string stickerId)
+        {
+            return await Table.FirstAsync(e => e.StickerId == stickerId);
+        }
+    }
+}

+ 114 - 0
CardCollector/Others/Session.cs

@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.DataBase.EntityDao;
+using CardCollector.Resources;
+
+namespace CardCollector.Others
+{
+    public class UserSession : IDisposable
+    {
+        private DateTime _lastAccess = DateTime.Now;
+
+        private readonly UserEntity user;
+
+        public UserSession(UserEntity user)
+        {
+            this.user = user;
+        }
+
+        /* Текущее состояние пользователя */
+        public UserState State = UserState.Default;
+        
+        /* Выбранный пользователем стикер для покупки (продажи, слияния) */
+        public StickerInfo SelectedSticker { get; set; }
+
+        public void UpdateLastAccess()
+        {
+            _lastAccess = DateTime.Now;
+        }
+
+        public int GetLastAccessInterval()
+        {
+            return (int) (DateTime.Now - _lastAccess).TotalMinutes;
+        }
+
+        /* Фильтры, примененные пользователем в меню коллекции/магазина/аукциона */
+        public readonly Dictionary<string, object> Filters = new()
+        {
+            {Command.author, ""},
+            {Command.tier, -1},
+            {Command.emoji, ""},
+            {Command.price_coins_from, 0},
+            {Command.price_coins_to, 0},
+            {Command.price_gems_from, 0},
+            {Command.price_gems_to, 0},
+            {Command.sort, SortingTypes.None},
+        };
+
+        /* Сообщения в чате пользователя */
+        public readonly List<int> Messages = new();
+
+        /* Прибыль, которую может получить пользователь, подсчитывается во время команды профиля */
+        public int IncomeCoins;
+        public int IncomeGems;
+        private DateTime LastPayout;
+
+        public async Task ClearMessages()
+        {
+            foreach (var messageId in Messages)
+                await MessageController.DeleteMessage(user, messageId);
+            Messages.Clear();
+        }
+
+        public async Task CalculateIncome()
+        {
+            IncomeCoins = 0;
+            IncomeGems = 0;
+            LastPayout = DateTime.Now;
+            foreach (var sticker in user.Stickers.Values)
+            {
+                var stickerInfo = await StickerDao.GetStickerByHash(sticker.ShortHash);
+                var payoutInterval = LastPayout - sticker.Payout;
+                var payoutsCount = (int) (payoutInterval.TotalMinutes / stickerInfo.IncomeTime);
+                if (payoutsCount < 1) continue;
+                var multiplier = payoutsCount * sticker.Count;
+                IncomeCoins += stickerInfo.IncomeCoins * multiplier;
+                IncomeGems += stickerInfo.IncomeGems * multiplier;
+            }
+        }
+
+        public async Task PayOut()
+        {
+            IncomeCoins = 0;
+            IncomeGems = 0;
+            foreach (var sticker in user.Stickers.Values)
+            {
+                var stickerInfo = await StickerDao.GetStickerByHash(sticker.ShortHash);
+                var payoutInterval = LastPayout - sticker.Payout;
+                var payoutsCount = (int) (payoutInterval.TotalMinutes / stickerInfo.IncomeTime);
+                if (payoutsCount < 1) continue;
+                var multiplier = payoutsCount * sticker.Count;
+                sticker.Payout += new TimeSpan(0, stickerInfo.IncomeTime, 0) * payoutsCount;
+                IncomeCoins += stickerInfo.IncomeCoins * multiplier;
+                IncomeGems += stickerInfo.IncomeGems * multiplier;
+            }
+            user.Cash.Coins += IncomeCoins;
+            user.Cash.Gems += IncomeGems;
+        }
+
+        public async void EndSession()
+        {
+            await ClearMessages();
+            
+        }
+        
+        public void Dispose()
+        {
+            EndSession();
+            GC.SuppressFinalize(this);
+        }
+    }
+}

+ 26 - 0
CardCollector/Others/StickerInfo.cs

@@ -0,0 +1,26 @@
+using CardCollector.DataBase.Entity;
+
+namespace CardCollector.Others
+{
+    /* Класс-расщирение, который может содержать дополнительную информацию о стикере */
+    public class StickerInfo : StickerEntity
+    {
+        public StickerInfo(StickerEntity entity)
+        {
+            Id = entity.Id;
+            Title = entity.Title;
+            Author = entity.Author;
+            IncomeCoins = entity.IncomeCoins;
+            IncomeGems = entity.IncomeGems;
+            IncomeTime = entity.IncomeTime;
+            PriceCoins = entity.PriceCoins;
+            PriceGems = entity.PriceGems;
+            Tier = entity.Tier;
+            Emoji = entity.Emoji;
+            Description = entity.Description;
+            Md5Hash = entity.Md5Hash;
+        }
+        
+        public int count;
+    }
+}

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

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

+ 3 - 0
CardCollector/Resources/Command.resx

@@ -78,4 +78,7 @@
     <data name="sell_on_auction" xml:space="preserve">
         <value>sell</value>
     </data>
+    <data name="count" xml:space="preserve">
+        <value>count</value>
+    </data>
 </root>

+ 10 - 9
CardCollector/Resources/Keyboard.cs

@@ -1,6 +1,7 @@
 using System.Collections.Generic;
 using System.Linq;
 using CardCollector.DataBase.Entity;
+using CardCollector.Others;
 using Telegram.Bot.Types.ReplyMarkups;
 
 namespace CardCollector.Resources
@@ -172,27 +173,27 @@ namespace CardCollector.Resources
             return new InlineKeyboardMarkup(keyboardList);
         }
 
-        public static InlineKeyboardMarkup GetStickerKeyboard(UserEntity user, string hash, string query)
+        public static InlineKeyboardMarkup GetStickerKeyboard(StickerInfo stickerInfo, UserState state)
         {
-            return user.Session.State switch
+            return state switch
             {
                 UserState.AuctionMenu or UserState.ShopMenu => new InlineKeyboardMarkup(new[] {
                     new[]
                     {
-                        InlineKeyboardButton.WithCallbackData(Text.buy, $"{Command.buy_sticker}={hash}"),
-                        InlineKeyboardButton.WithCallbackData(Text.buy, $"{Command.buy_sticker}={hash}"),
-                        InlineKeyboardButton.WithCallbackData(Text.buy, $"{Command.buy_sticker}={hash}"),
+                        InlineKeyboardButton.WithCallbackData(Text.minus, $"{Command.count}-"),
+                        InlineKeyboardButton.WithCallbackData($"{Text.buy} ({stickerInfo.count})", $"{Command.buy_sticker}={stickerInfo.Md5Hash}"),
+                        InlineKeyboardButton.WithCallbackData(Text.plus, $"{Command.count}+"),
                     },
                     new[] {InlineKeyboardButton.WithCallbackData(Text.back, $"{Command.back}={Command.clear_chat}")},
                 }),
                 UserState.CollectionMenu => new InlineKeyboardMarkup(new[] {
-                    new[] {InlineKeyboardButton.WithSwitchInlineQuery(Text.send_sticker, query)},
-                    new[] {InlineKeyboardButton.WithCallbackData(Text.sell_on_auction, $"{Command.sell_on_auction}={hash}")},
-                    new[] {InlineKeyboardButton.WithCallbackData(Text.combine, $"{Command.combine}={hash}")},
+                    new[] {InlineKeyboardButton.WithSwitchInlineQuery(Text.send_sticker, stickerInfo.Title)},
+                    new[] {InlineKeyboardButton.WithCallbackData(Text.sell_on_auction, $"{Command.sell_on_auction}={stickerInfo.Md5Hash}")},
+                    new[] {InlineKeyboardButton.WithCallbackData(Text.combine, $"{Command.combine}={stickerInfo.Md5Hash}")},
                     new[] {InlineKeyboardButton.WithCallbackData(Text.back, $"{Command.back}={Command.clear_chat}")},
                 }),
                 _ => new InlineKeyboardMarkup(new[] {
-                    new[] {InlineKeyboardButton.WithSwitchInlineQuery(Text.send_sticker, query)},
+                    new[] {InlineKeyboardButton.WithSwitchInlineQuery(Text.send_sticker, stickerInfo.Title)},
                     new[] {InlineKeyboardButton.WithCallbackData(Text.back, Command.clear_chat)},
                 }),
             };

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

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

+ 6 - 0
CardCollector/Resources/Messages.resx

@@ -105,4 +105,10 @@
     <data name="your_cash" xml:space="preserve">
         <value>Ваш баланс</value>
     </data>
+    <data name="cant_increase" xml:space="preserve">
+        <value>Невозможно увеличить количество стикеров!</value>
+    </data>
+    <data name="cant_decrease" xml:space="preserve">
+        <value>Невозможно уменьшить количество стикеров!</value>
+    </data>
 </root>

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

@@ -240,6 +240,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to -.
+        /// </summary>
+        internal static string minus {
+            get {
+                return ResourceManager.GetString("minus", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to мин.
         /// </summary>
@@ -267,6 +276,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to +.
+        /// </summary>
+        internal static string plus {
+            get {
+                return ResourceManager.GetString("plus", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to ←.
         /// </summary>

+ 6 - 0
CardCollector/Resources/Text.resx

@@ -129,4 +129,10 @@
     <data name="error" xml:space="preserve">
         <value>/error</value>
     </data>
+    <data name="plus" xml:space="preserve">
+        <value>+</value>
+    </data>
+    <data name="minus" xml:space="preserve">
+        <value>-</value>
+    </data>
 </root>