private bool TryVerifyConnection(out string currentIPAddress)
        {
            currentIPAddress = "127.0.0.1"; // Supports unit tests.

            if (OperationContext.Current != null)
            {
                //http://nayyeri.net/detect-client-ip-in-wcf-3-5
                OperationContext context = OperationContext.Current;
                MessageProperties messageProperties = context.IncomingMessageProperties;
                RemoteEndpointMessageProperty endpointProperty = (RemoteEndpointMessageProperty)messageProperties[RemoteEndpointMessageProperty.Name];

                currentIPAddress = endpointProperty.Address;
            }

            using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
            {
                string ipAddress = currentIPAddress;

                var gameServer = statsDB.GameServers.FirstOrDefault(p => p.GameServerIPs.Where(r => r.IPAddress == ipAddress).Count() > 0);

                if (gameServer == null)
                    return false;
            }

            return true;
        }
        private bool TryVerifyConnection(out string currentIPAddress)
        {
            currentIPAddress = "127.0.0.1";             // Supports unit tests.

            if (OperationContext.Current != null)
            {
                //http://nayyeri.net/detect-client-ip-in-wcf-3-5
                OperationContext              context           = OperationContext.Current;
                MessageProperties             messageProperties = context.IncomingMessageProperties;
                RemoteEndpointMessageProperty endpointProperty  = (RemoteEndpointMessageProperty)messageProperties[RemoteEndpointMessageProperty.Name];

                currentIPAddress = endpointProperty.Address;
            }

            using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
            {
                string ipAddress = currentIPAddress;

                var gameServer = statsDB.GameServers.FirstOrDefault(p => p.GameServerIPs.Where(r => r.IPAddress == ipAddress).Count() > 0);

                if (gameServer == null)
                {
                    return(false);
                }
            }

            return(true);
        }
        private void BindData()
        {
            using (var db = new DataAccess.CSSStatsDataContext())
            {
                var allFactionNames = db.StatsFactions
                    .Select(p => new { FactionName = p.WinFactionName } )
                    .Union
                    (
                        db.StatsFactions.Select(p => new { FactionName = p.LossFactionName} )
                    ).Distinct().OrderBy(p => p.FactionName);

                List<Data.FactionData> allFactionData = new List<Allegiance.CommunitySecuritySystem.Management.Stats.Data.FactionData>();

                foreach (var winFactionName in allFactionNames)
                {
                    Data.FactionData factionData = new Allegiance.CommunitySecuritySystem.Management.Stats.Data.FactionData();
                    factionData.Name = winFactionName.FactionName;
                    factionData.Stats = String.Empty;

                    int index = 0;
                    foreach (var lossFactionName in allFactionNames)
                    {
                        if (winFactionName.FactionName.Equals(lossFactionName.FactionName, StringComparison.InvariantCultureIgnoreCase) == true)
                        {
                            factionData.Stats += "<td>--</td>";
                        }
                        else
                        {
                            var winTotal = db.StatsFactions
                                .Where(p => p.WinFactionName == winFactionName.FactionName && p.LossFactionName == lossFactionName.FactionName)
                                .GroupBy(p => new { p.WinFactionName, p.LossFactionName })
                                .Select(p => p.Sum(r => r.GamesPlayed) ).FirstOrDefault();

                            var lossTotal = db.StatsFactions
                                .Where(p => p.WinFactionName == lossFactionName.FactionName && p.LossFactionName == winFactionName.FactionName)
                                .GroupBy(p => new { p.WinFactionName, p.LossFactionName })
                                .Select(p => p.Sum(r => r.GamesPlayed)).FirstOrDefault();

                            if(winTotal + lossTotal == 0)
                                factionData.Stats += "<td>--</td>";
                            else
                                factionData.Stats += String.Format("<td>{0:p}</td>", (decimal) winTotal / (lossTotal + winTotal));
                        }

                        index++;
                    }

                    allFactionData.Add(factionData);
                }

                rptFactionHeaders.DataSource = allFactionData;
                rptFactionHeaders.DataBind();

                rptFactionRow.DataSource = allFactionData;
                rptFactionRow.DataBind();
            }
        }
        public List<ActivePlayerData> GetActivePlayers(string token)
        {
            ValidateToken(token);

            string cacheKey = "Stats::GetActivePlayers";

            List<ActivePlayerData> returnValue = (List<ActivePlayerData>)HttpRuntime.Cache.Get(cacheKey);

            if (returnValue == null)
            {
                using (DataAccess.CSSDataContext db = new Allegiance.CommunitySecuritySystem.DataAccess.CSSDataContext())
                {
                    //var activeLogins = db.Logins
                    //    .Where(p => p.Sessions.Where(r => r.DateLastCheckIn > DateTime.Now.AddMinutes(-3)).Count() > 0)
                    //    .OrderBy(p => p.Username)
                    //    .ToList();

                    var activeSessions = db.Sessions
                        .Where(r => r.DateLastCheckIn > DateTime.Now.AddMinutes(-3))
                        .OrderBy(p => p.Alias.Callsign)
                        .ToList();

                    using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
                    {
                        returnValue = activeSessions.GroupJoin(statsDB.StatsLeaderboards, p => p.LoginId, r => r.LoginID, (session, leaderboard) => new { session, leaderboard })
                            .SelectMany(z => z.leaderboard.DefaultIfEmpty(), (z, leaderboard) => new { z.session, leaderboard })
                            .Select(p => new ActivePlayerData()
                            {
                                PlayerName = p.session.Alias.Callsign,
                                Rank = p.leaderboard == null ? 0 : (int)Math.Floor(p.leaderboard.Rank)
                            })
                            .OrderBy(p => p.PlayerName)
                            .ToList();

                        //returnValue = activeLogins.GroupJoin(statsDB.StatsLeaderboards, p => p.Id, r => r.LoginID, (login, leaderboard) => new {login, leaderboard})
                        //    .SelectMany(z => z.leaderboard.DefaultIfEmpty(), (z, leaderboard) => new { z.login, leaderboard } )
                        //    .Select(p => new ActivePlayerData()
                        //    {
                        //        PlayerName = p.login.Username,
                        //        Rank = p.leaderboard == null ? 0 : (int) Math.Floor(p.leaderboard.Rank)
                        //    })
                        //    .OrderBy(p => p.PlayerName)
                        //    .ToList();

                        //var loginStats = statsDB.StatsLeaderboards
                        //    .Join(activeLogins, p => p.LoginID, r => r.Id, ( p,
                        //    .Where(p => activeLogins.Select(r => r.Id).Contains(p.LoginID) == true).OrderBy(p => p.LoginUsername);
                        //returnValue = loginStats.ToList();
                    }

                    HttpRuntime.Cache.Add(cacheKey, returnValue, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 30), CacheItemPriority.Normal, null);
                }
            }

            return returnValue;
        }
