Example #1
0
        public ActionResult SwitchPlayerCards(string key, int firstCard, int secondCard)
        {
            var playerId = GetPlayerId();

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                var serie = entities.Serie.FirstOrDefault(p => p.Id == key);
                if (serie == null || !serie.Started)
                {
                    return(Json(new { ok = false, errorMessage = Resources.an_error_occured }));
                }

                var currentPlayer = serie.SeriePlayers.FirstOrDefault(p => p.PlayerId == playerId);
                if (currentPlayer == null)
                {
                    return(Json(new { ok = false, errorMessage = Resources.an_error_occured }));
                }

                var game = entities.Game.Single(p => p.SerieId == key && p.Ended == false);

                var playerCards = entities.GameCard.Where(p => p.GameId == game.Id && p.PlayerId == playerId).OrderBy(p => p.Position).ToArray();

                var firstCardPosition  = playerCards[firstCard].Position;
                var secondCardPosition = playerCards[secondCard].Position;
                playerCards[firstCard].Position  = secondCardPosition;
                playerCards[secondCard].Position = firstCardPosition;

                entities.SaveChanges();

                return(Json(new { ok = true, errorMessage = string.Empty }));
            }
        }
Example #2
0
        public ActionResult Create()
        {
            string playerId = Request.Cookies["playerId"]?.Value;

            if (string.IsNullOrWhiteSpace(playerId))
            {
                return(RedirectToAction("ChooseName", "Account", new { returnUrl = Url.Action("Create", "Serie", null, "http") }));
            }

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                var creator = entities.Player.FirstOrDefault(p => p.Id == playerId);

                if (creator == null)
                {
                    CleanCookie();
                    return(RedirectToAction("ChooseName", new { returnUrl = Url.Action("Create", "Serie", null, "http") }));
                }

                var serie = new Serie()
                {
                    CreationDate = DateTime.UtcNow, Ended = false, CreatorId = creator.Id, Id = Guid.NewGuid().ToString(), Started = false
                };
                entities.Serie.Add(serie);
                serie.SeriePlayers.Add(new SeriePlayers()
                {
                    SerieId = serie.Id, PlayerId = playerId, Position = 0
                });

                entities.SaveChanges();

                return(RedirectToAction("New", "Serie", new { key = serie.Id }));
            }
        }
Example #3
0
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            string playerId = HttpContext.Current.Request.Cookies["playerId"]?.Value;

            if (string.IsNullOrEmpty(playerId))
            {
                filterContext.Result = new RedirectToRouteResult(
                    new RouteValueDictionary {
                    { "action", "ChooseName" },
                    { "controller", "Account" },
                    { "returnUrl", HttpContext.Current.Request.RawUrl }
                });
            }

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                var existingPlayer = entities.Player.FirstOrDefault(p => p.Id == playerId);
                if (existingPlayer == null)
                {
                    filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary {
                        { "action", "ChooseName" },
                        { "controller", "Account" },
                        { "returnUrl", HttpContext.Current.Request.RawUrl }
                    });
                }
            }
        }
        public ActionResult ChooseName(ChooseNameViewModel model)
        {
            if (string.IsNullOrWhiteSpace(model.Name))
            {
                ViewBag.ErrorMessage = Resources.name_cant_be_empty;
                return(View(model));
            }

            if (!string.IsNullOrWhiteSpace(model.Email) && !IsValidEmail(model.Email))
            {
                ViewBag.ErrorMessage = Resources.invalid_email;
                return(View(model));
            }

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                if (entities.Player.Any(p => p.Name.ToLower() == model.Name.ToLower()))
                {
                    ViewBag.ErrorMessage = Resources.name_already_used;
                    return(View(model));
                }
                else if (!string.IsNullOrWhiteSpace(model.Email) && entities.Player.Any(p => p.Email.Trim().ToLower() == model.Email.Trim().ToLower()))
                {
                    ViewBag.ErrorMessage = Resources.email_already_used;
                    return(View(model));
                }

                Player player;

                string playerId = Request.Cookies["playerId"]?.Value;
                if (playerId == null || entities.Player.FirstOrDefault(p => p.Id == playerId) == null)
                {
                    player = new Player()
                    {
                        Id = Guid.NewGuid().ToString(), Name = model.Name.Trim(), Email = model.Email?.Trim()
                    };
                    entities.Player.Add(player);
                    Response.Cookies["playerId"].Value   = player.Id;
                    Response.Cookies["playerId"].Expires = DateTime.UtcNow.AddYears(10);
                }
                else
                {
                    entities.Player.Single(p => p.Id == playerId).Name = model.Name;
                }
                entities.SaveChanges();
            }

            if (!string.IsNullOrEmpty(model.ReturnUrl))
            {
                return(Redirect(model.ReturnUrl));
            }
            else
            {
                return(RedirectToAction("Index", "Home"));
            }
        }
