Browse Source

Add clearing memory, when user is inactive

Tigran 4 năm trước cách đây
mục cha
commit
d888f75225

+ 2 - 0
CardCollector/Bot.cs

@@ -2,6 +2,7 @@ using System;
 using System.Collections.Generic;
 using System.Timers;
 using CardCollector.DataBase;
+using CardCollector.DataBase.EntityDao;
 using CardCollector.Resources;
 using Telegram.Bot;
 using Telegram.Bot.Types;
@@ -42,6 +43,7 @@ namespace CardCollector
                 Interval = Constants.SAVING_CHANGES_INTERVAL
             };
             timer.Elapsed += SavingChanges;
+            timer.Elapsed += UserDao.ClearMemory;
         }
 
         private static async void SavingChanges(object o, ElapsedEventArgs e)

+ 1 - 0
CardCollector/Commands/UpdateModel.cs

@@ -32,6 +32,7 @@ namespace CardCollector.Commands
         protected UpdateModel(UserEntity user, Update update)
         {
             User = user;
+            user.Session.UpdateLastAccess();
             Update = update;
         }
     }

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

@@ -11,6 +11,8 @@ namespace CardCollector.DataBase.Entity
     {
         public class UserSession
         {
+            private DateTime _lastAccess = DateTime.Now;
+            
             private readonly UserEntity user;
             public UserSession(UserEntity user)
             {
@@ -19,6 +21,16 @@ namespace CardCollector.DataBase.Entity
             /* Текущее состояние пользователя */
             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()
             {
@@ -56,7 +68,7 @@ namespace CardCollector.DataBase.Entity
                 {
                     var stickerInfo = await StickerDao.GetStickerByHash(sticker.ShortHash);
                     var payoutInterval = LastPayout - sticker.Payout;
-                    var payoutsCount = (int)(payoutInterval.TotalSeconds / stickerInfo.IncomeTime / 60);
+                    var payoutsCount = (int)(payoutInterval.TotalMinutes / stickerInfo.IncomeTime);
                     if (payoutsCount < 1) continue;
                     var multiplier = payoutsCount * sticker.Count;
                     IncomeCoins += stickerInfo.IncomeCoins * multiplier;
@@ -72,7 +84,7 @@ namespace CardCollector.DataBase.Entity
                 {
                     var stickerInfo = await StickerDao.GetStickerByHash(sticker.ShortHash);
                     var payoutInterval = LastPayout - sticker.Payout;
-                    var payoutsCount = (int)(payoutInterval.TotalSeconds / stickerInfo.IncomeTime / 60);
+                    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;
@@ -82,6 +94,11 @@ namespace CardCollector.DataBase.Entity
                 user.Cash.Coins += IncomeCoins;
                 user.Cash.Gems += IncomeGems;
             }
+
+            public async void EndSession()
+            {
+                await ClearMessages();
+            }
         }
     }
 }

+ 14 - 0
CardCollector/DataBase/EntityDao/UserDao.cs

@@ -1,6 +1,8 @@
 using System.Collections.Generic;
 using System.Threading.Tasks;
+using System.Timers;
 using CardCollector.DataBase.Entity;
+using CardCollector.Resources;
 using Microsoft.EntityFrameworkCore;
 using Telegram.Bot.Types;
 
@@ -54,5 +56,17 @@ namespace CardCollector.DataBase.EntityDao
             var result = await Table.AddAsync(userEntity);
             return result.Entity;
         }
+
+        public static void ClearMemory(object sender, ElapsedEventArgs e)
+        {
+            foreach (var (id, user) in ActiveUsers)
+            {
+                if (user.Session.GetLastAccessInterval() > Constants.SESSION_ACTIVE_PERIOD)
+                {
+                    user.Session.EndSession();
+                    ActiveUsers.Remove(id);
+                }
+            }
+        }
     }
 }

+ 1 - 0
CardCollector/Resources/Constants.cs

@@ -18,5 +18,6 @@ namespace CardCollector.Resources
         public const int ADMIN_PRIVILEGE_LEVEL = 9;
         public const int PROGRAMMER_PRIVILEGE_LEVEL = 5;
         public const int ARTIST_PRIVILEGE_LEVEL = 4;
+        public const int SESSION_ACTIVE_PERIOD = DEBUG ? 1 : 60;
     }
 }