示例#5
0
        public List <ActivePlayerData> GetActivePlayers(string token)
        {
            ValidateToken(token);

            string cacheKey = "Stats::GetActivePlayers";

            List <ActivePlayerData> returnValue = (List <ActivePlayerData>)HttpRuntime.Cache.Get(cacheKey);

            if (returnValue == null)
            {
                using (DataAccess.CSSDataContext db = new Allegiance.CommunitySecuritySystem.DataAccess.CSSDataContext())
                {
                    //var activeLogins = db.Logins
                    //    .Where(p => p.Sessions.Where(r => r.DateLastCheckIn > DateTime.Now.AddMinutes(-3)).Count() > 0)
                    //    .OrderBy(p => p.Username)
                    //    .ToList();

                    var activeSessions = db.Sessions
                                         .Where(r => r.DateLastCheckIn > DateTime.Now.AddMinutes(-3))
                                         .OrderBy(p => p.Alias.Callsign)
                                         .ToList();

                    using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
                    {
                        returnValue = activeSessions.GroupJoin(statsDB.StatsLeaderboards, p => p.LoginId, r => r.LoginID, (session, leaderboard) => new { session, leaderboard })
                                      .SelectMany(z => z.leaderboard.DefaultIfEmpty(), (z, leaderboard) => new { z.session, leaderboard })
                                      .Select(p => new ActivePlayerData()
                        {
                            PlayerName = p.session.Alias.Callsign,
                            Rank       = p.leaderboard == null ? 0 : (int)Math.Floor(p.leaderboard.Rank)
                        })
                                      .OrderBy(p => p.PlayerName)
                                      .ToList();

                        //returnValue = activeLogins.GroupJoin(statsDB.StatsLeaderboards, p => p.Id, r => r.LoginID, (login, leaderboard) => new {login, leaderboard})
                        //    .SelectMany(z => z.leaderboard.DefaultIfEmpty(), (z, leaderboard) => new { z.login, leaderboard } )
                        //    .Select(p => new ActivePlayerData()
                        //    {
                        //        PlayerName = p.login.Username,
                        //        Rank = p.leaderboard == null ? 0 : (int) Math.Floor(p.leaderboard.Rank)
                        //    })
                        //    .OrderBy(p => p.PlayerName)
                        //    .ToList();

                        //var loginStats = statsDB.StatsLeaderboards
                        //    .Join(activeLogins, p => p.LoginID, r => r.Id, ( p,
                        //    .Where(p => activeLogins.Select(r => r.Id).Contains(p.LoginID) == true).OrderBy(p => p.LoginUsername);
                        //returnValue = loginStats.ToList();
                    }

                    HttpRuntime.Cache.Add(cacheKey, returnValue, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 30), CacheItemPriority.Normal, null);
                }
            }

            return(returnValue);
        }
示例#6
0
        private void SaveTeams(ACSSAuth.DataAccess.CSSDataContext db, DataAccess.CSSStatsDataContext statsDB, ACSSAuth.Server.Data.GameDataset.GameRow gameRow, int gameIdentID)
        {
            foreach (Data.GameDataset.TeamRow teamRow in gameRow.GetTeamRows())
            {
                var commanderAlias   = DataAccess.Alias.GetAliasByCallsign(db, teamRow.Commander);
                int commanderLoginID = 0;

                if (commanderAlias != null)
                {
                    commanderLoginID = commanderAlias.Login.Id;
                }

                DataAccess.GameTeam team = new ACSSAuth.DataAccess.GameTeam()
                {
                    GameID                   = gameIdentID,
                    GameTeamCommander        = TrimString(teamRow.Commander, 49),
                    GameTeamCommanderLoginID = commanderLoginID,
                    GameTeamExpansion        = teamRow.ResearchedExpansion,
                    GameTeamFaction          = teamRow.Faction,
                    GameTeamID               = teamRow.TeamID,
                    GameTeamName             = TrimString(teamRow.TeamName, 49),
                    GameTeamNumber           = teamRow.TeamNumber,
                    GameTeamShipyard         = teamRow.ResearchedShipyard,
                    GameTeamStarbase         = teamRow.ResearchedStarbase,
                    GameTeamSupremacy        = teamRow.ResearchedSupremacy,
                    GameTeamTactical         = teamRow.ResearchedTactical,
                    GameTeamWinner           = teamRow.Won
                };

                statsDB.GameTeams.InsertOnSubmit(team);
                statsDB.SubmitChanges();

                foreach (Data.GameDataset.TeamMemberRow teamMemberRow in teamRow.GetTeamMemberRows())
                {
                    var teamMemberAlias = DataAccess.Alias.GetAliasByCallsign(db, teamMemberRow.Callsign);
                    int loginID         = 0;
                    if (teamMemberAlias != null)
                    {
                        loginID = teamMemberAlias.Login.Id;
                    }

                    DataAccess.GameTeamMember teamMember = new ACSSAuth.DataAccess.GameTeamMember()
                    {
                        GameTeamID             = team.GameTeamIdentID,
                        GameTeamMemberCallsign = TrimString(DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, teamMemberRow.Callsign), 49),
                        GameTeamMemberDuration = teamMemberRow.Duration,
                        GameTeamMemberLoginID  = loginID
                    };

                    statsDB.GameTeamMembers.InsertOnSubmit(teamMember);
                }

                statsDB.SubmitChanges();
            }
        }
