Browse Source

Every day alerting about daily tasks

Tigran 3 years ago
parent
commit
fa72ac8254

+ 11 - 0
CardCollector/Bot.cs

@@ -1,6 +1,7 @@
 using System;
 using System.Collections.Generic;
 using System.Threading;
+using System.Threading.Tasks;
 using System.Timers;
 using CardCollector.DataBase;
 using CardCollector.DataBase.EntityDao;
@@ -41,6 +42,9 @@ namespace CardCollector
             _timer.Elapsed += SavingChanges;
             _timer.Elapsed += UserDao.ClearMemory;
             
+            /* Запускаем механизм уведомления */
+            Utilities.SetUpTimer(Constants.DailyTaskAlert, DailyTaskAlert);
+            
             _end.WaitOne();
             Logs.LogOut("Stopping program");
             
@@ -63,5 +67,12 @@ namespace CardCollector
                 await CardCollectorDatabase.SaveAllChangesAsync();
             } catch (Exception) { /*ignored*/ }
         }
+
+        private static async void DailyTaskAlert(object o, ElapsedEventArgs e)
+        {
+            var users = await UserDao.GetAllWhere(user => Task.FromResult(!user.IsBlocked));
+            foreach (var user in users)
+                await SendMessage(user, Messages.daily_task_alertation);
+        }
     }
 }

+ 1 - 1
CardCollector/Commands/CallbackQuery/BuyStickerQuery.cs

@@ -27,7 +27,7 @@ namespace CardCollector.Commands.CallbackQuery
                 await auctionModule.SelectedPosition.BuyCard(auctionModule.Count);
                 if (User.Stickers.ContainsKey(auctionModule.SelectedSticker.Md5Hash))
                     await MessageController.AnswerCallbackQuery(User, CallbackQueryId, 
-                        $"{Messages.you_collected} {await User.Cash.Payout(User.Stickers[auctionModule.SelectedSticker.Md5Hash])}{Text.coin}");
+                        $"{Messages.you_collected} {await User.Cash.Payout(User.Stickers)}{Text.coin}");
                 else
                     await UserStickerRelationDao.AddNew(User, auctionModule.SelectedSticker, auctionModule.Count);
                 User.Cash.Gems -= auctionModule.Price * auctionModule.Count;

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

@@ -26,7 +26,7 @@ namespace CardCollector.Commands.CallbackQuery
                 var result = 0;
                 foreach (var (item, count) in combineModule.CombineList)
                 {
-                    result += await User.Cash.Payout(User.Stickers[item.Md5Hash]);
+                    result += await User.Cash.Payout(User.Stickers);
                     User.Stickers[item.Md5Hash].Count -= count;
                 }
                 await MessageController.AnswerCallbackQuery(User, CallbackQueryId, $"{Messages.you_collected} {result}{Text.coin}");
@@ -36,7 +36,7 @@ namespace CardCollector.Commands.CallbackQuery
                 var author = authors[rnd.Next(authors.Count)];
                 var stickers = await StickerDao.GetListWhere(i => i.Author == author && i.Tier == tier + 1);
                 var sticker = stickers[rnd.Next(stickers.Count)];
-                if (User.Stickers.ContainsKey(sticker.Md5Hash)) await User.Cash.Payout(User.Stickers[sticker.Md5Hash]);
+                if (User.Stickers.ContainsKey(sticker.Md5Hash)) await User.Cash.Payout(User.Stickers);
                 await UserStickerRelationDao.AddNew(User, sticker, 1);
                 var text = $"{Messages.combined_sticker}:\n" + sticker;
                 var stickerMessage = await MessageController.SendSticker(User, sticker.Id);

+ 1 - 1
CardCollector/Commands/CallbackQuery/ConfirmationSellingQuery.cs

@@ -15,7 +15,7 @@ namespace CardCollector.Commands.CallbackQuery
         {
             var collectionModule = User.Session.GetModule<CollectionModule>();
             EnterGemsPriceMessage.RemoveFromQueue(User.Id);
-            var income = await User.Cash.Payout(User.Stickers[collectionModule.SelectedSticker.Md5Hash]);
+            var income = await User.Cash.Payout(User.Stickers);
             await MessageController.AnswerCallbackQuery(User, CallbackQueryId, $"{Messages.you_collected} {income}{Text.coin}");
             User.Stickers[collectionModule.SelectedSticker.Md5Hash].Count -= collectionModule.Count;
             AuctionController.SellCard(User.Id, collectionModule.SelectedSticker.Id, collectionModule.SellPrice, collectionModule.Count);

+ 9 - 3
CardCollector/DataBase/Entity/CashEntity.cs

@@ -22,6 +22,9 @@ namespace CardCollector.DataBase.Entity
         /* Количество алмазов */
         [Column("gems"), MaxLength(32)] public int Gems { get; set; } = 1000;
         
+        /* Размер копилки */
+        [Column("max_capacity"), MaxLength(32)] public int MaxCapacity { get; set; } = 200;
+        
         [NotMapped] private DateTime LastPayout = DateTime.Now;
         
         public async Task<int> CalculateIncome(Dictionary<string, UserStickerRelationEntity> stickers)
@@ -36,16 +39,20 @@ namespace CardCollector.DataBase.Entity
                 if (payoutsCount < 1) continue;
                 var multiplier = payoutsCount * sticker.Count;
                 result += stickerInfo.Income * multiplier;
+                if (result > MaxCapacity) return MaxCapacity;
             }
             return result;
         }
         
         public async Task<int> Payout(Dictionary<string, UserStickerRelationEntity> stickers)
         {
-            return await stickers.Values.SumAsync(async sticker => await Payout(sticker));
+            var result = await stickers.Values.SumAsync(async sticker => await Payout(sticker));
+            result = result > MaxCapacity ? MaxCapacity : result;
+            Coins += result;
+            return result;
         }
         
