예제 #1
0
        //TODO:
        public static void AddUser(int userId)
        {
            var             members = _memberRepository.ReadLobbyAll();
            LobbyRepository lobby   = new LobbyRepository();

            if (members.Count == 0)
            {
                _memberRepository.Create(1, userId);
            }
            else
            {
                var member = members.Last();
                if (member.IsLobbyActive == false)
                {
                    if (EmptyPlaceCount(member.UserId) == 0)
                    {
                        _memberRepository.Create(member.LobbyId + 1, userId);
                    }
                    else
                    {
                        _memberRepository.Create(member.LobbyId, userId);
                    }
                }
                else
                {
                    _memberRepository.Create(member.LobbyId + 1, userId);
                }
            }
        }
예제 #2
0
        public void Create_CallsRepositoryAdd()
        {
            // Register a lobby with the mock.
            var lobby = new Lobby()
            {
                Bets = new List <Bet>()
            };

            LobbyRepository.Get(Arg.Any <long>()).Returns(lobby);

            // Assert that we hit the repository.
            BetRepository.DidNotReceive().Add(Arg.Any <Bet>());
            MyWork.DidNotReceive().Complete();

            var viewModel = new CreateBetViewModel()
            {
                BuyIn       = "0",
                Description = "Description",
                LobbyID     = 0,
                StartDate   = DateTime.Now.ToLongDateString(),
                StopDate    = DateTime.Now.ToLongDateString(),
                Title       = "Name"
            };

            uut.Create(viewModel);

            Assert.That(uut.ModelState.IsValid);

            // Assert that we hit the repository.
            BetRepository.Received(1).Add(Arg.Any <Bet>());
            MyWork.Received(1).Complete();
        }
예제 #3
0
 public UnitOfWork(Context context)
 {
     _context = context;
     Bet      = new BetRepository(_context);
     Lobby    = new LobbyRepository(_context);
     User     = new UserRepository(_context);
     Outcome  = new OutcomeRepository(_context);
 }
예제 #4
0
        public void Show_CallsRepositoryGet()
        {
            // Assert that we hit the repository.
            LobbyRepository.DidNotReceive().Get(Arg.Any <long>());

            uut.Show(0);

            // Assert that we hit the repository.
            LobbyRepository.Received(1).Get(Arg.Any <long>());
        }
예제 #5
0
 public ActionResult <Lobby> Get([FromRoute] string id)
 {
     if (!Guid.TryParse(id, out var guid))
     {
         return(FormattedBadRequest("Invalid Player ID"));
     }
     else
     {
         return(LobbyRepository.GetLobby(guid));
     }
 }
예제 #6
0
        public ActionResult <Lobby> Put([FromBody] PutLobbyRequestBody body)
        {
            if (body == null)
            {
                return(FormattedBadRequest("No Body received!"));
            }
            Player player = null;

            if (Guid.TryParse(body?.PlayerId, out var guid))
            {
                //return FormattedBadRequest("Invalid Player ID");
                player = PlayerRepository.GetPlayer(guid);
            }
            return(LobbyRepository.CreateNewLobby(player, body.LobbySettings));
        }
예제 #7
0
        public void AcceptInvitationToLobby_LobbyInInvitedToLobbies_ProperFunctionsCalled()
        {
            MyWork.DidNotReceive().Complete();
            var lobby = Substitute.For <Lobby>();
            var user  = new User();

            lobby.DidNotReceive().AcceptLobby(Arg.Any <User>());

            LobbyRepository.Get(Arg.Any <long>()).Returns(lobby);
            MyWork.User.Get(Arg.Any <string>()).Returns(user);

            uut.Accept(1);

            lobby.Received(1).AcceptLobby(Arg.Any <User>());
            MyWork.Received(1).Complete();
        }
예제 #8
0
        public void ReadTest()
        {
            int lobbyId = 1;

            InstanceGenerator.Cleaner(lobbyId);
            var lobby = InstanceGenerator.GenerateTestingLobby(lobbyId);

            LobbyRepository lobbyRepository = new LobbyRepository();

            lobbyRepository.Create(lobby);

            var newLobby = lobbyRepository.Read(lobbyId);

            Assert.AreEqual(lobby.GameId, newLobby.GameId);
            Assert.AreEqual(lobby.Maze[0, 3], newLobby.Maze[0, 3]);
            Assert.AreEqual(lobby.Players.Count, newLobby.Players.Count);
        }
