Ejemplo n.º 1
0
        public async Task AddPlayer(HubCallerContext context, IGroupManager groups, HttpContext httpContext)
        {
            if (IsGameRunning)
            {
                await Clients.Client(context.ConnectionId).InvokeAsync("Reject", players);

                await groups.RemoveAsync(context.ConnectionId, PlayingGroup);

                await groups.AddAsync(context.ConnectionId, WaitlistGroup);
            }
            else if (players.TrueForAll(p => p.ConnectionId != context.ConnectionId))
            {
                await groups.RemoveAsync(context.ConnectionId, WaitlistGroup);

                await groups.AddAsync(context.ConnectionId, PlayingGroup);

                lock (playersLock)
                {
                    players.Add(new Player
                    {
                        ConnectionId  = context.ConnectionId,
                        IpAddress     = httpContext.Connection.RemoteIpAddress.ToString(),
                        Username      = DbContext.GetUsername(GopUser.GetCurrentUser(httpContext)),
                        Run           = true,
                        IsWatching    = true,
                        StartLocation = DefaultStartingLocations[Math.Min(DefaultStartingLocations.Length - 1, players.Count)]
                    });
                }
                await Clients.Client(context.ConnectionId).InvokeAsync("SetGameParams", Altar, Seed);

                await PlayingClients.UpdatePlayers(players, true);
                await UpdatePlayerIndices();
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> Puzzle(int id)
        {
            var puzzle = DbContext.Puzzles.AsNoTracking().Include(p => p.PuzzleSubmissions).SingleOrDefault(p => p.Id == id);

            if (puzzle == null)
            {
                return(NotFound());
            }

            var puzzleView  = GetPuzzleView(puzzle, GopUser.GetCurrentUser(HttpContext));
            var submissions = puzzleView.IsSolved() ?
                              puzzle.PuzzleSubmissions :
                              puzzle.PuzzleSubmissions.Where(s => new GopUser(s.UserId, s.IpAddress).Equals(GopUser.GetCurrentUser(HttpContext)));

            var submissionViews = from s in submissions
                                  select GetPuzzleSubmissionView(s);

            var currentUser = await GetCurrentUserAsync();

            var requireLogin = !User.Identity.IsAuthenticated &&
                               (from s in DbContext.PuzzleSubmissions.AsNoTracking()
                                where s.IpAddress == HttpContext.Connection.RemoteIpAddress.ToString() && s.UserId != null
                                select 0).Count() > 0;

            return(View("Puzzle", new PuzzleViewModel
            {
                PuzzleView = puzzleView,
                Submissions = submissionViews,
                RequireLogin = requireLogin
            }));
        }
Ejemplo n.º 3
0
        private PuzzleView GetPuzzleView(Puzzle puzzle, GopUser user)
        {
            var view = new PuzzleView
            {
                Id              = puzzle.Id,
                Altar           = puzzle.Altar,
                NumberOfOrbs    = puzzle.NumberOfOrbs,
                NumberOfPlayers = puzzle.NumberOfPlayers,
                Orbs            = puzzle.Orbs,
                StartLocations  = puzzle.StartLocations
            };

            var submissions = puzzle.PuzzleSubmissions;

            if (submissions.Count == 0)
            {
                return(view);
            }

            view.Par             = submissions.Min(s => s.Score);
            view.NumberOfSolvers = submissions.Where(s => s.Score == view.Par).GroupBy(s => new GopUser(s.UserId, s.IpAddress)).Count();
            var userScores = submissions
                             .Where(s => user.Equals(new GopUser(s.UserId, s.IpAddress)))
                             .Select(s => s.Score)
                             .ToList();

            if (userScores.Count > 0)
            {
                view.Score        = userScores.Min();
                view.PuzzlePoints = GetPuzzlePoints(view.Par, view.Score);
            }

            return(view);
        }
Ejemplo n.º 4
0
 public static ChatUser GetCurrentUserNow(HttpContext context)
 {
     return(new ChatUser
     {
         GopUser = GopUser.GetCurrentUser(context),
         ConnectionTime = DateTimeOffset.Now,
         IsMobile = IsRequestMobile(context)
     });
 }
        private void EditLastMessage(string newMessage, bool force = false)
        {
            var last = DbContext.ChatMessages.OrderByDescending(m => m.Id).FirstOrDefault();

            if (!force && !GopUser.GetCurrentUser(HttpContext).Equals(new GopUser(last.UserId, last.IpAddress)))
            {
                throw new InvalidOperationException("The last message was written by someone else. You cannot edit someone else's message.");
            }
            last.Text      = newMessage;
            last.Timestamp = DateTimeOffset.Now;
            DbContext.SaveChanges();
            ChatHub.Clients.All.InvokeAsync("EditLastMessage", DbContext.GetChatMessageView(last));
        }
        private void DeleteLastMessage(bool force = false)
        {
            var last = DbContext.ChatMessages.OrderByDescending(m => m.Id).FirstOrDefault();

            if (last == null)
            {
                throw new InvalidOperationException("There are no chat messages.");
            }
            int lastId = last.Id;

            if (!force && !GopUser.GetCurrentUser(HttpContext).Equals(new GopUser(last.UserId, last.IpAddress)))
            {
                throw new InvalidOperationException("The last message was written by someone else. You cannot delete someone else's message.");
            }
            DbContext.ChatMessages.Remove(last);
            DbContext.SaveChanges();
            ChatHub.Clients.All.InvokeAsync("DeleteLastMessage", lastId);
        }
Ejemplo n.º 7
0
        public IActionResult Index(string u)
        {
            GopUser gopUser = GopUser.GetCurrentUser(HttpContext);

            if (u != null)
            {
                // Try to find user
                var user = DbContext.Users.SingleOrDefault(x => x.UserName == u);
                if (user != null)
                {
                    gopUser = new GopUser(user.Id, null);
                }
            }
            var views = from puzzle in DbContext.Puzzles.Include(p => p.PuzzleSubmissions).AsNoTracking().AsEnumerable()
                        select GetPuzzleView(puzzle, gopUser);

            return(View(views));
        }
Ejemplo n.º 8
0
        public void PostSolo(int numberOfPlayers, int numberOfOrbs, int seed, int altar, int score, string code)
        {
            var username  = DbContext.GetUsername(GopUser.GetCurrentUser(HttpContext));
            var usernames = string.Join("; ", Enumerable.Repeat(username, numberOfPlayers));

            var game = new MultiplayerGame
            {
                Timestamp       = DateTimeOffset.Now,
                NumberOfPlayers = numberOfPlayers,
                Usernames       = usernames,
                NumberOfOrbs    = numberOfOrbs,
                Seed            = seed,
                Altar           = altar,
                Score           = score,
                Code            = code
            };

            DbContext.MultiplayerGames.Add(game);
            DbContext.SaveChanges();
        }
        public IActionResult Post(string message)
        {
            if (string.IsNullOrWhiteSpace(message))
            {
                return(BadRequest("You entered an empty message."));
            }
            message = message.TrimEnd();

            if (message[0] == '/' && message.Length > 1)
            {
                var command = message.Substring(1).Split(new char[] { ' ' }, 2, StringSplitOptions.RemoveEmptyEntries);
                if (command.Length >= 1)
                {
                    try
                    {
                        switch (command[0])
                        {
                        case "nick":
                            if (command.Length < 2)
                            {
                                throw new InvalidOperationException("<b>Usage:</b> /nick &lt;new username&gt;");
                            }
                            SetNickname(command[1]);
                            break;

                        case "clearnick":
                            ClearNickname();
                            break;

                        case "edit":
                            if (command.Length < 2)
                            {
                                throw new InvalidOperationException("<b>Usage:</b> /edit &lt;new message&gt;");
                            }
                            EditLastMessage(command[1]);
                            break;

                        case "editf":
                            if (command.Length < 2)
                            {
                                throw new InvalidOperationException("<b>Usage:</b> /edit &lt;new message&gt;");
                            }
                            EditLastMessage(command[1], UserManager.GetUserIdInt32(User) == 1);
                            break;

                        case "del":
                            DeleteLastMessage();
                            break;

                        case "delf":
                            DeleteLastMessage(UserManager.GetUserIdInt32(User) == 1);
                            break;

                        case "rand":
                            lock (Random)
                            {
                                var value       = Random.Next();
                                var username    = DbContext.GetUsername(GopUser.GetCurrentUser(HttpContext));
                                var randMessage = $"{username} has generated the random number {value}!";
                                ChatHub.Clients.All.InvokeAsync("ShowMessage", randMessage);
                                return(Content(randMessage));
                            }

                        case "kick":
                            return(Content($"The yellow orb was kicked {KickCounter.Kick()} times!"));

                        case "refresh":
                            if (User.IsInRole("Administrators"))
                            {
                                ChatHub.Clients.All.InvokeAsync("Refresh");
                            }
                            break;

                        case "su":
                            if (User.IsInRole("Administrators"))
                            {
                                const string updatedMessage = "The server has updated! Please refresh this page.";
                                ChatHub.Clients.All.InvokeAsync("ShowMessage", updatedMessage);
                                return(Content(updatedMessage));
                            }
                            break;

                        default:
                            throw new InvalidOperationException("Unrecognized command.");
                        }
                    }
                    catch (InvalidOperationException ex)
                    {
                        return(BadRequest(ex.Message));
                    }
                }
            }
            else
            {
                var chatMessage = new ChatMessage
                {
                    IpAddress = HttpContext.Connection.RemoteIpAddress.ToString(),
                    Timestamp = DateTimeOffset.Now,
                    UserId    = UserManager.GetUserIdInt32(User),
                    Text      = message
                };

                DbContext.ChatMessages.Add(chatMessage);
                DbContext.SaveChanges();
                ChatHub.Clients.All.InvokeAsync("AddMessage", DbContext.GetChatMessageView(chatMessage));
            }

            return(new EmptyResult());
        }