Browse Source

add connection to private room

zelpold 4 years ago
parent
commit
31fcf369c5

+ 11 - 0
MafiaTelegramBot/Controllers/RoomController.cs

@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using System.Threading.Tasks;
 using MafiaTelegramBot.DataBase;
 using MafiaTelegramBot.Game;
@@ -38,6 +39,16 @@ namespace MafiaTelegramBot.Controllers
             });
         }
 
+        public static async Task<List<User>> GetPlayers(string roomKey)
+        {
+            return await Task.Run( ()=>
+            {
+                var room = OpenedGames[roomKey];
+                var users = room.Players.Values.ToList();
+                return users;
+            });
+        }
+        
         public static async Task<int> LeaveFromGame(User player)
         {
             return await Task.Run(async () =>

+ 4 - 0
MafiaTelegramBot/DataBase/User.cs

@@ -17,6 +17,10 @@ namespace MafiaTelegramBot.DataBase
         public Dictionary<string, int> RoleWins = new();
 
         private string _currentGame = "";
+        
+        public string FirstName { get; init; } = "";
+        
+        public string LastName { get; init; } = "";
 
         public async Task UpdateName(string name)
         {

+ 3 - 4
MafiaTelegramBot/DataBase/UserDao.cs

@@ -28,12 +28,11 @@ namespace MafiaTelegramBot.DataBase
             else DataBase.Add(user);
         }
         //Temporary method
-        public static async Task AddNewUser(long userId, long chatId, string username)
+        public static async Task AddNewUser(User _user)
         {
-            var user = await GetUserById(userId);
+            var user = await GetUserById(_user.Id);
             if (user == null) {
-                user = new User {Id = userId, Username = username, ChatId = chatId};
-                await Update(user);
+                await Update(_user);
             }
         }
     }

+ 3 - 0
MafiaTelegramBot/Models/Bot.cs

@@ -24,6 +24,7 @@ namespace MafiaTelegramBot.Models
 
         public static readonly List<long> UsersThatChangesNickname = new();
         public static readonly Dictionary<long, string[]> UsersThatCreatesRoom = new();
+        public static readonly List<long> UserThatEntersPrivateCode = new();
 
         public static TelegramBotClient Get()
         {
@@ -71,6 +72,8 @@ namespace MafiaTelegramBot.Models
                 new ChangeNameQuery(),
                 new LeaveQuery(),
                 new SettingsRoomQuery(),
+                new ConnectToPrivateRoom(),
+                new LookUsersList()
             };
         }
         

+ 13 - 1
MafiaTelegramBot/Models/Commands/ConnectGameCommand.cs

@@ -1,6 +1,9 @@
 using System.Threading.Tasks;
+using MafiaTelegramBot.DataBase;
 using Telegram.Bot.Types;
 using Telegram.Bot.Types.Enums;
+using Telegram.Bot.Types.ReplyMarkups;
+
 
 namespace MafiaTelegramBot.Models.Commands
 {
@@ -12,7 +15,16 @@ namespace MafiaTelegramBot.Models.Commands
         {
             var chatId = update.Message.Chat.Id;
             await Bot.Get().SendChatActionAsync(chatId, ChatAction.Typing);
-            return await Bot.SendWithMarkdown2(chatId, Name);
+            var userId = update.Message.From.Id;
+            
+            var user = await UserDao.GetUserById(userId);
+            
+            var inlineKeyboard = new InlineKeyboardMarkup(new[]
+            {
+                new[] {InlineKeyboardButton.WithCallbackData(strings.connect_to_public_room, $"{strings.connect_to_public_room_callback}|{userId}")},
+                new[] {InlineKeyboardButton.WithCallbackData(strings.connect_to_private_room, $"{strings.connect_to_private_room_callback}|{userId}")}
+            });
+            return await Bot.SendWithMarkdown2(chatId, strings.choose_type_room, inlineKeyboard);
         }
     }
 }

+ 2 - 2
MafiaTelegramBot/Models/Commands/CreateGameCommand.cs

@@ -19,8 +19,8 @@ namespace MafiaTelegramBot.Models.Commands
                 return await Bot.SendWithMarkdown2(chatId, $"{strings.user_already_playing} _*{user?.GetCurrentGame()}*_");
             var inlineKeyboard = new InlineKeyboardMarkup(new[]
             {
-                new[] {InlineKeyboardButton.WithCallbackData(strings.make_public_room, $"{strings.make_public_room_callback}|{userId}|private")},
-                new[] {InlineKeyboardButton.WithCallbackData(strings.make_private_room, $"{strings.make_private_room_callback}|{userId}|private")}
+                new[] {InlineKeyboardButton.WithCallbackData(strings.make_public_room, $"{strings.make_public_room_callback}|{userId}")},
+                new[] {InlineKeyboardButton.WithCallbackData(strings.make_private_room, $"{strings.make_private_room_callback}|{userId}")}
             });
             return await Bot.SendWithMarkdown2(chatId, strings.settings_room, inlineKeyboard);
         }