예제 #9
0
        public void Create_CallsRepositoryAdd()
        {
            // Assert that we hit the repository.
            LobbyRepository.DidNotReceive().Add(Arg.Any <Lobby>());
            MyWork.DidNotReceive().Complete();

            var viewModel = new CreateLobbyViewModel()
            {
                Description = "Description",
                Name        = "Name"
            };

            uut.Create(viewModel);

            // Assert that we hit the repository.
            LobbyRepository.Received(1).Add(Arg.Any <Lobby>());
            MyWork.Received(1).Complete();
        }
예제 #10
0
        public ActionResult <Lobby> Join([FromBody] JoinLobbyRequestBody body)
        {
            if (body == null)
            {
                return(FormattedBadRequest("No Body received!"));
            }
            if (!Guid.TryParse(body.PlayerId, out var playerId))
            {
                return(FormattedBadRequest("Invalid Player ID"));
            }
            if (!Guid.TryParse(body.LobbyId, out var lobbyId))
            {
                return(FormattedBadRequest("Invalid Lobby ID"));
            }
            var player = PlayerRepository.GetPlayer(playerId);

            return(LobbyRepository.JoinLobby(player, lobbyId));
        }
예제 #11
0
        public void Setup()
        {
            Factory         = Substitute.For <IFactory>();
            MyWork          = Substitute.For <IUnitOfWork>();
            LobbyRepository = Substitute.For <ILobbyRepository>();
            _userContext    = Substitute.For <IUserContext>();

            Factory.GetUOF().Returns(MyWork);
            MyWork.Lobby.Returns(LobbyRepository);

            // Setup the mock.
            _lobby1 = new Lobby()
            {
                Description = "",
                Name        = "",
                Bets        = new List <Bet>(),
                LobbyId     = 0,
                InvitedList = new List <User>(),
                MemberList  = new List <User>()
            };
            _lobby2 = new Lobby()
            {
                Description = "",
                Name        = "",
                Bets        = new List <Bet>(),
                LobbyId     = 1,
                InvitedList = new List <User>(),
                MemberList  = new List <User>()
            };

            var lobbies = new List <Lobby>()
            {
                _lobby1, _lobby2
            };

            _numberOfLobies = lobbies.Count;
            LobbyRepository.GetAll().Returns(lobbies);
            LobbyRepository.Get(0).Returns(_lobby1);

            // Create the controller.
            uut = new LobbyController(Factory, _userContext);
            uut.ControllerContext = new ControllerContext();
        }
예제 #12
0
        public void Show_WithInputId_CallsCorrectGet()
        {
            // Register a bet with the mock.
            var lobby = new Lobby();

            LobbyRepository.Get(Arg.Any <long>()).Returns(lobby);

            // Setup capture of the argument.
            long key = 0;

            LobbyRepository.Get(Arg.Do <long>(i => key = i));

            long passedKey = 100;

            // Act.
            uut.Show(passedKey);

            // Assert that we passed the correct id.
            Assert.That(key, Is.EqualTo(passedKey));
        }
예제 #13
0
        public void Create_InputFromViewModel_StoredInRepository()
        {
            // Create the viewmodel.
            var viewModel = new CreateLobbyViewModel()
            {
                Description = "Description",
                Name        = "Name"
            };

            // Setup storing retrieved calls.
            Lobby lobby = new Lobby();

            LobbyRepository.Add(Arg.Do <Lobby>(l => lobby = l));

            // Perform the action.
            uut.Create(viewModel);

            // Assert that the object passed to the repository, matches our data.
            Assert.That(lobby.Description, Is.EqualTo(viewModel.Description));
            Assert.That(lobby.Name, Is.EqualTo(viewModel.Name));
            // TODO: Extend.
        }