示例#7
0
        private void SaveChatLog(ACSSAuth.DataAccess.CSSDataContext db, DataAccess.CSSStatsDataContext statsDB, ACSSAuth.Server.Data.GameDataset.GameRow gameRow, int gameIdentID)
        {
            foreach (Data.GameDataset.ChatLogRow chatLogRow in gameRow.GetChatLogRows())
            {
                DataAccess.GameChatLog chatLog = new ACSSAuth.DataAccess.GameChatLog()
                {
                    GameChatSpeakerName = TrimString(DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, chatLogRow.SpeakerName), 49),
                    GameChatTargetName  = TrimString(DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, chatLogRow.TargetName), 49),
                    GameChatText        = TrimString(chatLogRow.Text, 2063),
                    GameChatTime        = chatLogRow.ChatTime,
                    GameID = gameIdentID
                };

                statsDB.GameChatLogs.InsertOnSubmit(chatLog);
            }
        }
示例#8
0
        public void Calculate(DataAccess.CSSStatsDataContext statsDB, Game game)
        {
            List <GameTeamMember> winningCommanders = new List <GameTeamMember>();
            List <GameTeamMember> losingCommanders  = new List <GameTeamMember>();

            if (IsGameScorable(game) == false)
            {
                return;
            }

            foreach (var gameTeam in game.GameTeams)
            {
                foreach (var gameTeamMember in gameTeam.GameTeamMembers)
                {
                    if (IsPlayerIsValidToScore(statsDB, game, gameTeamMember) == false)
                    {
                        continue;
                    }

                    int playerLevel = GetLevel(statsDB, gameTeamMember);
                    int avgWinXp    = 0;
                    int avgLossXp   = 0;
                    int winCount    = 0;
                    int lossCount   = 0;

                    foreach (var opposingTeamMember in gameTeam.GameTeamMembers.Where(p => p != gameTeamMember))
                    {
                        if (IsPlayerIsValidToScore(statsDB, game, opposingTeamMember) == false)
                        {
                            continue;
                        }


                        if (gameTeamMember.Score > opposingTeamMember.Score)
                        {
                            avgWinXp += GetXp(statsDB, opposingTeamMember);
                            winCount++;
                        }
                        else if (gameTeamMember.Score < opposingTeamMember.Score)
                        {
                            avgLossXp += GetXp(statsDB, opposingTeamMember);
                            lossCount++;
                        }
                    }

                    int winXpAdjustment  = 0;
                    int lossXpAdjustment = 0;
                    int playerXp         = GetXp(statsDB, gameTeamMember);

                    if (winCount > 0)
                    {
                        int avgWinLevel        = GetLevel(statsDB, (int)(avgWinXp / winCount));
                        int winLevelDifference = GetLevelDifference(statsDB, playerXp, (int)(avgWinXp / winCount));
                        winXpAdjustment = GetRankAdjustment(statsDB, playerLevel, winLevelDifference, true);
                    }

                    if (lossCount > 0)
                    {
                        int avgLossLevel        = GetLevel(statsDB, (int)(avgLossXp / lossCount));
                        int lossLevelDifference = GetLevelDifference(statsDB, playerXp, (int)(avgLossXp / lossCount));
                        lossXpAdjustment = GetRankAdjustment(statsDB, playerLevel, lossLevelDifference, false);
                    }

                    int totalPlayerXpAdjustment = winXpAdjustment - lossXpAdjustment;

                    if (gameTeam.GameTeamCommanderLoginID == gameTeamMember.GameTeamMemberLoginID)
                    {
                        if (gameTeam.GameTeamWinner == true)
                        {
                            winningCommanders.Add(gameTeamMember);
                        }
                        else
                        {
                            losingCommanders.Add(gameTeamMember);
                        }
                    }

                    SetXp(statsDB, gameTeamMember, totalPlayerXpAdjustment);
                }
            }

            // Calculate commander's XP bonuses.
            // Commander's games count twice. Once for thier performance vs. thier own team, and
            // once for thier performance against the opposing commander. If it's a multi-team game,
            // then each match up between comms is counted. If it's a 3 way, and you win vs. two comms, then
            // you get rewards for beating both. If you loose, you only lose to the winner.
            int averageWinningComamanderXp = GetAverageXp(statsDB, winningCommanders);
            int averageLosingComamanderXp  = GetAverageXp(statsDB, losingCommanders);

            foreach (var commander in winningCommanders)
            {
                var commanderXp     = GetXp(statsDB, commander);
                var commanderLevel  = GetLevel(statsDB, commander);
                int levelDifference = GetLevelDifference(statsDB, commanderXp, averageLosingComamanderXp);
                var xpAdjustment    = GetRankAdjustment(statsDB, commanderLevel, levelDifference, true);

                SetXp(statsDB, commander, xpAdjustment);
            }

            foreach (var commander in losingCommanders)
            {
                var commanderXp     = GetXp(statsDB, commander);
                var commanderLevel  = GetLevel(statsDB, commander);
                int levelDifference = GetLevelDifference(statsDB, commanderXp, averageWinningComamanderXp);
                var xpAdjustment    = GetRankAdjustment(statsDB, commanderLevel, levelDifference, false);

                SetXp(statsDB, commander, -1 * xpAdjustment);
            }
        }