+ 39 - 1
MafiaTelegramBot/Models/Commands/CustomMessageHandlingCommand.cs

@@ -27,10 +27,48 @@ namespace MafiaTelegramBot.Models.Commands
                 Bot.UsersThatCreatesRoom.Remove(userId);
                 return await CreateRoomLogic(userId, chatId, message, param);
             }
-            
+
+            if (Bot.UserThatEntersPrivateCode.Remove(userId))
+            {
+                return await EnterPrivateCodeLogic(userId, chatId, message);
+            }
             return await Bot.SendWithMarkdown2(chatId, $"{strings.command_not_found} _*\\({message}\\)*_");
         }
+        
+        
+        private static async Task<Message> EnterPrivateCodeLogic(long userId, long chatId, string message)
+        {
+            var user = await UserDao.GetUserById(userId);
+            var resultCode = await RoomController.ConnectToGame(user, message);
+            switch (resultCode)
+            {
+                case Constants.CODE_OK:
+                {
+                    var users = await RoomController.GetPlayers(message);
+                    foreach (var player in users)
+                    {
+                        if (userId == player.Id) continue;
+                        await Bot.SendWithMarkdown2(player.ChatId, $"{strings.entry_another_user} _*{user?.Username}*_");
+                    }
+                    var keyboard = new InlineKeyboardMarkup(new []
+                    {
+                        new []{
+                            InlineKeyboardButton.WithCallbackData(strings.look_user_list, $"{strings.look_user_list_callback}|{userId}|{message}"),
+                            InlineKeyboardButton.WithCallbackData(strings.leave, $"{strings.leave_callback}|{userId}")
+                        }
+                    });
+                    return await Bot.SendWithMarkdown2(chatId, strings.successful_entry_into_room, keyboard);
+                }
+                case Constants.ROOM_IS_FILLED:
+                    return await Bot.SendWithMarkdown2(chatId, strings.room_is_filled);
+                case Constants.USER_ALREADY_IN_GAME:
+                    return await Bot.SendWithMarkdown2(chatId, strings.user_already_in_game);
+                default:
+                    return await Bot.SendWithMarkdown2(chatId, strings.unexpected_error);
+            }
 
+        }
+        
         private static async Task<Message> ChangeNicknameLogic(long userId, long chatId, string message)
         {
             var user = await UserDao.GetUserById(userId);

+ 36 - 3
MafiaTelegramBot/Models/Commands/StartCommand.cs

@@ -3,6 +3,7 @@ using MafiaTelegramBot.DataBase;
 using Telegram.Bot.Types;
 using Telegram.Bot.Types.Enums;
 using Telegram.Bot.Types.ReplyMarkups;
+using User = Telegram.Bot.Types.User;
 
 namespace MafiaTelegramBot.Models.Commands
 {
@@ -26,7 +27,7 @@ namespace MafiaTelegramBot.Models.Commands
             var message = await Bot.SendWithMarkdown2(chatId, strings.start_message, keyboard);
             var userId = update.Message.From.Id;
             var username = update.Message.From.Username;
-            username = await Task.Run(()=> username
+            username = username != null ?await Task.Run(()=> username
                 .Replace(".", "\\.")
                 .Replace("`", "\\`")
                 .Replace("@", "\\@")
@@ -37,8 +38,40 @@ namespace MafiaTelegramBot.Models.Commands
                 .Replace("'", "\\'")
                 .Replace("~", "\\~")
                 .Replace("[", "\\[")
-            );
-            await UserDao.AddNewUser(userId, chatId, username);
+            ):"";
+            var firstName = update.Message.From.FirstName;
+            firstName = firstName != null ?await Task.Run(()=> firstName
+                .Replace(".", "\\.")
+                .Replace("`", "\\`")
+                .Replace("@", "\\@")
+                .Replace("#", "\\#")
+                .Replace("!", "\\!")
+                .Replace("*", "\\*")
+                .Replace("_", "\\_")
+                .Replace("'", "\\'")
+                .Replace("~", "\\~")
+                .Replace("[", "\\[")
+            ):"";
+            var lastName = update.Message.From.LastName;
+            lastName = lastName != null ?await Task.Run(()=> lastName
+                .Replace(".", "\\.")
+                .Replace("`", "\\`")
+                .Replace("@", "\\@")
+                .Replace("#", "\\#")
+                .Replace("!", "\\!")
+                .Replace("*", "\\*")
+                .Replace("_", "\\_")
+                .Replace("'", "\\'")
+                .Replace("~", "\\~")
+                .Replace("[", "\\[")
+            ):"";
+            
+            var user = new DataBase.User
+            {
+                Id = userId, ChatId = chatId, Username = username, FirstName =  firstName, LastName = lastName
+            };
+            
+            await UserDao.AddNewUser(user);
             return message;
         }
     }