Example #5
0
        public ActionResult Play(string key)
        {
            var playerId = GetPlayerId();

            var model = new PlayViewModel();

            model.SerieId = key;

            model.FirstTwoCards = new List <GameCard>();

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                var serie = entities.Serie.FirstOrDefault(p => p.Id == key);
                if (serie == null || !serie.Started)
                {
                    return(RedirectToAction("New", "Serie", new { key }));
                }

                var currentPlayer = serie.SeriePlayers.FirstOrDefault(p => p.PlayerId == playerId);
                if (currentPlayer == null)
                {
                    return(RedirectToAction("Index", "Home"));
                }

                var game = entities.Game.Single(p => p.SerieId == key && p.Ended == false);

                model.DateStopShowFirstTwoCards = game.CreationDate.AddSeconds(NB_SECONDS_TO_SHOW_FIRST_TWO_CARDS);

                if (game.CreationDate.AddSeconds(NB_SECONDS_TO_SHOW_FIRST_TWO_CARDS) >= DateTime.UtcNow)
                {
                    model.FirstTwoCards = entities.GameCard.Where(p => p.GameId == game.Id && p.PlayerId == playerId).OrderBy(p => p.Position).Take(2).ToList();
                }

                model.CardFromDeck = entities.GameCard
                                     .Where(p => p.GameId == game.Id && p.PlayerId == null)
                                     .OrderBy(p => p.Position)
                                     .FirstOrDefault();

                model.NextExpectedAction = string.Format(Resources.next_to_play_1, game.Player2.Name);

                model.LastChatMessages = entities.SerieChat
                                         .Where(p => p.SerieId == key)
                                         .OrderByDescending(p => p.Id)
                                         .Select(p => new ChatMessage()
                {
                    Id = p.Id, Date = p.Date, Message = p.Message, PlayerId = p.PlayerId, PlayerName = p.Player.Name
                })
                                         .Take(30)
                                         .OrderBy(p => p.Date)
                                         .ToList();
            }

            return(View(model));
        }
Example #6
0
        public ActionResult New(string key)
        {
            var playerId = GetPlayerId();

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                var serie        = entities.Serie.Single(p => p.Id == key);
                var player       = entities.Player.Single(p => p.Id == playerId);
                var seriePlayers = serie.SeriePlayers.ToList();
                int position     = seriePlayers.Max(p => p.Position) + 1;

                if (!seriePlayers.Any(p => p.PlayerId == playerId))
                {
                    serie.SeriePlayers.Add(new SeriePlayers()
                    {
                        PlayerId = player.Id, SerieId = key, Position = position
                    });
                }

                entities.SaveChanges();

                var players = entities.SeriePlayers.Where(p => p.SerieId == key).Select(p => p.Player.Name).ToList();

                var lastChatMessages = entities.SerieChat
                                       .Where(p => p.SerieId == key)
                                       .OrderByDescending(p => p.Id)
                                       .Select(p => new ChatMessage()
                {
                    Id = p.Id, Date = p.Date, Message = p.Message, PlayerId = p.PlayerId, PlayerName = p.Player.Name
                })
                                       .Take(30)
                                       .OrderBy(p => p.Date)
                                       .ToList();

                if (TempData["ErrorMessage"] != null)
                {
                    ViewBag.ErrorMessage = TempData["ErrorMessage"];
                }

                return(View(new NewSerieViewModel()
                {
                    Key = key,
                    IsCreator = serie.CreatorId == playerId,
                    Players = players,
                    CurrentPlayerName = player.Name,
                    LastChatMessages = lastChatMessages
                }));
            }
        }