-        public async Task<int> Payout(UserStickerRelationEntity relation)
+        private async Task<int> Payout(UserStickerRelationEntity relation)
         {
             var stickerInfo = await StickerDao.GetById(relation.StickerId);
             var payoutInterval = DateTime.Now - relation.Payout;
@@ -53,7 +60,6 @@ namespace CardCollector.DataBase.Entity
             if (payoutsCount < 1) return 0;
             relation.Payout += new TimeSpan(0, stickerInfo.IncomeTime, 0) * payoutsCount;
             var result = stickerInfo.Income * payoutsCount * relation.Count;
-            Coins += result;
             return result;
         }
     }

+ 10 - 2
CardCollector/DataBase/EntityDao/UserDao.cs

@@ -1,7 +1,9 @@
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
 using System.Timers;
+using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
 using CardCollector.Session.Modules;
@@ -87,13 +89,19 @@ namespace CardCollector.DataBase.EntityDao
             }
         }
 
-        public static void ClearMemory()
+        public static async void ClearMemory()
         {
-            foreach (var (id, user) in ActiveUsers)
+            foreach (var (id, user) in ActiveUsers.ToDictionary(pair => pair.Key, pair => pair.Value))
             {
                 user.Session.EndSession();
                 ActiveUsers.Remove(id);
+                await MessageController.SendMessage(user, Messages.bot_turning_off);
             }
         }
+
+        public static async Task<IEnumerable<UserEntity>> GetAllWhere(Func<UserEntity, Task<bool>> callback)
+        {
+            return await Table.WhereAsync(callback);
+        }
     }
 }

+ 3 - 0
CardCollector/Resources/Constants.cs

@@ -1,3 +1,5 @@
+using System;
+
 namespace CardCollector.Resources
 {
     public static class Constants
@@ -20,5 +22,6 @@ namespace CardCollector.Resources
         public const int ARTIST_PRIVILEGE_LEVEL = 4;
         public const int SESSION_ACTIVE_PERIOD = DEBUG ? 1 : 60;
         public const int COMBINE_COUNT = 5;
+        public static readonly TimeSpan DailyTaskAlert = new(12, 0, 0);
     }
 }

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

@@ -87,6 +87,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Бот уходит на технический перерыв....
+        /// </summary>
+        internal static string bot_turning_off {
+            get {
+                return ResourceManager.GetString("bot_turning_off", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Невозможно изменить количество!.
         /// </summary>
@@ -222,6 +231,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Не забывайте заходить и выполнять ежедневные задания. Список ежедневных заданий вы можете посмотреть в профиле. Хорошего дня и приятного пользования нашим ботом!.
+        /// </summary>
+        internal static string daily_task_alertation {
+            get {
+                return ResourceManager.GetString("daily_task_alertation", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Удаляю файлы....
         /// </summary>

+ 6 - 0
CardCollector/Resources/Messages.resx

@@ -159,4 +159,10 @@
     <data name="cant_change_count" xml:space="preserve">
         <value>Невозможно изменить количество!</value>
     </data>
+    <data name="bot_turning_off" xml:space="preserve">
+        <value>Бот уходит на технический перерыв...</value>
+    </data>
+    <data name="daily_task_alertation" xml:space="preserve">
+        <value>Не забывайте заходить и выполнять ежедневные задания. Список ежедневных заданий вы можете посмотреть в профиле. Хорошего дня и приятного пользования нашим ботом!</value>
+    </data>
 </root>

+ 15 - 0
CardCollector/Utilities.cs

@@ -2,6 +2,7 @@
 using System.Net;
 using System.Text;
 using System.Threading.Tasks;
+using System.Timers;
 using CardCollector.Resources;
 using Telegram.Bot;
 
@@ -40,5 +41,19 @@ namespace CardCollector
                 client.DownloadFile(new Uri(fileUri), "pack.zip");
             });
         }
+        
+        public static void SetUpTimer(TimeSpan timeToRun, ElapsedEventHandler callback)
+        {
+            var elapsedInterval = timeToRun - DateTime.Now.TimeOfDay;
+            if (elapsedInterval < TimeSpan.Zero) elapsedInterval += new TimeSpan(1, 0, 0, 0);
+            var timer = new Timer
+            {
+                AutoReset = false,
+                Enabled = true,
+                Interval = elapsedInterval.TotalMilliseconds
+            };
+            timer.Elapsed += callback;
+            timer.Elapsed += (_, _) => timer.Dispose();
+        }
     }
 }