private static void LoadPlayers() { lock (players) { if (players.Count > 0) { players.Clear(); } string playersCodePath = hastingsDir + "code/players"; string[] records = Directory.GetFiles(playersCodePath, "*.record", SearchOption.AllDirectories); foreach (string record in records) { HastingsPlayer player = new HastingsPlayer(); using (StreamReader reader = new StreamReader(record)) { player.Name = reader.ReadLine(); player.Wins = int.Parse(reader.ReadLine()); player.Losses = int.Parse(reader.ReadLine()); player.Draws = int.Parse(reader.ReadLine()); player.Uploads = int.Parse(reader.ReadLine()); reader.Close(); } if (!players.ContainsKey(player.Name)) { players.Add(player.Name, player); } } // Load player code playerFiles.Clear(); string[] files = Directory.GetFiles(hastingsDir + "code/players"); foreach (string file in files) { playerFiles.Add(file); } } }
private static HastingsPlayer FindPlayer(Assignment assignment) { HastingsPlayer player = null; foreach (string file in assignment.FileNames) { if (file.Contains(".h")) { player = new HastingsPlayer(assignment.Path + file); if (players.ContainsKey(player.Name)) { player = players[player.Name]; } } } return(player); }
public static string BuildHastings(Assignment assignment) { string result = string.Empty; lock (players) { // find player that uploaded new code HastingsPlayer newPlayer = FindPlayer(assignment); if (newPlayer.Name.ToLower() == "ultron") { result = "<p>Ultron was defeated by Vision. You must change your class name!</p>"; } else if (newPlayer != null) { // Copy all code to tmp directory List <string> sourceFiles = new List <string>(); List <string> includeDirs = new List <string>(); includeDirs.Add(assignment.Path); includeDirs.Add(hastingsDir + "code/"); includeDirs.Add(hastingsDir + "code/players/"); foreach (string file in hastingsFiles) { if (file.Contains(".cpp")) { sourceFiles.Add(file); } } foreach (string file in playerFiles) { if (file.Contains(".cpp")) { sourceFiles.Add(file); } } foreach (string file in assignment.FileNames) { if (file.Contains(".cpp")) { sourceFiles.Add(assignment.Path + file); } } // Compile all *.cpp in tmp directory string compileResult = Compiler.CompileCpp("hastings", assignment.Path, includeDirs, sourceFiles); if (compileResult == "Success!!") { if (players.ContainsKey(newPlayer.Name)) { players.Remove(newPlayer.Name); } players.Add(newPlayer.Name, newPlayer); // delete win loss record for player newPlayer.Wins = 0; newPlayer.Losses = 0; newPlayer.Draws = 0; newPlayer.Uploads++; SavePlayers(); // if successful, copy code to hastings directory foreach (string file in assignment.FileNames) { if (File.Exists(hastingsDir + "code/players/" + file)) { File.Delete(hastingsDir + "code/players/" + file); } File.Copy(assignment.Path + file, hastingsDir + "code/players/" + file); } LoadPlayers(); WriteSoldierFile(); WritePlayerInfoFile(); // rebuild hastings binary sourceFiles.Clear(); includeDirs.Clear(); includeDirs.Add(hastingsDir + "code/"); foreach (string file in hastingsFiles) { if (file.Contains(".cpp")) { sourceFiles.Add(file); } } foreach (string file in playerFiles) { if (file.Contains(".cpp")) { sourceFiles.Add(file); } } string compileOutput = Compiler.CompileCpp(hastingsDir + "hastings", hastingsDir, includeDirs, sourceFiles); Logger.Trace("Rebuild hastings: {0}", compileOutput); } else { result = compileResult; } } else { result = "Unknown player"; } } if (!string.IsNullOrEmpty(result)) { result = "<p>" + result + "</p>"; } return(result); }