Example #7
0
        public ActionResult JoinLastGame()
        {
            var playerId = GetPlayerId();

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                var seriePlayers = entities.SeriePlayers.Where(p => p.PlayerId == playerId)?.Select(p => p.Serie);
                var games        = seriePlayers?.SelectMany(p => p.Game)?.ToList();

                var lastGame = games?.OrderByDescending(p => p.CreationDate)?.FirstOrDefault();
                if (lastGame == null)
                {
                    return(RedirectToAction("Index", "Home"));
                }

                return(RedirectToAction("Play", "Game", new { key = lastGame.SerieId }));
            }
        }
Example #8
0
        public void BroadcastChatMessageToGroup(string group, string message)
        {
            var playerId = HttpContext.Current.Request.Cookies["playerId"].Value;

            message = HttpUtility.HtmlEncode(message);

            using (var entities = new LittleGoatEntities())
            {
                var player = entities.Player.Single(p => p.Id == playerId);

                var lastMessage = entities.SerieChat.Where(p => p.SerieId == group).OrderByDescending(p => p.Id).FirstOrDefault();

                if (lastMessage != null && lastMessage.PlayerId == player.Id)
                {
                    lastMessage.Message += "<br />" + message;

                    entities.SaveChanges();

                    Clients.Group(group).newChatMessageUpdated(lastMessage.Id, lastMessage.Message);
                }
                else
                {
                    var serieChat = new SerieChat()
                    {
                        Date     = DateTime.UtcNow,
                        Message  = message,
                        PlayerId = player.Id,
                        SerieId  = group
                    };

                    entities.SerieChat.Add(serieChat);
                    entities.SaveChanges();

                    Clients.Group(group).newChatMessageReceived(serieChat.Id, serieChat.Date.ToString("dd/MM HH:mm"), player.Name, HtmlHelperExtensions.GetPlaceHolderLinkForAvatar(player.Name), message);
                }
            }
        }
Example #9
0
        public ActionResult New(NewSerieViewModel model)
        {
            var    playerId = GetPlayerId();
            Random r        = new Random();

            using (LittleGoatEntities entities = new LittleGoatEntities())
            {
                var serie = entities.Serie.Single(p => p.Id == model.Key);
                if (serie.CreatorId != playerId)
                {
                    TempData["ErrorMessage"] = Resources.you_cant_start_the_game_only_creator;
                    return(RedirectToAction("New", "Serie", new { key = model.Key }));
                }

                var players = serie.SeriePlayers.ToList();
                if (players.Count < 2)
                {
                    TempData["ErrorMessage"] = Resources.you_cant_play_alone;
                    return(RedirectToAction("New", "Serie", new { key = model.Key }));
                }

                serie.Started = true;
                entities.SaveChanges();

                foreach (var game in entities.Game.Where(p => p.SerieId == serie.Id))
                {
                    game.Ended = true;
                }
                entities.SaveChanges();

                string cardGiverId = players[r.Next(0, players.Count)].PlayerId;

                var newGame = new Game()
                {
                    CreationDate       = DateTime.UtcNow,
                    Ended              = false,
                    LittleGoatCallerId = null,
                    SerieId            = serie.Id,
                    CardGiverId        = cardGiverId,
                    NextToPlayId       = cardGiverId
                };
                entities.Game.Add(newGame);
                entities.SaveChanges();

                var             cards     = Cards.AllCards.GetAllCards();
                List <GameCard> gameCards = new List <GameCard>();
                int             position  = 0;

                while (cards.Any())
                {
                    var nextCard = cards[r.Next(0, cards.Count)];
                    cards.Remove(nextCard);
                    gameCards.Add(new GameCard()
                    {
                        Value    = (int)nextCard.Value,
                        Symbol   = (int)nextCard.Symbol,
                        Position = position,
                        IsCover  = false,
                        PlayerId = null,
                        GameId   = newGame.Id,
                        FileName = nextCard.FileName,
                    });
                    position++;
                }
                entities.GameCard.AddRange(gameCards);
                entities.SaveChanges();

                var cardsToDistribute = gameCards.OrderBy(p => p.Position).Take(players.Count * 4).ToArray();
                for (int i = 0; i < cardsToDistribute.Length; i++)
                {
                    var targetPlayer = players.Single(p => p.Position == i % players.Count);
                    cardsToDistribute[i].PlayerId = targetPlayer.PlayerId;
                }
                entities.SaveChanges();
            }

            SerieHub.StartGame(model.Key);

            return(RedirectToAction("Play", "Game", new { key = model.Key }));
        }