فهرست منبع

payouts complete

Tigran 4 سال پیش
والد
کامیت
855982c16a

+ 11 - 4
CardCollector/Bot.cs

@@ -1,10 +1,10 @@
 using System;
-using System.Threading.Tasks;
+using System.Collections.Generic;
 using System.Timers;
 using CardCollector.DataBase;
 using CardCollector.Resources;
-using Microsoft.EntityFrameworkCore;
 using Telegram.Bot;
+using Telegram.Bot.Types;
 using CancellationTokenSource = System.Threading.CancellationTokenSource;
 
 namespace CardCollector
@@ -14,12 +14,19 @@ namespace CardCollector
     {
         private static TelegramBotClient _client;
         public static TelegramBotClient Client => _client ??= new TelegramBotClient(AppSettings.TOKEN);
-        
+
+        private static readonly IEnumerable<BotCommand> _commands = new[]
+        {
+            new BotCommand {Command = "/menu", Description = "Показать меню"},
+            new BotCommand {Command = "/help", Description = "Показать информацию"},
+            new BotCommand {Command = "/error", Description = "Сообщить об ошибке"},
+        };
+
         public static void Main(string[] args)
         {
             var cts = new CancellationTokenSource();
             Client.StartReceiving(HandleUpdateAsync, HandleErrorAsync, cancellationToken: cts.Token);
-            
+            Client.SetMyCommandsAsync(_commands, BotCommandScope.AllPrivateChats());
             RunMemoryCleaner();
             
             Console.ReadLine();

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

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

+ 27 - 0
CardCollector/Commands/CallbackQuery/CollectIncomeQuery.cs

@@ -0,0 +1,27 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.CallbackQuery
+{
+    public class CollectIncomeQuery : 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, 
+                $"{Messages.you_collected}: " +
+                $"{User.Session.IncomeCoins}{Text.coin} " +
+                $"{User.Session.IncomeGems}{Text.gem}", true);
+        }
+
+        public CollectIncomeQuery() { }
+
+        public CollectIncomeQuery(UserEntity user, Update update) : base(user, update) { }
+    }
+}

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

@@ -32,6 +32,8 @@ namespace CardCollector.Commands.Message
                 new ProfileMessage(),
                 // Команда "/start"
                 new StartMessage(),
+                // Команда "/menu"
+                new MenuMessage(),
                 // Команда "Коллекция"
                 new CollectionMessage(),
                 // Команда "Магазин"

+ 22 - 0
CardCollector/Commands/Message/TextMessage/MenuMessage.cs

@@ -0,0 +1,22 @@
+using System.Threading.Tasks;
+using CardCollector.Controllers;
+using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
+using Telegram.Bot.Types;
+
+namespace CardCollector.Commands.Message.TextMessage
+{
+    public class MenuMessage : Message
+    {
+        protected override string CommandText => Text.menu;
+        public override async Task Execute()
+        {
+            /* Отправляем пользователю сообщение со стандартной клавиатурой */
+            var message = await MessageController.SendMessage(User, Messages.menu_message, Keyboard.Menu);
+            User.Session.Messages.Add(message.MessageId);
+        }
+
+        public MenuMessage() { }
+        public MenuMessage(UserEntity user, Update update) : base(user, update) { }
+    }
+}

+ 6 - 11
CardCollector/Commands/Message/TextMessage/ProfileMessage.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.Message.TextMessage
@@ -14,24 +13,20 @@ namespace CardCollector.Commands.Message.TextMessage
         protected override string CommandText => Text.profile;
         public override async Task Execute()
         {
-            /* Открепляем все закрепы */
-            await Bot.Client.UnpinAllChatMessages(User.ChatId);
-            /* Удаляем предыдущее сообщение профиля пользователя */
-            if (User.CurrentProfileMessageId != default) await MessageController.DeleteMessage(User, User.CurrentProfileMessageId);
+            /* Подсчитываем прибыль */
+            await User.Session.CalculateIncome();
             /* Отправляем сообщение */
             var message = await MessageController.SendMessage(User, 
                 /* Имя пользователя */
                 $"{User.Username}\n" +
                 /* Количество монет */
-                $"Монеты: {User.Cash.Coins}\n" +
+                $"{Messages.coins}: {User.Cash.Coins}{Text.coin}\n" +
                 /* Количество алмазов */
-                $"Алмазы: {User.Cash.Gems}",
+                $"{Messages.gems}: {User.Cash.Gems}{Text.gem}",
                 /* Клавиатура профиля */
-                Keyboard.ProfileKeyboard);
+                Keyboard.GetProfileKeyboard(User));
             /* Записываем id нового сообщения */
