public static double GetTotalOverlap(this CSGOTeam team, ApplicationUser user)
        {
            double total = 0;

            foreach (TeamAvailability practice in team.PracticeSchedule.Where(d => d.Available))
            {
                UserAvailability availability = user.Availability.SingleOrDefault(a => a.Day == practice.Day && a.Available);
                if (availability != null)
                {
                    /* CASE 0
                     * user     |------------|
                     * team	                     |----------------------|
                     * OR
                     * user                           |------------|
                     * team	   |----------------------|
                     */
                    if (practice.To <= availability.From || practice.From >= availability.To)
                    {
                        continue;
                    }

                    /* CASE 1
                     * user     |------------|
                     * team	|----------------------|
                     */
                    if (practice.From <= availability.From && practice.To >= availability.To)
                    {
                        total += (availability.To - availability.From).TotalHours;
                    }

                    /* CASE 2
                     * user |----------------------|
                     * team    |------------|
                     */
                    else if (practice.From >= availability.From && practice.To <= availability.To)
                    {
                        total += (practice.To - practice.From).TotalHours;
                    }

                    /* CASE 3
                     * user	            |---------|
                     * team   |------------|
                     */
                    else if (practice.To > availability.From)
                    {
                        total += (practice.To - availability.From).TotalHours;
                    }

                    /* CASE 4
                     * user	  |---------|
                     * team         |------------|
                     */
                    else if (practice.From < availability.To)
                    {
                        total += (availability.To - practice.From).TotalHours;
                    }
                }
            }
            return(total);
        }
Пример #2
0
        public IHttpActionResult UpdateTeam(CSGOTeam team)
        {
            CSGOTeam entity = UserIsTeamAdmin(team.TeamId);

            if (entity == null)
            {
                return(BadRequest("User is not a team admin for " + team.TeamName));
            }

            if (ModelState.IsValid)
            {
                _dbContext.Entry(entity).CurrentValues.SetValues(team);

                try
                {
                    _dbContext.SaveChanges();
                }
                catch (DbUpdateException e)
                {
                    System.Diagnostics.Trace.TraceError($"Team update error: ${e.Message}");
                    return(BadRequest("Something went wrong!"));
                }
                return(Ok(team));
            }
            return(BadRequest("Invalid state of the team " + team.TeamName));
        }
Пример #3
0
        private CSGOTeam UserIsTeamAdmin(Guid teamId)
        {
            CSGOTeam        team = _dbContext.Teams.Find(teamId);
            ApplicationUser user = GetAuthUser();

            return(team != null && team.Members.Any(m => m.IsAdmin && m.UserId == user.Id) ? team : null);
        }
Пример #4
0
        public IHttpActionResult SetTeamMapPool(List <TeamMapPool> maps)
        {
            CSGOTeam team = UserIsTeamAdmin(maps[0].TeamId);

            if (team == null)
            {
                return(BadRequest("You need to be team admin."));
            }

            foreach (TeamMapPool mapPool in maps)
            {
                TeamMapPool entity = team.MapPool.SingleOrDefault(m => m.Map == mapPool.Map);
                _dbContext.Entry(entity).CurrentValues.SetValues(mapPool);
            }
            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team map pool error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }
            return(Ok("ok"));
        }
        public async Task <IActionResult> NewTeam(CSGOTeam team)
        {
            ApplicationUser user = await GetAuthUser();

            _dbContext.CSGOTeams.Add(team);

            team.Members.Add(new TeamMember()
            {
                UserId   = user.Id,
                IsActive = true,
                IsAdmin  = true,
                IsEditor = true
            });
            team.InitializeDefaults();
            team.UniqueCustomUrl(_dbContext);

            try
            {
                await _dbContext.SaveChangesAsync();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team create error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }
            return(Ok(team));
        }
Пример #6
0
        private CSGOTeam UserIsTeamMember(string teamId)
        {
            CSGOTeam        team = ResolveTeam(teamId);
            ApplicationUser user = GetAuthUser();

            return(team != null && team.Members.Any(m => m.UserId == user.Id) ? team : null);
        }
Пример #7
0
        private bool UserIsTeamMember(Guid teamId)
        {
            CSGOTeam        team = _dbContext.Teams.Find(teamId);
            ApplicationUser user = GetAuthUser();

            return(team != null && team.Members.Any(m => m.UserId == user.Id));
        }