示例#9
0
        public int SaveGameData(string gameData, bool isCompressedAndBase64Encoded, out string message)
        {
            try
            {
                Data.GameDataset gameDataset = new Data.GameDataset();
                //gameDataset.EnforceConstraints = false;
                //gameDataset.

                if (isCompressedAndBase64Encoded == true)
                {
                    byte[] binaryGameData = Convert.FromBase64String(gameData);

                    MemoryStream memoryStream = new MemoryStream(binaryGameData);
                    ICSharpCode.SharpZipLib.GZip.GZipInputStream zipStream = new ICSharpCode.SharpZipLib.GZip.GZipInputStream(memoryStream);
                    StreamReader streamReader = new StreamReader(zipStream, System.Text.Encoding.Unicode);
                    //string gameDataXml = streamReader.ReadToEnd();


                    gameDataset.ReadXml(streamReader, System.Data.XmlReadMode.IgnoreSchema);
                }
                else
                {
                    //gameDataset.ReadXml(new StringReader(gameData));
                    gameDataset.ReadXml(new StringReader(gameData), System.Data.XmlReadMode.IgnoreSchema);
                }

                if (String.IsNullOrEmpty(Settings.Default.TagLastGameDataXmlFileLogLocation) == false)
                {
                    File.WriteAllText(Path.Combine(Settings.Default.TagLastGameDataXmlFileLogLocation, Guid.NewGuid().ToString() + ".xml"), gameDataset.GetXml());
                }

                string currentIPAddress;

                if (OperationContext.Current != null)
                {
                    //http://nayyeri.net/detect-client-ip-in-wcf-3-5
                    OperationContext              context           = OperationContext.Current;
                    MessageProperties             messageProperties = context.IncomingMessageProperties;
                    RemoteEndpointMessageProperty endpointProperty  = (RemoteEndpointMessageProperty)messageProperties[RemoteEndpointMessageProperty.Name];

                    currentIPAddress = endpointProperty.Address;
                }
                else
                {
                    currentIPAddress = "127.0.0.1";                     // Supports unit tests.
                }
                int gameID = 0;

                using (DataAccess.CSSDataContext db = new DataAccess.CSSDataContext())
                {
                    using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
                    {
                        var gameServer = statsDB.GameServers.FirstOrDefault(p => p.GameServerIPs.Where(r => r.IPAddress == currentIPAddress).Count() > 0);

                        if (gameServer == null)
                        {
                            throw new Exception("You may not upload data from this address: " + currentIPAddress);
                        }

                        try
                        {
                            foreach (Data.GameDataset.GameRow gameRow in gameDataset.Game)
                            {
                                gameID = SaveGame(db, statsDB, gameServer, gameRow);
                            }
                        }
                        catch (Exception ex)
                        {
                            if (String.IsNullOrEmpty(Settings.Default.TagExceptionLogFileName) == false)
                            {
                                File.AppendAllText(Settings.Default.TagExceptionLogFileName, DateTime.Now.ToString() + ": " + ex.ToString() + "\n\n\n");
                            }

                            throw;
                        }

                        statsDB.SubmitChanges();
                        db.SubmitChanges();
                    }
                }

                // Update AllegSkill rank.
                AllegSkill.Calculator.UpdateAllegSkillForGame(gameID);

                // Update Prestige Rank.
                using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
                {
                    var game = statsDB.Games.FirstOrDefault(p => p.GameIdentID == gameID);
                    if (game == null)
                    {
                        Error.Write(new Exception("Tag.SaveGameData(): Couldn't get game for GameID: " + gameID));
                    }
                    else
                    {
                        PrestigeRankCalculator psc = new PrestigeRankCalculator();
                        psc.Calculate(statsDB, game);
                    }
                }

                message = "Game saved.";
                return(gameID);
            }
            catch (Exception ex)
            {
                message = ex.ToString();
                return(-1);
            }
        }