-            User.CurrentProfileMessageId = message.MessageId;
-            /* Закрепляем новое сообщение профиля */
-            await Bot.Client.PinChatMessageAsync(User.ChatId, message.MessageId, true);
+            User.Session.Messages.Add(message.MessageId);
         }
         
         public ProfileMessage() { }

+ 0 - 3
CardCollector/Commands/Message/TextMessage/StartMessage.cs

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

+ 51 - 2
CardCollector/DataBase/Entity/UserEntity.Sesion.cs

@@ -1,6 +1,8 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Threading.Tasks;
 using CardCollector.Controllers;
+using CardCollector.DataBase.EntityDao;
 using CardCollector.Resources;
 
 namespace CardCollector.DataBase.Entity
@@ -9,6 +11,11 @@ namespace CardCollector.DataBase.Entity
     {
         public class UserSession
         {
+            private readonly UserEntity user;
+            public UserSession(UserEntity user)
+            {
+                this.user = user;
+            }
             /* Текущее состояние пользователя */
             public UserState State = UserState.Default;
 
@@ -28,12 +35,54 @@ namespace CardCollector.DataBase.Entity
             /* Сообщения в чате пользователя */
             public readonly List<int> Messages = new();
 
-            public async Task ClearMessages(UserEntity user)
+            /* Прибыль, которую может получить пользователь, подсчитывается во время команды профиля */
+            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 = payoutInterval.Minutes / 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 = payoutInterval.Minutes / stickerInfo.IncomeTime;
+                    if (payoutsCount < 1) continue;
+                    var multiplier = payoutsCount * sticker.Count;
+                    var prevDate = sticker.Payout;
+                    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;
+            }
         }
     }
 }

+ 7 - 4
CardCollector/DataBase/Entity/UserEntity.cs

@@ -29,8 +29,6 @@ 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; }
         
@@ -38,12 +36,12 @@ namespace CardCollector.DataBase.Entity
         [NotMapped] public Dictionary<string, UserStickerRelationEntity> Stickers { get; set; }
         
         /* Данные, хранящиеся в рамках одной сессии */
-        [NotMapped] public readonly UserSession Session = new ();
+        [NotMapped] public readonly UserSession Session;
 
         /* Удаляет из чата все сообщения, добавленные в список выше */
         public async Task ClearChat()
         {
-            await Session.ClearMessages(this);
+            await Session.ClearMessages();
         }
         
         /* Возвращает стикеры в виде объектов телеграм */
@@ -63,5 +61,10 @@ namespace CardCollector.DataBase.Entity
                 return stickersList.ToTelegramResults(command);
             return Session.Filters.ApplyTo(stickersList, state).ToTelegramResults(command);
         }
+
+        public UserEntity()
+        {
+            Session = new UserSession(this);
+        }
     }
 }

+ 13 - 6
CardCollector/Resources/Keyboard.cs

@@ -8,12 +8,6 @@ namespace CardCollector.Resources
     /* В данном классе содержатся все клавиатуры, используемые в проекте */
     public static class Keyboard
     {
-        /* Клавиатура, отображаемая вместе с сообщением профиля */
-        public static readonly InlineKeyboardMarkup ProfileKeyboard = new(new[]
-            {
-                InlineKeyboardButton.WithCallbackData(Text.collect_income, Command.collect_income)
-            }
-        );
 
         /* Клавиатура, отображаемая с первым сообщением пользователя */
         public static readonly ReplyKeyboardMarkup Menu = new(new[]
@@ -203,5 +197,18 @@ namespace CardCollector.Resources
                 }),
             };
         }
+        
+        /* Клавиатура, отображаемая вместе с сообщением профиля */
+        public static InlineKeyboardMarkup GetProfileKeyboard(UserEntity user)
+        {
+            var keyboard = new List<InlineKeyboardButton[]>
+            {
+                new[] {InlineKeyboardButton.WithCallbackData(
+                    $"{Text.collect} {user.Session.IncomeCoins}{Text.coin} {user.Session.IncomeGems}{Text.gem}", 
+                    Command.collect_income)},
+            };
+            
+            return new InlineKeyboardMarkup(keyboard);
+        }
     }
 }