예제 #14
0
        public static List <MessageConfig> FindGameCommand(int playerId)
        {
            var members             = new MemberRepository();
            var characterRepository = new CharacterRepository();
            var lobyRepository      = new LobbyRepository();
            var msg = new List <MessageConfig>();

            if (LobbyService.CheckLobby(playerId))
            {
                msg.Add(new MessageConfig
                {
                    Answer   = "Вы уже находитесь в лобби",
                    PlayerId = playerId
                });
                return(msg);
            }
            //TODO: isLobbyactive
            LobbyService.AddUser(playerId);
            if (LobbyService.EmptyPlaceCount(playerId) != 0)
            {
                msg.Add(new MessageConfig
                {
                    Answer = $"Вы добавлены в лобби, осталось игроков для начала игры: *{LobbyService.EmptyPlaceCount(playerId)}* " +
                             $"\n /stop - для остановки поиска лобби" +
                             $"\n /help - попросить совет",
                    PlayerId = playerId
                });
                var character = characterRepository.Read(playerId);
                character.State = CharacterState.FindGame;
                CharacterRepository.Update(character);
                return(msg);
            }
            LobbyService.StartNewLobby(playerId);
            var memberlist = members.ReadMemberList(
                members.ReadLobbyId(playerId));
            string        s          = "";
            List <string> Names      = new List <string>();
            var           characters = CharacterRepository.ReadAll();

            foreach (var member in memberlist)
            {
                s += "*" + (characters.Find(e => e.TelegramUserId == member.UserId).CharacterName) + "*" + ", ";
            }

            s  = s.Substring(0, s.Length - 2);
            s += ".";
            ;            foreach (var item in memberlist)
            {
                msg.Add(new MessageConfig
                {
                    Answer = "Игра начата. Игроки: " + s + "" +
                             "\n/leave - испортить другим игру" +
                             "\n/afk - если кто-то долго не ходит \n",
                    PlayerId = item.UserId,
                });
                item.IsLobbyActive = true;
                members.Update(item);
            }
            foreach (var item in memberlist.Select(e => e.UserId))
            {
                var character = characterRepository.Read(item);
                character.State = CharacterState.InGame;
                characterRepository.Update(character);
            }

            msg.Find(e => e.PlayerId == members.ReadMemberList(members.ReadLobbyId(playerId)).First().UserId).Answer += " Ваш ход";
            msg.Find(e => e.PlayerId == members.ReadMemberList(members.ReadLobbyId(playerId)).First().UserId).KeyBoardId
                = KeyboardType.Move;

            return(msg);
        }
예제 #15
0
 public LobbyController(LobbyRepository lobbyRepository, PlayerRepository playerRepository)
 {
     LobbyRepository  = lobbyRepository;
     PlayerRepository = playerRepository;
 }
