Tigran 3 years ago
parent
commit
9ab591ce3d

+ 2 - 1
CardCollector/Commands/ChosenInlineResult/GiveExp.cs

@@ -11,13 +11,14 @@ namespace CardCollector.Commands.ChosenInlineResult
     {
         /* Ключевое слово для данной команды send_sticker */
         protected override string CommandText => Command.give_exp;
+        protected override bool ClearStickers => true;
 
         public override async Task Execute()
         {
             if (!User.Session.ChosenResultWithMessage)
             {
                 if (User.Settings[UserSettingsEnum.ExpGain])
-                    await MessageController.SendMessage(User, 
+                    await MessageController.EditMessage(User, 
                         $"{Messages.you_gained} 1 {Text.exp} {Messages.send_sticker}" +
                         $"\n{Messages.you_can_add_bot_to_conversation}");
                 await User.GiveExp(1);

+ 2 - 1
CardCollector/Commands/Message/GiveExp.cs

@@ -12,6 +12,7 @@ namespace CardCollector.Commands.Message
     public class GiveExp : MessageCommand
     {
         protected override string CommandText => "";
+        protected override bool ClearStickers => true;
 
         public static readonly Dictionary<long, Dictionary<long, int>> GroupStickersExp = new();
 
@@ -30,7 +31,7 @@ namespace CardCollector.Commands.Message
                 var membersCount = await Bot.Client.GetChatMemberCountAsync(chatId) - 1;
                 await User.GiveExp(membersCount < 21 ? membersCount : 20);
                 if (User.Settings[UserSettingsEnum.ExpGain])
-                    await MessageController.SendMessage(User, 
+                    await MessageController.EditMessage(User, 
                         $"{Messages.you_gained} {(membersCount < 21 ? membersCount : 20)} {Text.exp} {Messages.send_sticker}" +
                         $"\n{Messages.count_sends_per_day} \"{Update.Message.Chat.Title}\" {GroupStickersExp[chatId][User.Id]} / 5");
             }

+ 3 - 4
CardCollector/Commands/Message/Menu.cs

@@ -1,9 +1,7 @@
 using System.Threading.Tasks;
-using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
 using CardCollector.Resources;
 using Telegram.Bot.Types;
-using Telegram.Bot.Types.Enums;
 
 namespace CardCollector.Commands.Message
 {
@@ -14,8 +12,9 @@ namespace CardCollector.Commands.Message
         public override async Task Execute()
         {
             await User.ClearChat();
-            /* Отправляем пользователю сообщение со стандартной клавиатурой */
-            await MessageController.SendMessage(User, Messages.main_menu, Keyboard.Menu, ParseMode.Html);
+            await User.MessagesId.SendMenu();/*
+            /* Отправляем пользователю сообщение со стандартной клавиатурой #1#
+            await MessageController.SendMessage(User, Messages.main_menu, Keyboard.Menu, ParseMode.Html);*/
         }
 
         public Menu() { }

+ 14 - 3
CardCollector/Commands/Message/Start.cs

@@ -1,21 +1,32 @@
 using System.Threading.Tasks;
 using CardCollector.Controllers;
 using CardCollector.DataBase.Entity;
+using CardCollector.DataBase.EntityDao;
 using CardCollector.Resources;
 using Telegram.Bot.Types;
+using Telegram.Bot.Types.Enums;
 
 namespace CardCollector.Commands.Message
 {
     /* Обработка команды "/start" */
     public class Start : MessageCommand
     {
-        /* */
         protected override string CommandText => Text.start;
-
+        private const string PackStickerId = "CAACAgIAAxkBAAIWs2DuY4vB50ARmyRwsgABs_7o5weDaAAC-g4AAmq4cUtH6M1FoN4bxSAE";
+        
         public override async Task Execute()
         {
+            await User.ClearChat();
+            if (!User.FirstReward)
+            {
+                User.FirstReward = true;
+                var randomPack = await UserPacksDao.GetOne(User.Id, 1);
+                randomPack.Count += 7;
+                await MessageController.SendSticker(User, PackStickerId);
+                await MessageController.SendMessage(User, Messages.first_reward, Keyboard.MyPacks, ParseMode.Html);
+            }
             /* Отправляем пользователю сообщение со стандартной клавиатурой */
-            await MessageController.SendMessage(User, Messages.start_message, Keyboard.Menu, addToList: false);
+            await MessageController.SendMessage(User, Messages.start_message, Keyboard.Menu);
         }
         
         public Start() { }

+ 1 - 0
CardCollector/DataBase/BotDatabase.cs

@@ -47,6 +47,7 @@ namespace CardCollector.DataBase
         public DbSet<Level> Levels { get; set; }
         public DbSet<UserSettings> Settings { get; set; }
         public DbSet<CountLogs> CountLogs { get; set; }
+        public DbSet<UserMessages> UserMessages { get; set; }
 
         /* Конфигурация подключения к БД */
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

+ 2 - 0
CardCollector/DataBase/Entity/UserEntity.cs

@@ -30,6 +30,7 @@ namespace CardCollector.DataBase.Entity
 
         /* Уровень привилегий пользователя */
         [Column("privilege_level"), MaxLength(32)] public int _privilegeLevel { get; set; } = 0;
+        [Column("first_reward"), MaxLength(11)] public bool FirstReward { get; set; } = false;
 
         [NotMapped] public PrivilegeLevel PrivilegeLevel
         {
@@ -45,6 +46,7 @@ namespace CardCollector.DataBase.Entity
         
         /* Стикеры пользователя */
         [NotMapped] public Dictionary<string, UserStickerRelationEntity> Stickers { get; set; }
+        [NotMapped] public UserMessages MessagesId { get; set; }
 
         /* Данные, хранящиеся в рамках одной сессии */
         [NotMapped] public UserSession Session;

+ 33 - 0
CardCollector/DataBase/Entity/UserMessages.cs

@@ -0,0 +1,33 @@
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Threading.Tasks;
+using CardCollector.Resources;
+using Telegram.Bot;
+using Telegram.Bot.Types.Enums;
+
+namespace CardCollector.DataBase.Entity
+{
+    [Table("messages")]
+    public class UserMessages
+    {
+        /* id записи */
+        [Key] [Column("user_id"), MaxLength(127)] public long UserId { get; set; }
+        /* id стикера */
+        [Column("menu_id"), MaxLength(32)] public int MenuId { get; set; } = -1;
+
+        public async Task SendMenu()
+        {
+            try
+            {
+                if (MenuId != -1)
+                    await Bot.Client.DeleteMessageAsync(UserId, MenuId);
+            } catch { /**/ }
+            try
+            {
+                var msg = await Bot.Client.SendTextMessageAsync(UserId, Messages.main_menu, replyMarkup: Keyboard.Menu,
+                    parseMode: ParseMode.Html);
+                MenuId = msg.MessageId;
+            } catch { /**/ }
+        }
+    }
+}

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

@@ -50,6 +50,7 @@ namespace CardCollector.DataBase.EntityDao
                 result.Stickers = await UserStickerRelationDao.GetListById(user.Id);
                 result.Settings = await SettingsDao.GetById(user.Id);
                 result.CurrentLevel = await UserLevelDao.GetById(user.Id);
+                result.MessagesId = await UserMessagesDao.GetById(user.Id);
                 /* Добавляем пользователя в список активных, чтобы не обращаться к бд лишний раз */
                 ActiveUsers.Add(user.Id, result);
             }

+ 45 - 0
CardCollector/DataBase/EntityDao/UserMessagesDao.cs

@@ -0,0 +1,45 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using CardCollector.DataBase.Entity;
+using Microsoft.EntityFrameworkCore;
+
+namespace CardCollector.DataBase.EntityDao
+{
+    public class UserMessagesDao
+    {
+        public static BotDatabase Instance;
+        public static DbSet<UserMessages> Table;
+
+        static UserMessagesDao()
+        {
+            Instance = BotDatabase.GetClassInstance(typeof(UserLevelDao));
+            Table = Instance.UserMessages;
+        }
+        
+        /* Получение объекта по Id */
+        public static async Task<UserMessages> GetById(long userId)
+        {
+            try {
+                var user = await Table.FirstOrDefaultAsync(item => item.UserId == userId);
+                return user ?? await AddNew(userId);
+            } catch (InvalidOperationException) {
+                Thread.Sleep(Utilities.rnd.Next(30));
+                return await GetById(userId);
+            }
+        }
+
+        /* Добавление нового объекта в систему */
+        private static async Task<UserMessages> AddNew(long userId)
+        {
+            try {
+                var userLevel = new UserMessages { UserId = userId };
+                var result = await Table.AddAsync(userLevel);
+                return result.Entity;
+            } catch (InvalidOperationException) {
+                Thread.Sleep(Utilities.rnd.Next(30));
+                return await AddNew(userId);
+            }
+        }
+    }
+}

+ 3 - 1
CardCollector/DataBase/EntityDao/UserPacksDao.cs

@@ -66,7 +66,9 @@ namespace CardCollector.DataBase.EntityDao
         {
             try
             {
-                return await Table.Where(item => item.UserId == userId).SumAsync(item => item.Count);
+                var packs = await Table.Where(item => item.UserId == userId).ToListAsync();
+                return packs.Sum(item => item.Count);
+                
             }
             catch (InvalidOperationException)
             {

+ 1 - 1
CardCollector/Resources/LogsTranslations.Designer.cs

@@ -97,7 +97,7 @@ namespace CardCollector.Resources {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to Людей выставилос стикер на аукцион.
+        ///   Looks up a localized string similar to Людей выставило стикер на аукцион.
         /// </summary>
         internal static string PPSTA {
             get {

+ 1 - 1
CardCollector/Resources/LogsTranslations.resx

@@ -34,6 +34,6 @@
         <value>Людей задонатило</value>
     </data>
     <data name="PPSTA" xml:space="preserve">
-        <value>Людей выставилос стикер на аукцион</value>
+        <value>Людей выставило стикер на аукцион</value>
     </data>
 </root>

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

@@ -494,6 +494,15 @@ namespace CardCollector.Resources {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Спасибо за регистрацию! Вы получили 7 паков, используйте эту кнопку, чтобы открыть их..
+        /// </summary>
+        internal static string first_reward {
+            get {
+                return ResourceManager.GetString("first_reward", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to за покупку алмазов в магазине.
         /// </summary>
@@ -767,7 +776,7 @@ namespace CardCollector.Resources {
         /// <summary>
         ///   Looks up a localized string similar to Добро пожаловать! Этот бот позволяет вам коллекционировать стикеры. Вы можете выбрать одну из опций ниже.
         ///
-        ///Для того, чтобы получить стартовый набор стикеров, нажмите &quot;Магазин&quot; -&gt; &quot;0💰&quot;
+        ///Для того, чтобы получить стартовый набор стикеров, нажмите &quot;Магазин&quot; -&gt; &quot;Специальные предложения&quot; -&gt; &quot;3 стартовых пака бесплатно&quot; -&gt; &quot;0💰&quot;
         ///После этого их можно открыть, нажав:
         ///&quot;Профиль&quot; -&gt; &quot;Мои паки&quot; -&gt; &quot;Открыть обычный пак&quot;
         ///            

+ 4 - 1
CardCollector/Resources/Messages.resx

@@ -21,7 +21,7 @@
     <data name="start_message" xml:space="preserve">
         <value>Добро пожаловать! Этот бот позволяет вам коллекционировать стикеры. Вы можете выбрать одну из опций ниже.
 
-Для того, чтобы получить стартовый набор стикеров, нажмите "Магазин" -&gt; "0💰"
+Для того, чтобы получить стартовый набор стикеров, нажмите "Магазин" -&gt; "Специальные предложения" -&gt; "3 стартовых пака бесплатно" -&gt; "0💰"
 После этого их можно открыть, нажав:
 "Профиль" -&gt; "Мои паки" -&gt; "Открыть обычный пак"
             
@@ -348,4 +348,7 @@ https://telegra.ph/help-11-04-4</value>
     <data name="confirm_stopping" xml:space="preserve">
         <value>Подтвердите остановку (повторите команду)</value>
     </data>
+    <data name="first_reward" xml:space="preserve">
+        <value>Спасибо за регистрацию! Вы получили 7 паков, используйте эту кнопку, чтобы открыть их.</value>
+    </data>
 </root>