Пример #8
0
        public IHttpActionResult AbandonTeam(Guid teamId)
        {
            ApplicationUser user   = GetAuthUser();
            CSGOTeam        team   = _dbContext.Teams.Find(teamId);
            TeamMember      entity = team.Members.SingleOrDefault(e => e.UserId == user.Id);

            team.Members.Remove(entity);
            object response = new { removed = false };

            if (team.Members.Count == 0)
            {
                _dbContext.Teams.Remove(team);
                response = new { removed = true };
            }
            else if (!team.Members.Any(m => m.IsAdmin))
            {
                team.Members.First().IsAdmin = true;
            }

            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team abandon error: ${e.Message}");
                return(BadRequest("Could not remove team because there's an active tournament registration associated with it!"));
            }
            return(Ok(response));
        }
Пример #9
0
        public IHttpActionResult GetTeamStrats(string teamId)
        {
            CSGOTeam team = UserIsTeamMember(teamId);

            if (team == null)
            {
                return(BadRequest("You're not a member of this team."));
            }
            return(Ok(team.Strategies));
        }
Пример #10
0
        public IHttpActionResult GetIsTeamAdmin(string teamid)
        {
            CSGOTeam team = UserIsTeamAdmin(teamid);

            if (team == null)
            {
                return(Ok(false));
            }
            return(Ok(true));
        }
        public static double GetTotalAvailability(this CSGOTeam team)
        {
            double total = 0;

            foreach (Availability availability in team.PracticeSchedule.Where(a => a.Available))
            {
                total += (availability.To - availability.From).TotalHours;
            }
            return(total);
        }
Пример #12
0
        public IHttpActionResult GetTeamApplications(Guid teamId)
        {
            CSGOTeam team = UserIsTeamAdmin(teamId);

            if (team == null)
            {
                return(BadRequest("You need to be team admin."));
            }

            return(Ok(team.Applications.OrderByDescending(n => n.Sent).ToList()));
        }
Пример #13
0
        private CSGOTeam ResolveTeam(string teamId)
        {
            CSGOTeam team = _dbContext.Teams.FirstOrDefault(t => t.CustomUrl == teamId);

            if (team == null)
            {
                var valid = Guid.TryParse(teamId, out Guid id);
                if (valid)
                {
                    team = _dbContext.Teams.Find(id);
                }
            }
            return(team);
        }
Пример #14
0
        public IHttpActionResult GetTournaments(string teamid)
        {
            CSGOTeam          team               = ResolveTeam(teamid);
            List <Tournament> tournaments        = _dbContext.Tournaments.ToList();
            List <TeamTournamentViewModel> model = new List <TeamTournamentViewModel>();

            foreach (var tournament in tournaments)
            {
                if (tournament.CSGOMatches.Any(m => m.Team1Id == team.TeamId || m.Team2Id == team.TeamId))
                {
                    model.Add(new TeamTournamentViewModel(tournament, team.TeamId));
                }
            }
            return(Ok(model));
        }
        public async Task <IActionResult> GetTournaments(string teamid)
        {
            CSGOTeam team = await ResolveTeam(teamid);

            List <TeamTournamentViewModel> model = new();
            await _dbContext.Tournaments
            .Include(t => t.CSGOMatches)
            .ThenInclude(m => m.Team1)
            .Where(t => t.CSGOMatches.Any(m => m.Team1Id == team.TeamId))
            .Include(t => t.CSGOMatches)
            .ThenInclude(m => m.Team2)
            .Where(t => t.CSGOMatches.Any(m => m.Team2Id == team.TeamId))
            .ForEachAsync(tournament => model.Add(new TeamTournamentViewModel(tournament, team.TeamId)));

            return(Ok(model));
        }
Пример #16
0
        public IHttpActionResult ApproveApplication(TeamApplication application)
        {
            CSGOTeam team = UserIsTeamAdmin(application.TeamId);

            if (team == null)
            {
                return(BadRequest("You need to be team admin."));
            }

            TeamApplication entity = team.Applications.SingleOrDefault(a => a.ApplicantId == application.ApplicantId);

            entity.State = NotificationState.Accepted;

            ApplicationUser user = _dbContext.Users.Find(application.ApplicantId);

            team.Members.Add(new TeamMember()
            {
                Member   = user,
                IsActive = true,
                IsAdmin  = false,
                IsEditor = false
            });
            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team application approve error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }

            try
            {
                List <BellumGensPushSubscription> subs = _dbContext.PushSubscriptions.Where(s => s.userId == entity.ApplicantId).ToList();
                NotificationsService.SendNotification(subs, application, NotificationState.Accepted);
            }
            catch (Exception e)
            {
                System.Diagnostics.Trace.TraceWarning($"Team application approve push notification fail: ${e.Message}");
            }

            return(Ok(entity));
        }
