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(); } }
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 })); }
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); }
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); }
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)); }
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 <new username>"); } SetNickname(command[1]); break; case "clearnick": ClearNickname(); break; case "edit": if (command.Length < 2) { throw new InvalidOperationException("<b>Usage:</b> /edit <new message>"); } EditLastMessage(command[1]); break; case "editf": if (command.Length < 2) { throw new InvalidOperationException("<b>Usage:</b> /edit <new message>"); } 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()); }