Exemple #1
0
        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");
                        }
                    }
                }
            }
        }
Exemple #2
0
    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();
            }
        }
    }
Exemple #3
0
    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();
            }
        }
    }
Exemple #4
0
        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");
                        }
                    }
                }
            }
        }
Exemple #5
0
        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);
                }
            }
        }