static void Main(string[] args) { string appPath = Environment.CurrentDirectory; if (args.Contains("-server")) { // Init the database Legal.RefreshMGDB(string.Empty); var server1 = new Server(); server1.Server_start(7272, "legality_check", false); var server2 = new Server(); server2.Server_start(7273, "info_get", false); var server3 = new Server(); server3.Server_start(7274, "legal_fix", true); } else { Initialize(args); if (args.Contains("-l")) { // Legality API calls var lc = new LegalityCheck(pk); if (args.Contains("--verbose")) { Console.WriteLine(lc.VerboseReport); } else { Console.WriteLine(lc.Report); } } if (args.Contains("-alm")) { if (!args.Contains("--version")) { Console.WriteLine("Specify version with the [--version] tag"); } else { var alm = new AutoLegality(pk, args[Array.IndexOf(args, "--version") + 1]); if (alm != null) { if (!args.Contains("-o")) { string output = Util.CleanFileName(alm.GetLegalPKM().FileName); File.WriteAllBytes(Path.Combine(appPath, "output", output), alm.GetLegalPKM().DecryptedBoxData); } else { string output = GetOutputPath(args); File.WriteAllBytes(output, alm.GetLegalPKM().DecryptedBoxData); } } else { Console.WriteLine("Invalid version"); } } } } }
public void Handle_connection(IAsyncResult result) //the parameter is a delegate, used to communicate between threads { Accept_connection(); //once again, checking for any other incoming connections TcpClient client = server.EndAcceptTcpClient(result); //creates the TcpClient NetworkStream ns = client.GetStream(); while (client.Connected) //while the client is connected, we look for incoming messages { try { byte[] generationBytes = new byte[8]; ns.Read(generationBytes, 0, generationBytes.Length); string generationStr = Encoding.UTF8.GetString(generationBytes, 0, generationBytes.Length); int.TryParse(generationStr, out int generation); //Console.WriteLine("Generation sent over is: " + generationStr); byte[] versionBytes = new byte[8]; string version = ""; if (type == "legal_fix") { ns.Read(versionBytes, 0, versionBytes.Length); version = Encoding.UTF8.GetString(versionBytes, 0, versionBytes.Length); Console.WriteLine("Version sent over is: " + version); } byte[] size = new byte[8]; ns.Read(size, 0, size.Length); string dataSizeStr = Encoding.UTF8.GetString(size, 0, size.Length); int.TryParse(dataSizeStr, out int dataSize); byte[] msg = new byte[dataSize]; //the messages arrive as byte array ns.Read(msg, 0, msg.Length); //the same networkstream reads the message sent by the client var pk = PKMConverter.GetPKMfromBytes(msg, generation); if (type == "legality_check") { var lc = new LegalityCheck(pk); byte[] report = Encoding.Default.GetBytes(lc.Report); ns.Write(report, 0, report.Length); ns.Flush(); } else if (type == "info_get") { string data = ""; data += pk.Nickname.ToString() + "," + pk.OT_Name.ToString() + "," + pk.CurrentLevel.ToString() + "," + pk.Species.ToString() + ","; foreach (int move in pk.Moves) { data += move.ToString() + ","; } data += pk.Nature.ToString() + "," + pk.IV_HP.ToString() + "," + pk.IV_ATK.ToString() + "," + pk.IV_DEF.ToString() + "," + pk.IV_SPD.ToString() + "," + pk.IV_SPE + "," + pk.IV_SPA + "," + pk.Gender.ToString() + "," + pk.IsShiny.ToString() + "," + pk.Ability.ToString() + "," + pk.HeldItem.ToString() + "," + pk.TID.ToString() + "," + pk.Ball.ToString() + "," + pk.PKRS_Infected.ToString(); data += "," + pk.SIZE_STORED.ToString(); if (pk.GetType() == typeof(PK4)) { data += ",4"; } else if (pk.GetType() == typeof(PK5)) { data += ",5"; } else if (pk.GetType() == typeof(PK6)) { data += ",6"; } else if (pk.GetType() == typeof(PK7)) { data += ",7"; } else if (pk.GetType() == typeof(PB7)) { data += ",LGPE"; } byte[] info = Encoding.UTF8.GetBytes(data); ns.Write(info, 0, info.Length); ns.Flush(); } else if (type == "legal_fix") { var alm = new AutoLegality(pk, version); ns.Write(alm.GetLegalPKM().DecryptedBoxData, 0, alm.GetLegalPKM().DecryptedBoxData.Length); } client.Close(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); byte[] err = Encoding.Default.GetBytes("Not a Pokemon!"); ns.Write(err, 0, err.Length); ns.Flush(); client.Close(); } } }
public void Handle_connection(IAsyncResult result) //the parameter is a delegate, used to communicate between threads { Accept_connection(); //once again, checking for any other incoming connections TcpClient client = server.EndAcceptTcpClient(result); //creates the TcpClient NetworkStream ns = client.GetStream(); while (client.Connected) //while the client is connected, we look for incoming messages { try { if (type != "bot_info") { string version = ""; if (type == "legal_fix") { byte[] versionBytes = Read_NS_Data(ns, 8); version = Encoding.UTF8.GetString(versionBytes, 0, versionBytes.Length); Console.WriteLine("Version sent over is: " + version); } var pk = GetPokemon(ns); if (pk == null) { throw new System.ArgumentException("There was an issue reading the Pokemon data, is it not a Pokemon? (or maybe timeout?)"); } if (type == "legality_check") { var lc = new LegalityAnalysis(pk); byte[] report = Encoding.Default.GetBytes(lc.Report()); ns.Write(report, 0, report.Length); } else if (type == "info_get") { var summary = new GPSSSummary(pk, GameInfo.Strings); var pkmn = summary.CreatePKMN(); if (pkmn == null) { throw new System.ArgumentException("There was an issue reading the Pokemon data, is it not a Pokemon? (or maybe timeout?)"); } var ser = new DataContractJsonSerializer(typeof(Pokemon)); ser.WriteObject(ns, pkmn); } else if (type == "legal_fix") { var alm = new AutoLegality(pk, version); ns.Write(alm.GetLegalPKM().DecryptedBoxData, 0, alm.GetLegalPKM().DecryptedBoxData.Length); } } else { byte[] request_string_size = Read_NS_Data(ns, 10); string request_string_sizeStr = Encoding.UTF8.GetString(request_string_size, 0, request_string_size.Length); int.TryParse(request_string_sizeStr, out int dataSize); byte[] request_type = Read_NS_Data(ns, dataSize); string request_typeStr = Encoding.UTF8.GetString(request_type, 0, request_type.Length); switch (request_typeStr) { case "enc_base64_get": { var qr = GenQR(GetPokemon(ns)); if (qr == null || qr.Length == 0) { ns.Write(Encoding.UTF8.GetBytes("."), 0, Encoding.UTF8.GetBytes(".").Length); //throw new System.ArgumentException("Tried to upload something that wasn't a pokemon or something else went wrong during qr generation!"); } else { ns.Write(qr, 0, qr.Length); } break; } case "encounter": { var queryStr = GetQueryString(ns); var queries = queryStr.Split('|'); if (!Enum.GetNames(typeof(Species)).Any(s => s.ToLower() == queries[0])) { throw new System.ArgumentException("Invalid pokemon name provided!"); } var data = EncounterLearn.GetLearnSummary(queries[0], queries.Skip(1)); var e = new Encounters { Gen1 = new List <GenLoc>(), Gen2 = new List <GenLoc>(), Gen3 = new List <GenLoc>(), Gen4 = new List <GenLoc>(), Gen5 = new List <GenLoc>(), Gen6 = new List <GenLoc>(), Gen7 = new List <GenLoc>(), Gen8 = new List <GenLoc>(), }; bool first = true; var enc = ""; foreach (var line in data) { if (line.StartsWith("=")) { if (!first) { } enc = line.Replace("=", ""); first = false; continue; } var gen = GetStringFromRegex(@"Gen[0-9]", line); var loc = GetStringFromRegex(@"(?<=.{8}).+?(?=:)", line); var games = GetStringFromRegex(@"([\t ][A-Z |,]{1,100}$|Any)", line); games = games.Replace(" ", ""); games = games.Trim(':'); games = games.Trim('\t'); string[] gamesArray = games.Split(','); GenLoc entry = new GenLoc(); switch (gen) { case "Gen1": { entry = e.Gen1.FirstOrDefault(l => l.EncounterType == enc); break; } case "Gen2": { entry = e.Gen2.FirstOrDefault(l => l.EncounterType == enc); break; } case "Gen3": { entry = e.Gen3.FirstOrDefault(l => l.EncounterType == enc); break; } case "Gen4": { entry = e.Gen4.FirstOrDefault(l => l.EncounterType == enc); break; } case "Gen5": { entry = e.Gen5.FirstOrDefault(l => l.EncounterType == enc); break; } case "Gen6": { entry = e.Gen6.FirstOrDefault(l => l.EncounterType == enc); break; } case "Gen7": { entry = e.Gen7.FirstOrDefault(l => l.EncounterType == enc); break; } case "Gen8": { entry = e.Gen8.FirstOrDefault(l => l.EncounterType == enc); break; } } if (entry != null) { if (entry.Locations == null) { entry.Locations = new List <Locs>(); } var tmpGamesList = new List <string>(); foreach (var game in gamesArray) { tmpGamesList.Add(game); } entry.Locations.Add(new Locs { Location = loc, Games = tmpGamesList, }); } else { var tmpGamesList = new List <string>(); foreach (var game in gamesArray) { tmpGamesList.Add(game); } var tmpLocations = new List <Locs> { new Locs { Location = loc, Games = tmpGamesList, } }; var tmpGenLoc = new GenLoc { EncounterType = enc, Locations = tmpLocations, }; switch (gen) { case "Gen1": { e.Gen1.Add(tmpGenLoc); break; } case "Gen2": { e.Gen2.Add(tmpGenLoc); break; } case "Gen3": { e.Gen3.Add(tmpGenLoc); break; } case "Gen4": { e.Gen4.Add(tmpGenLoc); break; } case "Gen5": { e.Gen5.Add(tmpGenLoc); break; } case "Gen6": { e.Gen6.Add(tmpGenLoc); break; } case "Gen7": { e.Gen7.Add(tmpGenLoc); break; } case "Gen8": { e.Gen8.Add(tmpGenLoc); break; } } } } var json = JsonConvert.SerializeObject(e); ns.Write(Encoding.UTF8.GetBytes(json), 0, Encoding.UTF8.GetBytes(json).Length); break; } case "move_learn": { var queryStr = GetQueryString(ns); var queries = queryStr.Split('|'); if (!Enum.GetNames(typeof(Species)).Any(s => s.ToLower() == queries[0])) { throw new System.ArgumentException("Invalid pokemon name provided!"); } var i = 1; var moves = new List <LearnableMove>(); foreach (var move in queries.Skip(1)) { if (i > 4) { break; } var workaround = move.Split(','); var tmpMove = new LearnableMove { MoveName = move, }; if (!ConsoleIndex.moveNames.Any(m => m.ToLower().Contains(move.ToLower()))) { tmpMove.Learnable = false; } else { tmpMove.Learnable = bool.Parse(EncounterLearn.CanLearn(queries[0], workaround).ToString()); } moves.Add(tmpMove); i++; } var json = JsonConvert.SerializeObject(moves); ns.Write(Encoding.UTF8.GetBytes(json), 0, Encoding.UTF8.GetBytes(json).Length); break; } case "poke_info": { var summary = new GPSSSummary(GetPokemon(ns), GameInfo.Strings); var pkmn = summary.CreatePKMN(); if (pkmn == null) { throw new System.ArgumentException("There was an issue reading the Pokemon data, is it not a Pokemon? (or maybe timeout?)"); } var ser = new DataContractJsonSerializer(typeof(Pokemon)); ser.WriteObject(ns, pkmn); break; } case "auto_legality": { byte[] size = Read_NS_Data(ns, 8); string dataSizeStr = Encoding.UTF8.GetString(size, 0, size.Length); int.TryParse(dataSizeStr, out int dSize); byte[] version = Read_NS_Data(ns, dSize); string versionStr = Encoding.UTF8.GetString(version, 0, version.Length); GameVersion versionInt = 0; var pkmn = GetPokemon(ns); if (pkmn == null) { throw new System.ArgumentException("There was an issue reading the Pokemon data, is it not a Pokemon? (or maybe timeout?)"); } if (versionStr == "?") { versionInt = GetPlaceholderVersion(pkmn); } else { int.TryParse(versionStr, out int vInt); versionInt = (GameVersion)vInt; } var lc = new LegalityAnalysis(pkmn); var report = lc.Report().Split('\n'); var data = new LegalityReturn { ran = false, success = true }; if (!lc.Valid) { var alm = new AutoLegality(pkmn, versionInt.ToString()); Console.WriteLine(pkmn.Version); var legalPK = alm.Legalize(pkmn, versionInt); var qr = System.Convert.ToBase64String(GenQR(legalPK)); if (qr == null || qr.Length == 0) { throw new ArgumentException("bad pokemon!"); } data.qr = System.Convert.ToBase64String(GenQR(legalPK)); data.pokemon = System.Convert.ToBase64String(legalPK.DecryptedBoxData); data.ran = true; data.species = new GPSSSummary(legalPK, GameInfo.Strings).Species; data.success = new LegalityAnalysis(legalPK).Valid; } if (data.ran && data.success) { data.report = report; } var json = JsonConvert.SerializeObject(data); ns.Write(Encoding.UTF8.GetBytes(json), 0, Encoding.UTF8.GetBytes(json).Length); break; } /* case "index_lookup": * { * var queryStr = GetQueryString(ns); * break; * }*/ default: { ns.Write(Encoding.UTF8.GetBytes("I don't know how to handle this query type yet!"), 0, Encoding.UTF8.GetBytes("I don't know how to handle this query type yet!").Length); break; } } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); byte[] err = Encoding.Default.GetBytes("Not a Pokemon!"); ns.Write(err, 0, err.Length); } finally { ns.Flush(); ns.Dispose(); client.Dispose(); } } }
static void Main(string[] args) { string appPath = Environment.CurrentDirectory; mt = File.ReadAllLines("./coreconsole/Moves.csv").Skip(1).Select(m => MoveType.ReadCsv(m)).ToList(); if (args.Contains("-server")) { // Init the database EncounterEvent.RefreshMGDB(string.Empty); RibbonStrings.ResetDictionary(GameInfo.Strings.ribbons); LegalityAnalysis.MoveStrings = GameInfo.Strings.movelist; LegalityAnalysis.SpeciesStrings = GameInfo.Strings.specieslist; moveNames = Util.GetMovesList(GameLanguage.DefaultLanguage); // Init Move Types DB var server1 = new Server(); server1.Server_start(7272, "legality_check", false); var server2 = new Server(); server2.Server_start(7273, "info_get", false); var server3 = new Server(); server3.Server_start(7274, "legal_fix", false); var server4 = new Server(); server4.Server_start(7275, "bot_info", true); } else { Initialize(args); if (args.Contains("-l")) { // Legality API calls var lc = new LegalityCheck(pk); if (args.Contains("--verbose")) { Console.WriteLine(lc.VerboseReport); } else { Console.WriteLine(lc.Report); } } if (args.Contains("-alm")) { if (!args.Contains("--version")) { Console.WriteLine("Specify version with the [--version] tag"); } else { var alm = new AutoLegality(pk, args[Array.IndexOf(args, "--version") + 1]); if (alm != null) { if (!args.Contains("-o")) { string output = Util.CleanFileName(alm.GetLegalPKM().FileName); File.WriteAllBytes(Path.Combine(appPath, "output", output), alm.GetLegalPKM().DecryptedBoxData); } else { string output = GetOutputPath(args); File.WriteAllBytes(output, alm.GetLegalPKM().DecryptedBoxData); } } else { Console.WriteLine("Invalid version"); } } } } }
public Legalize(PKM pk, string version) { CancellationTokenSource cts = new CancellationTokenSource(10000); try { var al = new AutoLegality(pk, version, cts); if (al.OkayToRun) { PKM pkmn; Thread thread = new Thread(() => { al.LegalizePokemon(cts); }); thread.Start(); while (true) { if (cts.IsCancellationRequested) { thread.Interrupt(); pkmn = al.GetLegalPK(); break; } Thread.Sleep(100); } Success = al.Successful; Report = al.Report.Split('\n'); Ran = al.Ran; if (Success) { try { Pokemon = Convert.ToBase64String(pkmn.DecryptedBoxData); Species = new PokemonSummary(pkmn, GameInfo.Strings).Species; try { QR = Utils.GenerateQR(QRMessageUtil.GetMessage(pkmn)); } catch { QR = ""; } } catch { Pokemon = ""; Species = ""; Success = false; Ran = true; Report = new[] { "Stuck in legalization!" }; } } else { Pokemon = ""; } } else { Ran = false; Success = false; Report = new[] { "Could not run legalization!" }; } } catch (Exception e) { cts.Cancel(); if (SentrySdk.IsEnabled) { SentrySdk.ConfigureScope(scope => { scope.Contexts["pokemon"] = new { Version = version, Base64 = Convert.ToBase64String(pk.DecryptedBoxData) }; }); SentrySdk.CaptureException(e); } } }