Пример #17
0
        public IHttpActionResult InviteToTeam(InviteModel model)
        {
            CSGOTeam team = UserIsTeamAdmin(model.teamId);

            if (team == null)
            {
                return(BadRequest("User is not team admin for " + team.TeamName));
            }

            ApplicationUser invitedUserEntity  = _dbContext.Users.Find(model.userId);
            ApplicationUser invitingUserEntity = GetAuthUser();
            TeamInvite      invite             = team.Invites.SingleOrDefault(i => i.InvitingUserId == invitingUserEntity.Id && i.InvitedUserId == invitedUserEntity.Id);

            if (invite != null)
            {
                if (invite.State != NotificationState.NotSeen)
                {
                    invite.State = NotificationState.NotSeen;
                }
            }
            else
            {
                invite = new TeamInvite()
                {
                    InvitedUser    = invitedUserEntity,
                    InvitingUserId = invitingUserEntity.Id
                };
                team.Invites.Add(invite);
            }
            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team invite error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }
            List <BellumGensPushSubscription> subs = _dbContext.PushSubscriptions.Where(sub => sub.userId == invitedUserEntity.Id).ToList();

            NotificationsService.SendNotification(subs, invite);
            return(Ok(model.userId));
        }
        public async Task <IActionResult> AcceptTeamInvite(TeamInvite invite)
        {
            TeamInvite entity = await _dbContext.TeamInvites.FindAsync(invite.InvitingUserId, invite.InvitedUserId, invite.TeamId);

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

            ApplicationUser user = await GetAuthUser();

            if (invite.InvitedUserId != user.Id)
            {
                return(BadRequest("This invite was not sent to you..."));
            }
            CSGOTeam team = await _dbContext.CSGOTeams.FindAsync(invite.TeamId);

            team.Members.Add(new TeamMember()
            {
                UserId   = user.Id,
                IsActive = true,
                IsAdmin  = false,
                IsEditor = false
            });
            entity.State = NotificationState.Accepted;
            try
            {
                await _dbContext.SaveChangesAsync();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"User team invite accept error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }
            List <BellumGensPushSubscription> subs = await _dbContext.BellumGensPushSubscriptions.Where(s => s.UserId == entity.InvitingUser.Id).ToListAsync();

            await _notificationService.SendNotificationAsync(subs, entity, NotificationState.Accepted);

            return(Ok(entity));
        }
Пример #19
0
        public IHttpActionResult UpdateTeamMember(TeamMember member)
        {
            CSGOTeam team = UserIsTeamAdmin(member.TeamId);

            if (team == null)
            {
                return(BadRequest("User is not team admin..."));
            }
            TeamMember entity = team.Members.SingleOrDefault(m => m.UserId == member.UserId);

            _dbContext.Entry(entity).CurrentValues.SetValues(member);
            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team member update error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }
            return(Ok("ok"));
        }
Пример #20
0
        public IHttpActionResult RemoveTeamMember(Guid teamId, string userId)
        {
            CSGOTeam team = UserIsTeamAdmin(teamId);

            if (team == null)
            {
                return(BadRequest("User is not team admin..."));
            }
            TeamMember entity = team.Members.SingleOrDefault(m => m.UserId == userId);

            _dbContext.TeamMembers.Remove(entity);
            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team member delete error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }
            return(Ok("ok"));
        }
        public async Task <IActionResult> AbandonTeam(Guid teamId)
        {
            ApplicationUser user = await GetAuthUser();

            CSGOTeam team = await _dbContext.CSGOTeams.FindAsync(teamId);

            await _dbContext.Entry(team).Collection(t => t.Members).LoadAsync();

            object response = new { removed = false };

            if (team.Members.Count == 1)
            {
                _dbContext.CSGOTeams.Remove(team);
                response = new { removed = true };
            }
            else
            {
                TeamMember entity = team.Members.FirstOrDefault(m => m.UserId == user.Id);
                if (entity != null)
                {
                    team.Members.Remove(entity);
                    if (!team.Members.Any(m => m.IsAdmin))
                    {
                        team.Members.First().IsAdmin = true;
                    }
                }
            }

            try
            {
                await _dbContext.SaveChangesAsync();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team abandon error: ${e.Message}");
                return(BadRequest("Could not remove team because there's an active tournament registration associated with it!"));
            }
            return(Ok(response));
        }
