Explorar el Código

Fix null user bug

Tigran hace 4 años
padre
commit
139a9c630d

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

@@ -23,13 +23,13 @@ namespace CardCollector.Commands.CallbackQuery
             try
             {
                 // Текст команды
-                var command = update.CallbackQuery.Data;
+                var command = update.CallbackQuery!.Data;
 
                 // Объект пользователя
-                var user = await UserDao.GetOrAddNew(update.CallbackQuery.From);
+                var user = await UserDao.GetUser(update.CallbackQuery.From);
 
                 // Добавляем сообщения пользователя в пул для удаления
-                MessageController.AddNewMessageToPool(user, update.CallbackQuery.Message.MessageId);
+                MessageController.AddNewMessageToPool(user, update.CallbackQuery!.Message!.MessageId);
 
                 // Возвращаем объект, если команда совпала
                 foreach (var item in List.Where(item => item.IsMatches(command)))

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

@@ -5,7 +5,6 @@ using System.Collections.Generic;
 using System.Linq;
 using CardCollector.DataBase.Entity;
 using CardCollector.DataBase.EntityDao;
-using CardCollector.Resources;
 using Telegram.Bot.Types;
 
 namespace CardCollector.Commands.Message
@@ -25,11 +24,9 @@ namespace CardCollector.Commands.Message
             {
                 // Текст команды
                 var command = update.Message!.Text;
-            
-                // Id пользователя, отправившего команду
-                var userId = update.Message!.From!.Id;
+                
                 // Объект пользователя
-                var user = await UserDao.GetById(userId) ?? await UserDao.AddNew(update.Message.From);
+                var user = await UserDao.GetUser(update.Message.From);
             
                 // Добавляем сообщения пользователя в пул для удаления
                 MessageController.AddNewMessageToPool(user, update.Message.MessageId);

+ 7 - 8
CardCollector/Commands/MyChatMember/MyChatMember.cs

@@ -1,5 +1,4 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
 using CardCollector.DataBase.Entity;
 using CardCollector.DataBase.EntityDao;
 using Telegram.Bot.Types;
@@ -16,10 +15,10 @@ namespace CardCollector.Commands.MyChatMember
             switch (_status)
             {
                 case ChatMemberStatus.Creator:
-                    await UserDao.GetOrAddNew(ChatToUser(Update.MyChatMember.Chat));
+                    await UserDao.GetUser(ChatToUser(Update.MyChatMember!.Chat));
                     break;
                 case ChatMemberStatus.Administrator:
-                    await UserDao.GetOrAddNew(ChatToUser(Update.MyChatMember.Chat));
+                    await UserDao.GetUser(ChatToUser(Update.MyChatMember!.Chat));
                     break;
                 case ChatMemberStatus.Member:
                     User.IsBlocked = false;
@@ -38,11 +37,11 @@ namespace CardCollector.Commands.MyChatMember
         public static async Task<UpdateModel> Factory(Update update)
         {
             // Объект пользователя
-            var user = await UserDao.GetOrAddNew(update.MyChatMember.From);
+            var user = await UserDao.GetUser(update.MyChatMember!.From);
             return new MyChatMember(user, update, update.MyChatMember.NewChatMember.Status);
         }
-        
-        protected static User ChatToUser(Chat chat)
+
+        private static User ChatToUser(Chat chat)
         {
             return new User
             {
@@ -54,7 +53,7 @@ namespace CardCollector.Commands.MyChatMember
             };
         }
 
-        protected MyChatMember(UserEntity user, Update update, ChatMemberStatus status) : base(user, update)
+        private MyChatMember(UserEntity user, Update update, ChatMemberStatus status) : base(user, update)
         {
             _status = status;
         }

+ 13 - 27
CardCollector/DataBase/EntityDao/UserDao.cs

@@ -1,5 +1,3 @@
-#nullable enable
-using System;
 using System.Collections.Generic;
 using System.Threading.Tasks;
 using CardCollector.DataBase.Entity;
@@ -10,32 +8,27 @@ namespace CardCollector.DataBase.EntityDao
 {
     public static class UserDao
     {
-        private static readonly CardCollectorDatabase DataBase = CardCollectorDatabase.Instance;
-        
-        private static readonly Dictionary<long, UserEntity> ActiveUsers = new();
+        private static readonly DbSet<UserEntity> Table = CardCollectorDatabase.Instance.Users;
+        private static Dictionary<long, UserEntity> ActiveUsers = new();
 
-        public static async Task<UserEntity> GetOrAddNew(User user)
+        public static async Task<UserEntity> GetUser(User user)
         {
-            return await GetById(user.Id) ?? await AddNew(user);
-        }
-        
-        public static async Task<UserEntity?> GetById(long userId)
-        {
-            if (!await UserExists(userId)) return null;
+            UserEntity result;
             try
             {
-                return ActiveUsers[userId];
+                result = ActiveUsers[user.Id];
             }
-            catch (Exception)
+            catch
             {
-                var user = await DataBase.Users.FindAsync(userId);
+                result = await Table.FindAsync(user.Id) ?? await AddNew(user);
                 
                 // Build user object
-                user.Cash = await CashDao.GetById(user.Id);
+                result.Cash = await CashDao.GetById(user.Id);
                 
-                ActiveUsers.Add(user.Id, user);
-                return user;
+                // Add to avoid database fetching
+                ActiveUsers.Add(user.Id, result);
             }
+            return result;
         }
 
         public static async Task<UserEntity> AddNew(User user)
@@ -47,15 +40,8 @@ namespace CardCollector.DataBase.EntityDao
                 Username = user.Username,
                 IsBlocked = false
             };
-            await DataBase.Users.AddAsync(userEntity);
-            await DataBase.SaveChangesAsync();
-            return userEntity;
-        }
-
-        private static async Task<bool> UserExists(long userId)
-        {
-            if(ActiveUsers.ContainsKey(userId)) return true;
-            return await DataBase.Users.AnyAsync(e => e.Id == userId);
+            var result = await Table.AddAsync(userEntity);
+            return result.Entity;
         }
     }
 }

+ 10 - 0
CardCollector/Utilities.cs

@@ -0,0 +1,10 @@
+namespace CardCollector
+{
+    public class Utilities
+    {
+        public static string ToJson(object obj)
+        {
+            return Newtonsoft.Json.JsonConvert.SerializeObject(obj);
+        }
+    }
+}