示例#10
0
        private void SaveGameEvents(Allegiance.CommunitySecuritySystem.DataAccess.CSSDataContext db, DataAccess.CSSStatsDataContext statsDB, Allegiance.CommunitySecuritySystem.Server.Data.GameDataset.GameRow gameRow, int gameIdentID)
        {
            foreach (Data.GameDataset.GameEventRow gameEventRow in gameRow.GetGameEventRows())
            {
                int performerLoginID = 0;
                int targetLoginID    = 0;

                try
                {
                    var performerAlias = DataAccess.Alias.GetAliasByCallsign(db, gameEventRow.PerformerName);

                    if (performerAlias != null)
                    {
                        performerLoginID = performerAlias.Login.Id;
                    }

                    var targetAlias = DataAccess.Alias.GetAliasByCallsign(db, gameEventRow.TargetName);

                    if (targetAlias != null)
                    {
                        targetLoginID = targetAlias.Login.Id;
                    }

                    DataAccess.GameEvent gameEvent = new DataAccess.GameEvent()
                    {
                        GameEventTime             = gameEventRow.EventTime,
                        GameID                    = gameIdentID,
                        GameEventIndirectID       = gameEventRow.IndirectID,
                        GameEventIndirectName     = TrimString(DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.IndirectName), 254),
                        GameEventPerformerID      = gameEventRow.PerformerID,
                        GameEventPerformerName    = TrimString(DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.PerformerName), 254),
                        GameEventPerformerLoginID = performerLoginID,
                        GameEventTargetID         = gameEventRow.TargetID,
                        GameEventTargetName       = TrimString(DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.TargetName), 254),
                        GameEventTargetLoginID    = targetLoginID,
                        EventID                   = gameEventRow.EventID
                    };

                    statsDB.GameEvents.InsertOnSubmit(gameEvent);

                    statsDB.SubmitChanges();
                }
                catch (Exception ex)
                {
                    string errorDetails = String.Format(@"SaveGameEvents(): Insert error! 
		gameIdentID = {0},
		gameEventRow.EventID = {1},
		gameEventRow.EventTime = {2},
		gameEventRow.GameID = {3},
		gameEventRow.IndirectID = {4},
		gameEventRow.IndirectName = {5},
		gameEventRow.PerformerID = {6},
		gameEventRow.PerformerName = {7},
		gameEventRow.TargetID = {8},
		gameEventRow.TargetName = {9},
		performerLoginID = {10},
		targetLoginID = {11},
		DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.IndirectName) = {12},
		DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.PerformerName) = {13},
		DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.TargetName) = {14}
		===================================================
{15}
",
                                                        gameIdentID,
                                                        gameEventRow.EventID,
                                                        gameEventRow.EventTime,
                                                        gameEventRow.GameID,
                                                        gameEventRow.IndirectID,
                                                        gameEventRow.IndirectName,
                                                        gameEventRow.PerformerID,
                                                        gameEventRow.PerformerName,
                                                        gameEventRow.TargetID,
                                                        gameEventRow.TargetName,
                                                        performerLoginID,
                                                        targetLoginID,
                                                        DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.IndirectName),
                                                        DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.PerformerName),
                                                        DataAccess.Alias.GetCallsignFromStringWithTokensAndTags(db, gameEventRow.TargetName),
                                                        ex.ToString());

                    if (String.IsNullOrEmpty(Settings.Default.TagExceptionLogFileName) == false)
                    {
                        File.AppendAllText(Settings.Default.TagExceptionLogFileName, DateTime.Now.ToString() + ": " + errorDetails + "\n\n\n");
                    }
                }
            }
        }
示例#11
0
        private int SaveGame(DataAccess.CSSDataContext db, DataAccess.CSSStatsDataContext statsDB, DataAccess.GameServer gameServer, Data.GameDataset.GameRow gameRow)
        {
            DataAccess.Game game = new Allegiance.CommunitySecuritySystem.DataAccess.Game()
            {
                GameDefections     = gameRow.AllowDefections,
                GameDevelopments   = gameRow.AllowDevelopments,
                GameShipyards      = gameRow.AllowShipyards,
                GameConquest       = gameRow.Conquest,
                GameCore           = TrimString(gameRow.CoreFile, 50),
                GameDeathMatch     = gameRow.DeathMatch,
                GameDeathmatchGoal = gameRow.DeathmatchGoal,
                GameEndTime        = gameRow.EndTime,
                GameFriendlyFire   = gameRow.FriendlyFire,
                GameName           = TrimString(gameRow.GameName, 254),
                GameInvulStations  = gameRow.InvulnerableStations,
                GameMap            = TrimString(gameRow.MapName, 49),
                GameMaxImbalance   = gameRow.MaxImbalance,
                GameResources      = gameRow.Resources,
                GameRevealMap      = gameRow.RevealMap,
                GameSquadGame      = gameRow.SquadGame,
                GameStartingMoney  = gameRow.StartingMoney,
                GameStartTime      = gameRow.StartTime,
                GameStatsCount     = gameRow.StatsCount,
                GameTotalMoney     = gameRow.TotalMoney,
                GameID             = gameRow.GameID,
                GameServer         = gameServer.GameServerID
            };

            statsDB.Games.InsertOnSubmit(game);

            try
            {
                statsDB.SubmitChanges();
            }
            catch (Exception ex)
            {
                string dbLengthErrors = Utilities.LinqErrorDetector.AnalyzeDBChanges(statsDB);
                throw new Exception("CSSStats[games]: DB Error, Linq Length Analysis: " + dbLengthErrors + "\r\n", ex);
            }

            SaveGameEvents(db, statsDB, gameRow, game.GameIdentID);

            SaveTeams(db, statsDB, gameRow, game.GameIdentID);

            SaveChatLog(db, statsDB, gameRow, game.GameIdentID);

            try
            {
                statsDB.SubmitChanges();
            }
            catch (Exception ex)
            {
                string dbLengthErrors = Utilities.LinqErrorDetector.AnalyzeDBChanges(statsDB);
                throw new Exception("CSSStats[game data]: DB Error, Linq Length Analysis: " + dbLengthErrors + "\r\n", ex);
            }

            try
            {
                db.SubmitChanges();
            }
            catch (Exception ex)
            {
                string dbLengthErrors = Utilities.LinqErrorDetector.AnalyzeDBChanges(db);
                throw new Exception("CSS DB Error, Linq Length Analysis: " + dbLengthErrors + "\r\n", ex);
            }

            statsDB.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues, game);

            UpdateLeaderboard(game.GameIdentID);

            UpdateFactionStats(game.GameIdentID);

            UpdateMetrics(game.GameIdentID);

            statsDB.SubmitChanges();
            db.SubmitChanges();

            return(game.GameIdentID);
        }
