Exemplo n.º 1
0
        private async void OnStartButtonPressed()
        {
            if (SelectedAccount is null)
            {
                return;
            }

            var token = await _spark.GetTokenAsync(SelectedAccount.Token, SelectedAccount.Id);

            Console.WriteLine("Account token: " + token);

            _ = Task.Run(() =>
            {
                try
                {
                    var pipe = new NamedPipeServerStream(@"GameforgeClientJSONRPC", PipeDirection.InOut, 254, PipeTransmissionMode.Byte, PipeOptions.None, 0, 0);

                    var done = false;
                    while (!done)
                    {
                        try
                        {
                            pipe.WaitForConnection();
                        }
                        catch (IOException)
                        {
                            pipe = new NamedPipeServerStream(@"GameforgeClientJSONRPC", PipeDirection.InOut, 254, PipeTransmissionMode.Byte, PipeOptions.None, 0, 0);
                            pipe.WaitForConnection();
                        }

                        var data   = new byte[1024];
                        var amount = pipe.Read(data, 0, data.Length);
                        if (amount == 0)
                        {
                            Console.WriteLine("Broken pipe. Stopping.");
                            return;
                        }

                        var strData = Encoding.Default.GetString(data);
                        Console.WriteLine($"< {strData}");

                        var payload = JsonConvert.DeserializeObject <NTPipeInPayload>(strData);
                        if (payload is null)
                        {
                            Console.WriteLine("Couldn't parse the payload");
                            continue;
                        }

                        var outPayload = new NTPipeOutPayload
                        {
                            Id      = payload.Id,
                            JsonRPC = payload.JsonRPC
                        };

                        switch (payload.Method)
                        {
                        case "ClientLibrary.isClientRunning":
                            outPayload.Result = true;
                            break;

                        case "ClientLibrary.initSession":
                            outPayload.Result = payload.Params.SessionId;
                            break;

                        case "ClientLibrary.queryAuthorizationCode":
                            outPayload.Result = token;
                            break;

                        case "ClientLibrary.queryGameAccountName":
                            outPayload.Result = SelectedAccount.Name;
                            done = true;
                            break;
                        }

                        var outString = JsonConvert.SerializeObject(outPayload);
                        Console.WriteLine($"> {outString}");
                        data = Encoding.Default.GetBytes(outString);
                        pipe.Write(data, 0, data.Length);
                        pipe.Flush();
                        pipe.WaitForPipeDrain();
                    }

                    pipe.Dispose();
                }
                catch (Exception e)
                {
                    Console.WriteLine($"Oof (fix that later plz): {e.Message}");
                }
            });

            var psi = new ProcessStartInfo
            {
                FileName  = Path.Combine(_nostalePath, "NostaleClientX.exe"),
                Arguments = "gf"
            };

            psi.Environment.Add("_TNT_CLIENT_APPLICATION_ID", "d3b2a0c1-f0d0-4888-ae0b-1c5e1febdafb");

            SelectedAccount.Process = Process.Start(psi);
        }