+ 46 - 1
CardCollector/Resources/Messages.Designer.cs

@@ -114,6 +114,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Монеты.
+        /// </summary>
+        internal static string coins {
+            get {
+                return ResourceManager.GetString("coins", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Текущие примененные фильтры:.
         /// </summary>
@@ -168,6 +177,24 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Алмазы.
+        /// </summary>
+        internal static string gems {
+            get {
+                return ResourceManager.GetString("gems", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Вы можете выбрать одну из опций ниже.
+        /// </summary>
+        internal static string menu_message {
+            get {
+                return ResourceManager.GetString("menu_message", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Пожалуйста, введите только эмоцию.
         /// </summary>
@@ -214,7 +241,7 @@ namespace CardCollector.Resources {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Приветственное сообщение.
+        ///   Looks up a localized string similar to Добро пожаловать! Этот бот позволяет вам коллекционировать стикеры. Вы можете выбрать одну из опций ниже. Напишите /help, чтобы получить подробную справку..
         /// </summary>
         internal static string start_message {
             get {
@@ -240,6 +267,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Несобранная прибыль.
+        /// </summary>
+        internal static string uncllected_income {
+            get {
+                return ResourceManager.GetString("uncllected_income", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Произошла неожиданная ошибка, попробуйте еще раз..
         /// </summary>
@@ -266,5 +302,14 @@ namespace CardCollector.Resources {
                 return ResourceManager.GetString("upload_file", resourceCulture);
             }
         }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Вы получили.
+        /// </summary>
+        internal static string you_collected {
+            get {
+                return ResourceManager.GetString("you_collected", resourceCulture);
+            }
+        }
     }
 }

+ 16 - 1
CardCollector/Resources/Messages.resx

@@ -19,7 +19,7 @@
         <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>
+        <value>Добро пожаловать! Этот бот позволяет вам коллекционировать стикеры. Вы можете выбрать одну из опций ниже. Напишите /help, чтобы получить подробную справку.</value>
     </data>
     <data name="current_filters" xml:space="preserve">
         <value>Текущие примененные фильтры:</value>
@@ -87,4 +87,19 @@
     <data name="unexpected_exception" xml:space="preserve">
         <value>Произошла неожиданная ошибка, попробуйте еще раз.</value>
     </data>
+    <data name="coins" xml:space="preserve">
+        <value>Монеты</value>
+    </data>
+    <data name="gems" xml:space="preserve">
+        <value>Алмазы</value>
+    </data>
+    <data name="uncllected_income" xml:space="preserve">
+        <value>Несобранная прибыль</value>
+    </data>
+    <data name="you_collected" xml:space="preserve">
+        <value>Вы получили</value>
+    </data>
+    <data name="menu_message" xml:space="preserve">
+        <value>Вы можете выбрать одну из опций ниже</value>
+    </data>
 </root>

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

@@ -123,6 +123,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Собрать.
+        /// </summary>
+        internal static string collect {
+            get {
+                return ResourceManager.GetString("collect", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Собрать прибыль.
         /// </summary>
@@ -186,6 +195,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to /error.
+        /// </summary>
+        internal static string error {
+            get {
+                return ResourceManager.GetString("error", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to От.
         /// </summary>
@@ -204,6 +222,24 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to /help.
+        /// </summary>
+        internal static string help {
+            get {
+                return ResourceManager.GetString("help", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to /menu.
+        /// </summary>
+        internal static string menu {
+            get {
+                return ResourceManager.GetString("menu", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to мин.
         /// </summary>

+ 12 - 0
CardCollector/Resources/Text.resx

@@ -117,4 +117,16 @@
     <data name="sell_on_auction" xml:space="preserve">
         <value>Выставить на аукцион</value>
     </data>
+    <data name="collect" xml:space="preserve">
+        <value>Собрать</value>
+    </data>
+    <data name="menu" xml:space="preserve">
+        <value>/menu</value>
+    </data>
+    <data name="help" xml:space="preserve">
+        <value>/help</value>
+    </data>
+    <data name="error" xml:space="preserve">
+        <value>/error</value>
+    </data>
 </root>