Example #1
0
 public IActionResult AddNewUser(LoginViewModel loginViewModel)
 {
     if (ModelState.IsValid)
     {
         Repository.AddAccount(loginViewModel);
         return(View("AccountCreated", loginViewModel));
     }
     else
     {
         return(View("CreateAccount"));
     }
 }
Example #2
0
        public IActionResult ThankYou(string email, string password, CreateProfile account)
        {
            //string account;
            if (IsValidEmail(email) == true && IsValidPassWord(password) == true)
            {
                Repository.AddAccount(account);
                return(View("AccountCreated"));

                //Console.WriteLine("Email is good");
            }
            else
            {
                return(View("AccountFailed"));
                //Console.WriteLine("Email is bad");
            }

            //return View();
        }
Example #3
0
        private static void OnGetPlayerMatchHistoryResponse(ClientGCMsgProtobuf <CMsgDOTAGetPlayerMatchHistoryResponse> response)
        {
            var accountId = _currentHistoryRequest;

            try {
                var player = _lobbyMembers.Where(m => m.AccountId == _currentHistoryRequest.ToString()).SingleOrDefault();
                player.PlayerMatches = response.Body.matches.Select(m => new PlayerMatch()
                {
                    MatchId = m.match_id.ToString()
                }).ToList();
                _currentHistoryRequest = 0;
                //_logger.Info("Match history - Player: " + player.Name + " - Matches: " + player.PlayerMatches.Count);
                using (IRepository repository = new Repository(_dbOptions)) {
                    var account = repository.Accounts.Include(a => a.Bans).Where(m => m.AccountId == player.AccountId).FirstOrDefault();
                    var newUser = player.PlayerMatches.Count < _game.PlayerMinGamesRequired;
                    if (newUser && !_test)
                    {
                        var playerId = SteamHelper.ConvertIDToUint32(ulong.Parse(player.AccountId));
                        if (_lobbyMembersCount < _map.MaxPlayers)
                        {
                            player.Kicked = true;
                            SendChatMessage(String.Format(_game.NewAccountKickMessage, player.Name));
                            _dotaClient.KickLobbyMember(playerId);
                        }
                        _playersToKick.Add(playerId);
                    }
                    if (account == null)
                    {
                        account = new Account()
                        {
                            AccountId    = player.AccountId,
                            NewUser      = newUser,
                            AccountNames = new List <AccountName>()
                            {
                                new AccountName()
                                {
                                    Name = player.Name
                                }
                            },
                            Bans    = new List <Ban>(),
                            Matches = new List <AccountMatch>()
                        };
                        repository.AddAccount(account);
                        repository.SaveChanges();
                    }
                    else
                    {
                        var ban = account.Bans.Where(b => b.Expires > DateTime.UtcNow).OrderByDescending(b => b.Expires).FirstOrDefault();
                        if (ban != null && !_test)
                        {
                            var playerId = SteamHelper.ConvertIDToUint32(ulong.Parse(player.AccountId));
                            if (_lobbyMembersCount < _map.MaxPlayers)
                            {
                                player.Kicked = true;
                                SendChatMessage(String.Format(_game.BannedAccountKickMessage, player.Name, ban.Reason, ban.Expires.ToString("d") + " " + ban.Expires.ToString("t")));
                                _dotaClient.KickLobbyMember(playerId);
                            }
                            _playersToKick.Add(playerId);
                        }
                        if (account.NewUser && !newUser)
                        {
                            account.NewUser = false;
                            repository.SaveChanges();
                        }
                    }
                }
            } catch (Exception e) {
                _logger.Error("Error occurred while processing player history response - Account ID: " + accountId, e);
            }
        }
        public void OnMatchDetailsResponse(ClientGCMsgProtobuf <CMsgGCMatchDetailsResponse> response)
        {
            try {
                //_logger.Info("Received match details - Match ID: " + response?.Body?.match?.match_id);
                if (response.Body.match.match_id != _matchId)
                {
                    throw new Exception(String.Format("Match ID mismatch - Original ID: {0} - Returned ID: {1}", _matchId, response?.Body?.match?.match_id));
                }
                //var map = Startup.Config.Games.Where(g => m.CustomMapName == _match.CustomMapName).SingleOrDefault();
                var game = Startup.Config.Games.Where(g => g.Maps.Any(m => m.MapId == _match.CustomMapName)).SingleOrDefault();
                var map  = game.Maps.Where(m => m.MapId == _match.CustomMapName).SingleOrDefault();
                try {
                    using (IRepository repository = new Repository(_dbOptions)) {
                        bool saveRequired = false;
                        foreach (var player in response.Body.match.players)
                        {
                            var accountId = SteamHelper.ConvertIDToUint64(player.account_id);
                            var account   = repository.Accounts.Include(a => a.AccountNames).Where(a => a.AccountId == accountId.ToString()).FirstOrDefault();
                            if (account == null)
                            {
                                account = new Account()
                                {
                                    AccountId    = accountId.ToString(),
                                    NewUser      = false,
                                    AccountNames = new List <AccountName>(),
                                    Bans         = new List <Ban>(),
                                    Matches      = new List <AccountMatch>(),
                                };
                                repository.AddAccount(account);
                                saveRequired = true;
                            }
                            if (!String.IsNullOrEmpty(player.player_name))
                            {
                                if (!account.AccountNames.Any(n => n.Name == player.player_name))
                                {
                                    account.AccountNames.Add(new AccountName {
                                        Name = player.player_name
                                    });
                                    saveRequired = true;
                                }
                            }
                        }
                        if (saveRequired)
                        {
                            repository.SaveChanges();
                        }
                    }
                } catch (Exception e) {
                    _logger.Error("Error while processing finished match accounts - Match ID: " + response?.Body?.match?.match_id, e);
                }
                try {
                    using (IRepository repository = new Repository(_dbOptions)) {
                        var match = new Match()
                        {
                            CustomMapName = _match.CustomMapName,
                            Registered    = _match.Started,
                            Closed        = DateTime.UtcNow,
                            MatchId       = response.Body.match.match_id.ToString(),
                            RequestedBy   = repository.Accounts.Where(a => a.AccountId == _match.RequestedBy).FirstOrDefault(),
                            Bans          = new List <Ban>(),
                            Players       = new List <AccountMatch>()
                        };
                        repository.AddMatch(match);
                        var bannedUsers   = new List <string>();
                        var totalBans     = response.Body.match.players.Where(p => p.leaver_status != 0).Count();
                        var teamGoldSpent = new Dictionary <uint, List <uint> >();
                        foreach (var player in response.Body.match.players)
                        {
                            var team = player.custom_game_data.dota_team;
                            if (map.Solo)
                            {
                                team = 1;
                            }
                            List <uint> goldSpentList;
                            if (!teamGoldSpent.TryGetValue(team, out goldSpentList))
                            {
                                goldSpentList       = new List <uint>();
                                teamGoldSpent[team] = goldSpentList;
                            }
                            goldSpentList.Add(player.gold_spent);
                        }
                        var teamGoldSpentTopAverage = new Dictionary <uint, float>();
                        foreach (var team in teamGoldSpent)
                        {
                            var   half             = Convert.ToInt32(Math.Ceiling((double)(team.Value.Count / 2)));
                            var   topAverageSpents = team.Value.OrderByDescending(v => v).Take(half);
                            float average          = topAverageSpents.Sum(v => v) / half;
                            teamGoldSpentTopAverage[team.Key] = average;
                            _logger.Info("Team gold spent average - Team: " + team.Key + " - Average: " + average);
                        }
                        foreach (var player in response.Body.match.players)
                        {
                            var accountId = SteamHelper.ConvertIDToUint64(player.account_id);
                            var account   = repository.Accounts.Include(a => a.Bans).Where(a => a.AccountId == accountId.ToString()).SingleOrDefault();
                            match.Players.Add(new AccountMatch()
                            {
                                Account = account,
                                Match   = match
                            });
                            if (totalBans < Math.Floor(map.MaxPlayers * 0.75))
                            {
                                if (player.leaver_status != 0 && !Startup.Config.Admins.Contains(accountId))
                                {
                                    var   banDuration          = game.BanDurationLeave;
                                    float banSeverity          = 1;
                                    float teamGoldSpentAverage = 0;
                                    var   team = player.custom_game_data.dota_team;
                                    if (map.Solo)
                                    {
                                        team = 1;
                                    }
                                    if (game.VariableLeaveBan)
                                    {
                                        teamGoldSpentAverage = teamGoldSpentTopAverage[team];
                                        banSeverity          = 1 - (player.gold_spent / teamGoldSpentAverage);
                                        if (banSeverity < 0)
                                        {
                                            banSeverity = 0;
                                        }
                                        if (banSeverity > 1)
                                        {
                                            throw new Exception("Ban severity calculation error");
                                        }
                                    }
                                    if (!game.VariableLeaveBan || banSeverity > game.VariableLeaveBanThreshold)
                                    {
                                        banDuration = Convert.ToInt32((float)banDuration * banSeverity);
                                        _logger.Info("Banned leaver - Name: " + player.player_name + " - Severity: " + banSeverity + " - Duration: " + banDuration + " hours - Gold spent: " + player.gold_spent + " - Team gold spent average: " + teamGoldSpentAverage + " - Team: " + team + " - ID: " + accountId);
                                        bannedUsers.Add(player.player_name);
                                        var previousBan = account.Bans.Where(b => b.Expires > DateTime.UtcNow).OrderByDescending(b => b.Expires).FirstOrDefault();
                                        repository.AddBan(new Ban()
                                        {
                                            Account  = account,
                                            Match    = match,
                                            Duration = banDuration,
                                            Expires  = previousBan != null ? previousBan.Expires.AddHours(banDuration) : DateTime.UtcNow.AddHours(banDuration),
                                            Severity = banSeverity,
                                            Set      = DateTime.UtcNow,
                                            Type     = BanTypes.LEAVE,
                                            Reason   = String.Format("Abandoned {0} match {1}", game.Name, response?.Body?.match?.match_id)
                                        });
                                    }
                                    else if (banSeverity <= game.VariableLeaveBanThreshold)
                                    {
                                        _logger.Info("Ban severity below threashold - Name: " + player.player_name + " - Severity: " + banSeverity + " - Gold spent: " + player.gold_spent + " - Team gold spent average: " + teamGoldSpentAverage + " - Team: " + team);
                                    }
                                }
                            }
                            if (player.feeding_detected)
                            {
                                _logger.Info("FEEDER: " + player.player_name);
                            }

                            /*else if ((int)player.deaths - ((int)player.kills + (int)player.assists) >= map.FeedingScore) {
                             *  _logger.Info(String.Format("Banned Feeder - Player: {0} - KDA: ({1}/{2}/{3}) - Feeding Score: {4}", player.player_name, player.kills, player.deaths, player.assists, (int)player.deaths - ((int)player.kills + (int)player.assists)));
                             *  var previousBan = account.Bans.Where(b => b.Expires > DateTime.UtcNow).OrderByDescending(b => b.Expires).FirstOrDefault();
                             *  repository.AddBan(new Ban() {
                             *      Account = account,
                             *      Match = match,
                             *      Duration = map.BanDurationLeave,
                             *      Expires = previousBan != null ? previousBan.Expires.AddHours(map.BanDurationLeave) : DateTime.UtcNow.AddHours(map.BanDurationLeave),
                             *      Set = DateTime.UtcNow,
                             *      Type = BanTypes.LEAVE,
                             *      Reason = "Feeding in match " + response?.Body?.match?.match_id,
                             *  });
                             * }*/
                        }
                        DeleteOngoingMatch(repository, _match.LobbyId);
                        repository.SaveChanges();
                        _logger.Info("Finalized lobby: " + _match.LobbyId);
                        var channelId = Startup.Bot.Channels.Where(c => c.Value == Startup.Config.PrivateChat).FirstOrDefault().Key;
                        var gameName  = game.Name;
                        if (game.Maps.Count > 1)
                        {
                            gameName += " " + map.Name;
                        }
                        var message = String.Format("Finalized {0} match: {1}", gameName, _matchId);
                        if (bannedUsers.Count == 0)
                        {
                            if (totalBans < Math.Floor(map.MaxPlayers * 0.75))
                            {
                                message += " - No users to ban.";
                            }
                            else
                            {
                                message += " - Voided due to mass leaving.";
                            }
                        }
                        else
                        {
                            message += " - Banned leavers (" + bannedUsers.Count + "): " + String.Join(", ", bannedUsers) + ".";
                        }
                        Startup.Bot.DotaClient.QueueChatMessage(channelId, message, false);
                    }
                } catch (Exception e) {
                    _logger.Error("Error while processing finished match details - Match ID: " + response?.Body?.match?.match_id, e);
                    PostponeLobbyCheck(_match.LobbyId);
                }
                StopMatchChecking();
            } catch (Exception e) {
                _logger.Error("Error while processing match details response - Match ID: " + response?.Body?.match?.match_id, e);
            }
        }