예제 #16
0
        public List <MessageConfig> StateMachine(CharacterState state, string command, int playerId)
        {
            //TODO: Вынести сюда создание репозиториев
            switch (state)
            {
            case CharacterState.ChangeName:
                return(BotService.TryChangeName(command, playerId));

            case CharacterState.ChangeGameMode:
                switch (command)
                {
                case "/game":
                    return(BotService.FindGameCommand(playerId));

                case "/tutorial":
                    var              character        = _characterRepository.Read(playerId);
                    LobbyRepository  lobbyRepository  = new LobbyRepository();
                    MemberRepository memberRepository = new MemberRepository();
                    memberRepository.Create(0, playerId);
                    var lobby = lobbyRepository.Read(0);
                    lobby.Players.Add(new Player
                    {
                        Health         = 3,
                        HeroName       = character.CharacterName,
                        Rotate         = Direction.North,
                        TelegramUserId = playerId,
                        UserCoordinate = new Coordinate(3, 3)
                    });
                    lobbyRepository.Update(lobby);
                    character.State = CharacterState.Tutorial;
                    _characterRepository.Update(character);
                    return(new List <MessageConfig>
                    {
                        new MessageConfig()
                        {
                            Answer = "Обучение",
                            PlayerId = playerId
                        }
                    });

                default:
                    return(new List <MessageConfig>
                    {
                        new MessageConfig()
                        {
                            Answer = "неверная команда",
                            PlayerId = playerId
                        }
                    });
                }

            case CharacterState.Tutorial:
                switch (command)
                {
                case "Вверх":
                    return(TutorialService.MoveCommand(playerId, Direction.North));

                case "Вниз":
                    return(TutorialService.MoveCommand(playerId, Direction.South));

                case "Вправо":
                    return(TutorialService.MoveCommand(playerId, Direction.East));

                case "Влево":
                    return(TutorialService.MoveCommand(playerId, Direction.West));

                case "Взрыв стены":
                    var inlineKeyboard = KeybordConfiguration.ChooseDirectionKeyboard();
                    BotClient.SendTextMessageAsync(playerId, "Выбирай направление",
                                                   replyMarkup: inlineKeyboard);
                    BotClient.OnCallbackQuery += BotClient_OnCallbackQueryBomb;
                    return(null);

                case "/skip":
                    var              character        = _characterRepository.Read(playerId);
                    LobbyRepository  lobbyRepository  = new LobbyRepository();
                    MemberRepository memberRepository = new MemberRepository();
                    memberRepository.DeleteOne(playerId);
                    var lobby = lobbyRepository.Read(0);
                    lobby.Players.Remove(lobby.Players.Find(e => e.TelegramUserId == playerId));
                    lobbyRepository.Update(lobby);
                    character.State = CharacterState.ChangeGameMode;
                    _characterRepository.Update(character);
                    return(new List <MessageConfig>
                    {
                        new MessageConfig()
                        {
                            Answer = "Обучение пропущено",
                            PlayerId = playerId
                        }
                    });

                default:
                    return(new List <MessageConfig>
                    {
                        new MessageConfig()
                        {
                            Answer = "Неверная команда",
                            PlayerId = playerId
                        }
                    });
                }

            case CharacterState.FindGame:
                switch (command)
                {
                case "/help":
                    return(new List <MessageConfig>
                    {
                        new MessageConfig()
                        {
                            Answer = Answers.Help.RandomAnswer(),
                            PlayerId = playerId
                        }
                    });

                case "/stop":
                    _characterRepository.Read(playerId);
                    MemberRepository repo = new MemberRepository();
                    var character         = _characterRepository.Read(playerId);
                    character.State = CharacterState.ChangeGameMode;
                    _characterRepository.Update(character);
                    repo.DeleteOne(playerId);
                    return(new List <MessageConfig>
                    {
                        new MessageConfig()
                        {
                            Answer = "Вы удалены из очереди",
                            PlayerId = playerId
                        }
                    });

                default:
                    return(new List <MessageConfig>
                    {
                        new MessageConfig()
                        {
                            Answer = "Неверная команда",
                            PlayerId = playerId
                        }
                    });
                }

            case CharacterState.InGame:
                switch (command)
                {
                case "Вперед":
                    return(BotService.MoveCommand(playerId, Direction.North));

                case "Назад":
                    return(BotService.MoveCommand(playerId, Direction.South));

                case "Вправо":
                    return(BotService.MoveCommand(playerId, Direction.East));

                case "Влево":
                    return(BotService.MoveCommand(playerId, Direction.West));

                case "Удар кинжалом":
                    return(BotService.StabCommand(playerId));

                case "Пропуск хода":
                    return(BotService.SkipTurn(playerId));

                case "Выстрел":
                {
                    var inlineKeyboard = KeybordConfiguration.ChooseDirectionKeyboard();
                    BotClient.SendTextMessageAsync(playerId, "Выбирай направление",
                                                   replyMarkup: inlineKeyboard);
                    BotClient.OnCallbackQuery += BotClient_OnCallbackQueryShoot;
                    return(null);
                }

                case "Взрыв стены":
                {
                    var inlineKeyboard = KeybordConfiguration.ChooseDirectionKeyboard();
                    BotClient.SendTextMessageAsync(playerId, "Выбирай направление",
                                                   replyMarkup: inlineKeyboard);
                    BotClient.OnCallbackQuery += BotClient_OnCallbackQueryBomb;
                    return(null);
                }

                case "/afk":
                    return(BotService.AfkCommand(playerId));

                case "/leave":
                    return(BotService.TryLeaveCommand(playerId));
                }

                return(new List <MessageConfig>
                {
                    new MessageConfig()
                    {
                        Answer = Answers.UndefinedCommand.RandomAnswer(),
                        PlayerId = playerId
                    }
                });

            case CharacterState.NewCharacter:
                if (command == "/start")
                {
                    if (_characterRepository.Read(playerId) == null)
                    {
                        _characterRepository.Create(playerId);
                        return(new List <MessageConfig>
                        {
                            new MessageConfig()
                            {
                                Answer = "Напишите имя персонажа",
                                PlayerId = playerId
                            }
                        });
                    }
                }

                return(new List <MessageConfig>
                {
                    new MessageConfig()
                    {
                        Answer = "Неверная команда",
                        PlayerId = playerId
                    }
                });

            case CharacterState.AcceptLeave:
                if (command == "Подтверждаю")
                {
                    return(BotService.LeaveCommand(playerId));
                }
                else
                {
                    return(new List <MessageConfig>
                    {
                        new MessageConfig
                        {
                            Answer = "Не подтверждено",
                            PlayerId = playerId
                        }
                    });
                }

            case CharacterState.Ban:
                //TODO:REBAN
                return(new List <MessageConfig>
                {
                    new MessageConfig()
                    {
                        Answer = "В бане",
                        PlayerId = playerId
                    }
                });

            default:
                throw new ArgumentOutOfRangeException(nameof(state), state, null);
            }
            throw new ArgumentOutOfRangeException(nameof(state), state, null);
        }