+ 26 - 0
MafiaTelegramBot/Models/Inlines/ConnectToPrivateRoom.cs

@@ -0,0 +1,26 @@
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using MafiaTelegramBot.DataBase;
+using MafiaTelegramBot.Resources;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.Enums;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class ConnectToPrivateRoom : Query
+    {
+        protected override string Name => strings.connect_to_private_room_callback;
+        public override async Task<Message> Execute(Update update)
+        {
+            await DeletePreviousMessage(update.CallbackQuery.Message.Chat.Id, update.CallbackQuery.Message.MessageId);
+            var chatId = update.CallbackQuery.Message.Chat.Id;
+            await Bot.Get().SendChatActionAsync(chatId, ChatAction.Typing);
+            var data = update.CallbackQuery.Data;
+            var param = data.Split('|');
+            var userId = long.Parse(param[1]);
+            
+            Bot.UserThatEntersPrivateCode.Add(userId);
+            return await Bot.SendWithMarkdown2(chatId, strings.enter_private_code);
+        }
+    }
+}

+ 41 - 0
MafiaTelegramBot/Models/Inlines/LookUsersList.cs

@@ -0,0 +1,41 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using MafiaTelegramBot.Controllers;
+using Microsoft.VisualBasic;
+using Telegram.Bot.Types;
+using Telegram.Bot.Types.Enums;
+
+namespace MafiaTelegramBot.Models.Inlines
+{
+    public class LookUsersList :Query
+    {
+        protected override string Name => strings.look_user_list_callback;
+        public override async Task<Message> Execute(Update update)
+        {
+            var chatId = update.CallbackQuery.Message.Chat.Id;
+            await Bot.Get().SendChatActionAsync(chatId, ChatAction.Typing);
+            var data = update.CallbackQuery.Data;
+            var param = data.Split('|');
+            var userId = long.Parse(param[1]);
+            var roomKey = param[2];
+            var users = await RoomController.GetPlayers(roomKey);
+            string s = "";
+            if (users.Count > 1)
+            {
+                s = strings.users_list;
+                foreach (var player in users)
+                {
+                    if (player.Id == userId) continue;
+                    s += $"\n \n {player.Username} \n{player.FirstName} {player.LastName}";
+                     
+                }
+            }
+            else
+            {
+                s = strings.users_list_empty;
+            }
+
+            return await Bot.SendWithMarkdown2(chatId, s);
+        }
+    }
+}

+ 136 - 1
MafiaTelegramBot/Resources/strings.Designer.cs