示例#12
0
        public void Calculate(DataAccess.CSSStatsDataContext statsDB, Game game)
        {
            List <GameTeamMember> winningCommanders = new List <GameTeamMember>();
            List <GameTeamMember> losingCommanders  = new List <GameTeamMember>();

            if (IsGameScorable(game) == false)
            {
                return;
            }

            foreach (var gameTeam in game.GameTeams)
            {
                ///////////////////////////////////////////////////////////////
                // Calculate the average of all opposing team members.
                int   opposingTeamCount      = 0;
                float opposingTeamPRankTotal = 0;
                float opposingTeamAvgPRank   = 0;
                foreach (var opposingTeam in game.GameTeams)
                {
                    if (opposingTeam == gameTeam)
                    {
                        continue;
                    }

                    opposingTeamPRankTotal += opposingTeam.AveragePRank;
                    opposingTeamCount++;
                }

                if (opposingTeamCount > 0)
                {
                    opposingTeamAvgPRank = opposingTeamPRankTotal / opposingTeamCount;
                }

                ///////////////////////////////////////////////////
                // Get the game team member's XP adjustment
                foreach (var gameTeamMember in gameTeam.GameTeamMembers)
                {
                    if (IsPlayerIsValidToScore(statsDB, game, gameTeamMember) == false)
                    {
                        continue;
                    }

                    int playerLevel = GetLevel(statsDB, gameTeamMember);

                    if (playerLevel < 1)
                    {
                        playerLevel = 1;
                    }

                    float rankRatio = opposingTeamAvgPRank / playerLevel;

                    int totalPlayerXpAdjustment = gameTeamMember.Score;

                    if (gameTeam.GameTeamCommanderLoginID == gameTeamMember.GameTeamMemberLoginID)
                    {
                        if (gameTeam.GameTeamWinner == true)
                        {
                            totalPlayerXpAdjustment += WinningCommanderBonusPoints + (TeamMemberBonusPoints * gameTeam.GameTeamMembers.Count);
                        }
                        else
                        {
                            totalPlayerXpAdjustment += LosingCommanderBonusPoints + (TeamMemberBonusPoints * gameTeam.GameTeamMembers.Count);
                        }
                    }

                    // Add bonus for minutes played.
                    totalPlayerXpAdjustment += (int)(gameTeamMember.GameTeamMemberDuration / 60.0 * BonusPointsPerMinute);

                    // Adjust the XP for the rank offset: playing against a bunch of nubbins doesn't count for that much.
                    // beating a bunch of vets sends your XP way up!
                    totalPlayerXpAdjustment = (int)(totalPlayerXpAdjustment * rankRatio);

                    SetXp(statsDB, gameTeamMember, totalPlayerXpAdjustment);
                }
            }

            //// Calculate commander's XP bonuses.
            //// Commander's games count twice. Once for thier performance vs. thier own team, and
            //// once for thier performance against the opposing commander. If it's a multi-team game,
            //// then each match up between comms is counted. If it's a 3 way, and you win vs. two comms, then
            //// you get rewards for beating both. If you loose, you only lose to the winner.
            //int averageWinningComamanderXp = GetAverageXp(statsDB, winningCommanders);
            //int averageLosingComamanderXp = GetAverageXp(statsDB, losingCommanders);

            //foreach (var commander in winningCommanders)
            //{
            //    var commanderXp = GetXp(statsDB, commander);
            //    var commanderLevel = GetLevel(statsDB, commander);
            //    int levelDifference = GetLevelDifference(statsDB, commanderXp, averageLosingComamanderXp);
            //    var xpAdjustment = GetRankAdjustment(statsDB, commanderLevel, levelDifference, true);

            //    SetXp(statsDB, commander, xpAdjustment);
            //}

            //foreach (var commander in losingCommanders)
            //{
            //    var commanderXp = GetXp(statsDB, commander);
            //    var commanderLevel = GetLevel(statsDB, commander);
            //    int levelDifference = GetLevelDifference(statsDB, commanderXp, averageWinningComamanderXp);
            //    var xpAdjustment = GetRankAdjustment(statsDB, commanderLevel, levelDifference, false);

            //    SetXp(statsDB, commander, -1 * xpAdjustment);
            //}
        }
        private void BindData()
        {
            using (var db = new DataAccess.CSSStatsDataContext())
            {
                var allFactionNames = db.StatsFactions
                                      .Select(p => new { FactionName = p.WinFactionName })
                                      .Union
                                      (
                    db.StatsFactions.Select(p => new { FactionName = p.LossFactionName })
                                      ).Distinct().OrderBy(p => p.FactionName);

                List <Data.FactionData> allFactionData = new List <Allegiance.CommunitySecuritySystem.Management.Stats.Data.FactionData>();

                foreach (var winFactionName in allFactionNames)
                {
                    Data.FactionData factionData = new Allegiance.CommunitySecuritySystem.Management.Stats.Data.FactionData();
                    factionData.Name  = winFactionName.FactionName;
                    factionData.Stats = String.Empty;

                    int index = 0;
                    foreach (var lossFactionName in allFactionNames)
                    {
                        if (winFactionName.FactionName.Equals(lossFactionName.FactionName, StringComparison.InvariantCultureIgnoreCase) == true)
                        {
                            factionData.Stats += "<td>--</td>";
                        }
                        else
                        {
                            var winTotal = db.StatsFactions
                                           .Where(p => p.WinFactionName == winFactionName.FactionName && p.LossFactionName == lossFactionName.FactionName)
                                           .GroupBy(p => new { p.WinFactionName, p.LossFactionName })
                                           .Select(p => p.Sum(r => r.GamesPlayed)).FirstOrDefault();

                            var lossTotal = db.StatsFactions
                                            .Where(p => p.WinFactionName == lossFactionName.FactionName && p.LossFactionName == winFactionName.FactionName)
                                            .GroupBy(p => new { p.WinFactionName, p.LossFactionName })
                                            .Select(p => p.Sum(r => r.GamesPlayed)).FirstOrDefault();

                            if (winTotal + lossTotal == 0)
                            {
                                factionData.Stats += "<td>--</td>";
                            }
                            else
                            {
                                factionData.Stats += String.Format("<td>{0:p}</td>", (decimal)winTotal / (lossTotal + winTotal));
                            }
                        }

                        index++;
                    }

                    allFactionData.Add(factionData);
                }

                rptFactionHeaders.DataSource = allFactionData;
                rptFactionHeaders.DataBind();

                rptFactionRow.DataSource = allFactionData;
                rptFactionRow.DataBind();
            }
        }
        public static void UpdateAllegSkillForGame(int gameID)
        {
            //using(DataAccess.CSSDataContext db = new DataAccess.CSSDataContext())
            //{
                using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
                {
                    statsDB.ASGSServiceUpdateASRankings(gameID, 0);

                //	var allegSkillGamePlayerStats = statsDB.AS_GamePlayerAs.Where(p => p.GameID == gameID);

                //    var game = statsDB.Games.FirstOrDefault(p => p.GameID == gameID);

                //    // AllegSkill only supports two teams currently.
                //    if (game.GameTeams.Count() != 2)
                //        return;

                //    foreach (DataAccess.GameTeam team in game.GameTeams)
                //    {
                //        foreach (DataAccess.GameTeamMember teamMember in team.GameTeamMembers)
                //        {

                //            DataAccess.Alias alias = DataAccess.Alias.GetAliasByCallsign(db, teamMember.GameTeamMemeberCallsign);
                //            if (alias != null)
                //            {
                //                float mu;
                //                float sigma;
                //                float commandMu;
                //                float commandSigma;
                //                float stackRating;
                //                int rank;
                //                int commandRank;

                //                // TODO: Baker: perform AllegSkill calculations for each team member.
                //                // ---- Just some dummy code for now. -----

                //                Random random = new Random();

                //                mu = random.Next(20, 30);
                //                sigma = random.Next(-5, 5);
                //                commandMu = random.Next(20, 30);
                //                commandSigma = random.Next(-5, 5);
                //                stackRating = random.Next(-10, 10);
                //                rank = random.Next(0, 20);
                //                commandRank = random.Next(0, 20);

                //                // ---- End dummy code ----

                //                // Save the finished calculaitons.
                //                using (DataAccess.CSSStatsDataContext statsDB = new Allegiance.CommunitySecuritySystem.DataAccess.CSSStatsDataContext())
                //                {
                //                    DataAccess.StatsLeaderboard leaderboard = statsDB.StatsLeaderboards.FirstOrDefault(p => p.LoginUsername == alias.Login.Username);
                //                    if (leaderboard != null)
                //                    {
                //                        leaderboard.CommandMu = commandMu;
                //                        leaderboard.CommandSigma = commandSigma;
                //                        leaderboard.Mu = mu;
                //                        leaderboard.Sigma = sigma;
                //                        leaderboard.StackRating = stackRating;
                //                        leaderboard.Rank = rank;
                //                        leaderboard.CommandRank = commandRank;
                //                    }

                //                    statsDB.SubmitChanges();
                //                }
                //            }
                //        }
                //    }

                //    db.SubmitChanges();
                //}
            }
        }