Пример #22
0
        public IHttpActionResult TeamFromSteamGroup(SteamUserGroup group)
        {
            ApplicationUser user = GetAuthUser();

            if (!SteamServiceProvider.VerifyUserIsGroupAdmin(user.Id, group.groupID64))
            {
                return(BadRequest("User is not a steam group owner for " + group.groupName));
            }

            CSGOTeam team = _dbContext.Teams.Add(new CSGOTeam()
            {
                SteamGroupId = group.groupID64,
                TeamName     = group.groupName,
                TeamAvatar   = group.avatarFull
            });

            team.InitializeDefaults();
            team.UniqueCustomUrl(_dbContext);

            team.Members.Add(new TeamMember()
            {
                UserId   = user.Id,
                IsActive = true,
                IsAdmin  = true,
                IsEditor = true
            });

            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceWarning($"Attempting to register steam group twice: ${group.groupID64} msg: ${e.Message}");
                return(BadRequest(group.groupName + " Steam group has already been registered."));
            }
            return(Ok(team));
        }
Пример #23
0
        public IHttpActionResult RejectApplication(TeamApplication application)
        {
            CSGOTeam team = UserIsTeamAdmin(application.TeamId);

            if (team == null)
            {
                return(BadRequest("You need to be team admin."));
            }

            TeamApplication entity = team.Applications.SingleOrDefault(a => a.ApplicantId == application.ApplicantId);

            entity.State = NotificationState.Rejected;
            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team application reject error: ${e.Message}");
                return(BadRequest("Something went wrong... "));
            }
            return(Ok("ok"));
        }
Пример #24
0
        public IHttpActionResult SetTeamAvailability(TeamAvailability day)
        {
            CSGOTeam team = UserIsTeamAdmin(day.TeamId);

            if (team == null)
            {
                return(BadRequest("You need to be team admin."));
            }

            TeamAvailability entity = team.PracticeSchedule.FirstOrDefault(s => s.Day == day.Day);

            _dbContext.Entry(entity).CurrentValues.SetValues(day);
            try
            {
                _dbContext.SaveChanges();
            }
            catch (DbUpdateException e)
            {
                System.Diagnostics.Trace.TraceError($"Team availability error: ${e.Message}");
                return(BadRequest("Something went wrong..."));
            }
            return(Ok(entity));
        }
        public async Task <IActionResult> UpdateTeam(CSGOTeam team)
        {
            if (!await UserIsTeamAdmin(team.TeamId))
            {
                return(BadRequest("User is not a team admin for " + team.TeamName));
            }

            if (ModelState.IsValid)
            {
                _dbContext.Attach(team).State = EntityState.Modified;

                try
                {
                    await _dbContext.SaveChangesAsync();
                }
                catch (DbUpdateException e)
                {
                    System.Diagnostics.Trace.TraceError($"Team update error: ${e.Message}");
                    return(BadRequest("Something went wrong!"));
                }
                return(Ok(team));
            }
            return(BadRequest("Invalid state of the team " + team.TeamName));
        }
Пример #26
0
        public IHttpActionResult SearchPlayers(PlaystyleRole?role, double overlap, Guid?teamid)
        {
            List <ApplicationUser>    users   = new List <ApplicationUser>();
            List <UserStatsViewModel> players = new List <UserStatsViewModel>();

            if (overlap <= 0 && role == null)
            {
                users = _dbContext.Users.Where(u => u.SearchVisible).OrderBy(u => u.Id).Take(50).ToList();

                foreach (ApplicationUser user in users)
                {
                    players.Add(new UserStatsViewModel(user));
                }

                return(Ok(players));
            }

            if (role != null)
            {
                users = _dbContext.Users.Where(u => u.SearchVisible && (u.PreferredPrimaryRole == role || u.PreferredSecondaryRole == role)).ToList();
            }
            else
            {
                users = _dbContext.Users.Where(u => u.SearchVisible && u.Availability.Any(d => d.Available)).ToList();
            }
            if (overlap > 0)
            {
                if (!User.Identity.IsAuthenticated)
                {
                    return(BadRequest("You must sign in to perform search by availability..."));
                }

                if (teamid != null)
                {
                    CSGOTeam team = _dbContext.Teams.Find(teamid);
                    overlap = Math.Min(overlap, team.GetTotalAvailability());
                    users   = users.Where(u => u.GetTotalAvailability() >= overlap && team.GetTotalOverlap(u) >= overlap).ToList();
                }
                else
                {
                    ApplicationUser user = GetAuthUser();
                    overlap = Math.Min(overlap, user.GetTotalAvailability());
                    if (!user.Availability.Any(a => a.Available))
                    {
                        return(BadRequest("You must provide your availability in your user profile..."));
                    }
                    users = users.Where(u => u.GetTotalAvailability() >= overlap && u.GetTotalOverlap(user) >= overlap).ToList();
                }

                foreach (ApplicationUser user in users)
                {
                    players.Add(new UserStatsViewModel(user));
                }
                return(Ok(players));
            }

            foreach (ApplicationUser user in users)
            {
                players.Add(new UserStatsViewModel(user));
            }
            return(Ok(players));
        }