@@ -96,6 +96,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Выберите тип комнаты.
+        /// </summary>
+        internal static string choose_type_room {
+            get {
+                return ResourceManager.GetString("choose_type_room", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Команда не найдена.
         /// </summary>
@@ -114,6 +123,42 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Приватная комната.
+        /// </summary>
+        internal static string connect_to_private_room {
+            get {
+                return ResourceManager.GetString("connect_to_private_room", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to connect_to_privat_room.
+        /// </summary>
+        internal static string connect_to_private_room_callback {
+            get {
+                return ResourceManager.GetString("connect_to_private_room_callback", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Публичная комната.
+        /// </summary>
+        internal static string connect_to_public_room {
+            get {
+                return ResourceManager.GetString("connect_to_public_room", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to connect_to_public_room.
+        /// </summary>
+        internal static string connect_to_public_room_callback {
+            get {
+                return ResourceManager.GetString("connect_to_public_room_callback", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Создать игру.
         /// </summary>
@@ -123,6 +168,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Ввведите код от комнаты.
+        /// </summary>
+        internal static string enter_private_code {
+            get {
+                return ResourceManager.GetString("enter_private_code", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Введите название комнаты.
         /// </summary>
@@ -141,6 +195,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to В комнату вошёл.
+        /// </summary>
+        internal static string entry_another_user {
+            get {
+                return ResourceManager.GetString("entry_another_user", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Расширенный.
         /// </summary>
@@ -159,6 +222,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Игра уже идёт.
+        /// </summary>
+        internal static string game_is_runing {
+            get {
+                return ResourceManager.GetString("game_is_runing", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Число игр:.
         /// </summary>
@@ -195,6 +267,24 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Список игроков.
+        /// </summary>
+        internal static string look_user_list {
+            get {
+                return ResourceManager.GetString("look_user_list", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to look_user_list.
+        /// </summary>
+        internal static string look_user_list_callback {
+            get {
+                return ResourceManager.GetString("look_user_list_callback", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Приватная комната.
         /// </summary>
@@ -223,7 +313,7 @@ namespace MafiaTelegramBot {
         }
         
         /// <summary>
-        ///   Looks up a localized string similar to make_public_room_callback.
+        ///   Looks up a localized string similar to make_public_room.
         /// </summary>
         internal static string make_public_room_callback {
             get {
@@ -285,6 +375,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Комната заполнена.
+        /// </summary>
+        internal static string room_is_filled {
+            get {
+                return ResourceManager.GetString("room_is_filled", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Комната с именем.
         /// </summary>
@@ -402,6 +501,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Вы были добавлены в комнату.
+        /// </summary>
+        internal static string successful_entry_into_room {
+            get {
+                return ResourceManager.GetString("successful_entry_into_room", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Произошла неожиданная ошибка... Попробуйте ещё раз..
         /// </summary>
@@ -411,6 +519,15 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Вы уже в этой комнате.
+        /// </summary>
+        internal static string user_already_in_game {
+            get {
+                return ResourceManager.GetString("user_already_in_game", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to Вы уже находитесь в игре.
         /// </summary>
@@ -420,6 +537,24 @@ namespace MafiaTelegramBot {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Участники в комнате.
+        /// </summary>
+        internal static string users_list {
+            get {
+                return ResourceManager.GetString("users_list", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to В комнате нет игроков, кроме вас .
+        /// </summary>
+        internal static string users_list_empty {
+            get {
+                return ResourceManager.GetString("users_list_empty", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to была создана.
         /// </summary>

+ 46 - 1
MafiaTelegramBot/Resources/strings.resx

@@ -64,7 +64,7 @@
         <value>Публичная комната</value>
     </data>
     <data name="make_public_room_callback" xml:space="preserve">
-        <value>make_public_room_callback</value>
+        <value>make_public_room</value>
     </data>
     <data name="make_private_room" xml:space="preserve">
         <value>Приватная комната</value>
@@ -150,4 +150,49 @@
     <data name="secret_key_is" xml:space="preserve">
         <value>Секретный код для подключения к комнате</value>
     </data>
+    <data name="choose_type_room" xml:space="preserve">
+        <value>Выберите тип комнаты</value>
+    </data>
+    <data name="connect_to_public_room_callback" xml:space="preserve">
+        <value>connect_to_public_room</value>
+    </data>
+    <data name="connect_to_private_room_callback" xml:space="preserve">
+        <value>connect_to_privat_room</value>
+    </data>
+    <data name="connect_to_private_room" xml:space="preserve">
+        <value>Приватная комната</value>
+    </data>
+    <data name="connect_to_public_room" xml:space="preserve">
+        <value>Публичная комната</value>
+    </data>
+    <data name="enter_private_code" xml:space="preserve">
+        <value>Ввведите код от комнаты</value>
+    </data>
+    <data name="room_is_filled" xml:space="preserve">
+        <value>Комната заполнена</value>
+    </data>
+    <data name="game_is_runing" xml:space="preserve">
+        <value>Игра уже идёт</value>
+    </data>
+    <data name="user_already_in_game" xml:space="preserve">
+        <value>Вы уже в этой комнате</value>
+    </data>
+    <data name="successful_entry_into_room" xml:space="preserve">
+        <value>Вы были добавлены в комнату</value>
+    </data>
+    <data name="entry_another_user" xml:space="preserve">
+        <value>В комнату вошёл</value>
+    </data>
+    <data name="look_user_list" xml:space="preserve">
+        <value>Список игроков</value>
+    </data>
+    <data name="look_user_list_callback" xml:space="preserve">
+        <value>look_user_list</value>
+    </data>
+    <data name="users_list" xml:space="preserve">
+        <value>Участники в комнате</value>
+    </data>
+    <data name="users_list_empty" xml:space="preserve">
+        <value>В комнате нет игроков, кроме вас </value>
+    </data>
 </root>