示例#15
0
        private int GetLevel(DataAccess.CSSStatsDataContext statsDB, GameTeamMember gameTeamMember)
        {
            int xp = GetXp(statsDB, gameTeamMember);

            return(GetLevel(statsDB, xp));
        }
示例#16
0
        public static void UpdateAllegSkillForGame(int gameID)
        {
            //using(DataAccess.CSSDataContext db = new DataAccess.CSSDataContext())
            //{
            using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
            {
                statsDB.ASGSServiceUpdateASRankings(gameID, 0);

                //	var allegSkillGamePlayerStats = statsDB.AS_GamePlayerAs.Where(p => p.GameID == gameID);

                //    var game = statsDB.Games.FirstOrDefault(p => p.GameID == gameID);

                //    // AllegSkill only supports two teams currently.
                //    if (game.GameTeams.Count() != 2)
                //        return;

                //    foreach (DataAccess.GameTeam team in game.GameTeams)
                //    {
                //        foreach (DataAccess.GameTeamMember teamMember in team.GameTeamMembers)
                //        {

                //            DataAccess.Alias alias = DataAccess.Alias.GetAliasByCallsign(db, teamMember.GameTeamMemeberCallsign);
                //            if (alias != null)
                //            {
                //                float mu;
                //                float sigma;
                //                float commandMu;
                //                float commandSigma;
                //                float stackRating;
                //                int rank;
                //                int commandRank;

                //                // TODO: Baker: perform AllegSkill calculations for each team member.
                //                // ---- Just some dummy code for now. -----

                //                Random random = new Random();

                //                mu = random.Next(20, 30);
                //                sigma = random.Next(-5, 5);
                //                commandMu = random.Next(20, 30);
                //                commandSigma = random.Next(-5, 5);
                //                stackRating = random.Next(-10, 10);
                //                rank = random.Next(0, 20);
                //                commandRank = random.Next(0, 20);

                //                // ---- End dummy code ----

                //                // Save the finished calculaitons.
                //                using (DataAccess.CSSStatsDataContext statsDB = new ACSSAuth.DataAccess.CSSStatsDataContext())
                //                {
                //                    DataAccess.StatsLeaderboard leaderboard = statsDB.StatsLeaderboards.FirstOrDefault(p => p.LoginUsername == alias.Login.Username);
                //                    if (leaderboard != null)
                //                    {
                //                        leaderboard.CommandMu = commandMu;
                //                        leaderboard.CommandSigma = commandSigma;
                //                        leaderboard.Mu = mu;
                //                        leaderboard.Sigma = sigma;
                //                        leaderboard.StackRating = stackRating;
                //                        leaderboard.Rank = rank;
                //                        leaderboard.CommandRank = commandRank;
                //                    }

                //                    statsDB.SubmitChanges();
                //                }
                //            }
                //        }
                //    }

                //    db.SubmitChanges();
                //}
            }
        }
        public int SaveGameData(string gameData, bool isCompressedAndBase64Encoded, out string message)
        {
            try
            {
                Data.GameDataset gameDataset = new Data.GameDataset();
                //gameDataset.EnforceConstraints = false;
                //gameDataset.

                if (isCompressedAndBase64Encoded == true)
                {
                    byte[] binaryGameData = Convert.FromBase64String(gameData);

                    MemoryStream memoryStream = new MemoryStream(binaryGameData);
                    ICSharpCode.SharpZipLib.GZip.GZipInputStream zipStream = new ICSharpCode.SharpZipLib.GZip.GZipInputStream(memoryStream);
                    StreamReader streamReader = new StreamReader(zipStream, System.Text.Encoding.Unicode);
                    //string gameDataXml = streamReader.ReadToEnd();

                    gameDataset.ReadXml(streamReader, System.Data.XmlReadMode.IgnoreSchema);
                }
                else
                {
                    //gameDataset.ReadXml(new StringReader(gameData));
                    gameDataset.ReadXml(new StringReader(gameData), System.Data.XmlReadMode.IgnoreSchema);
                }

                if (String.IsNullOrEmpty(Settings.Default.TagLastGameDataXmlFileLogLocation) == false)
                    File.WriteAllText(Path.Combine(Settings.Default.TagLastGameDataXmlFileLogLocation, Guid.NewGuid().ToString() + ".xml"), gameDataset.GetXml());

                string currentIPAddress;

                if (OperationContext.Current != null)
                {
                    //http://nayyeri.net/detect-client-ip-in-wcf-3-5
                    OperationContext context = OperationContext.Current;
                    MessageProperties messageProperties = context.IncomingMessageProperties;
                    RemoteEndpointMessageProperty endpointProperty = (RemoteEndpointMessageProperty)messageProperties[RemoteEndpointMessageProperty.Name];

                    currentIPAddress = endpointProperty.Address;
                }
                else
                    currentIPAddress = "127.0.0.1"; // Supports unit tests.

                int gameID = 0;

                using (DataAccess.CSSDataContext db = new DataAccess.CSSDataContext())
                {
                    using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
                    {
                        var gameServer = statsDB.GameServers.FirstOrDefault(p => p.GameServerIPs.Where(r => r.IPAddress == currentIPAddress).Count() > 0);

                        if (gameServer == null)
                            throw new Exception("You may not upload data from this address: " + currentIPAddress);

                        try
                        {
                            foreach (Data.GameDataset.GameRow gameRow in gameDataset.Game)
                                gameID = SaveGame(db, statsDB, gameServer, gameRow);
                        }
                        catch (Exception ex)
                        {
                            if (String.IsNullOrEmpty(Settings.Default.TagExceptionLogFileName) == false)
                                File.AppendAllText(Settings.Default.TagExceptionLogFileName, DateTime.Now.ToString() + ": " + ex.ToString() + "\n\n\n");

                            throw;
                        }

                        statsDB.SubmitChanges();
                        db.SubmitChanges();
                    }
                }

                // Update AllegSkill rank.
                AllegSkill.Calculator.UpdateAllegSkillForGame(gameID);

                // Update Prestige Rank.
                using (DataAccess.CSSStatsDataContext statsDB = new DataAccess.CSSStatsDataContext())
                {
                    var game = statsDB.Games.FirstOrDefault(p => p.GameIdentID == gameID);
                    if (game == null)
                    {
                        Error.Write(new Exception("Tag.SaveGameData(): Couldn't get game for GameID: " + gameID));
                    }
                    else
                    {
                        PrestigeRankCalculator psc = new PrestigeRankCalculator();
                        psc.Calculate(statsDB, game);
                    }
                }

                message = "Game saved.";
                return gameID;
            }
            catch (Exception ex)
            {
                message = ex.ToString();
                return -1;
            }
        }