private void HandleDataReceived(object sender, string messageJson)
        {
            try
            {
                var message = Serializer.DeserializeJson <CodeChangeMessage>(messageJson);

                if (message.Error == null)
                {
                    Runtime.HandleCodeChange(message.CodeChange);
                    RequestHandled?.Invoke();
                }
                else if (message.Error.ParsingError != null)
                {
                    ParsingError?.Invoke(message.Error.ParsingError);
                }
                else if (message.Error.CompileError != null)
                {
                    CompileError?.Invoke(message.Error.CompileError);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                ParsingError?.Invoke(ex.Message);
            }
        }
Esempio n. 2
0
        private void HandleDataReceived(object sender, string request)
        {
            try
            {
                var methodRequest = Serializer.DeserializeJson <CodeChangeRequest>(request);

                if (methodRequest.ParsingError != null)
                {
                    ParsingError?.Invoke(methodRequest.ParsingError);
                }
                else if (methodRequest.CompileError != null)
                {
                    CompileError?.Invoke(methodRequest.CompileError);
                }
                else
                {
                    CodeChangeHandler.HandleRequest(methodRequest);
                    RequestHandled?.Invoke();
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex);
                ParsingError?.Invoke(ex.Message);
            }
        }
 void MqttMessageHandler_NewCodeChangeFound(CodeChangeMessage message)
 {
     try
     {
         if (message.Error == null)
         {
             Runtime.HandleCodeChange(message.CodeChange);
             RequestHandled?.Invoke();
         }
         else if (message.Error.ParsingError != null)
         {
             ParsingError?.Invoke(message.Error.ParsingError);
         }
         else if (message.Error.CompileError != null)
         {
             CompileError?.Invoke(message.Error.CompileError);
         }
     }
     catch (Exception ex)
     {
         Debug.WriteLine(ex);
         ParsingError?.Invoke(ex.Message);
     }
 }
        private async Task OnResponse(object sender, SessionEventArgs e)
        {
            if (e.WebSession.Request.RequestUri.Host != "pgorelease.nianticlabs.com")
            {
                return;
            }

            if (e.WebSession.Response.ResponseStatusCode == "200")
            {
                // Get session data
                var    callTime  = DateTime.Now;
                byte[] bodyBytes = await e.GetResponseBody();

                var codedInputStream = new CodedInputStream(bodyBytes);
                var responseEnvelope = ResponseEnvelope.Parser.ParseFrom(codedInputStream);

                // Initialize the response block
                var responseBlock = new MessageBlock
                {
                    MessageInitialized = callTime,
                    ParsedMessages     = new Dictionary <RequestType, IMessage>()
                };

                // Grab the paired request
                var args = _apiBlocks[responseEnvelope.RequestId];

                // Grab request types
                var requestTypes = args.RequestBlock.ParsedMessages.Keys.ToList();

                // The case of missmatched requests and responses seems to be a handshake. The inital request sends 5 messages and gets back 2 that are empty bytestrings
                if (args.RequestBlock.ParsedMessages.Count != responseEnvelope.Returns.Count)
                {
                    if ((args.RequestBlock.ParsedMessages.Count == 5 && responseEnvelope.Returns.Count == 2) &&
                        (responseEnvelope.Returns[0].IsEmpty && responseEnvelope.Returns[1].IsEmpty))
                    {
                        if (Out != StreamWriter.Null)
                        {
                            Out.WriteLine($"[*] Handshake complete\n");
                        }
                        _apiBlocks.Remove(args.RequestId);
                        return;
                    }

                    // If there is a case of missmatched requests and responses, and it doesn't look like a handshake, log it
                    if (Out != StreamWriter.Null)
                    {
                        Out.WriteLine($"[*] Request messages count ({args.RequestBlock.ParsedMessages.Count}) is different than the response messages count ({responseEnvelope.Returns.Count}).");

                        Out.WriteLine("Request:");
                        Out.WriteLine(args.RequestBlock);

                        Out.WriteLine("Response:");
                        Out.WriteLine("Not sure yet how to read this without knowing what it is.");

                        Out.WriteLine($"[*]\n");
                    }

                    // This section converts all of the responses into all of the request types that exist to see which one fits
                    int responseIndex = 0;

                    foreach (var responseBytes in responseEnvelope.Returns)
                    {
                        int start = responseIndex;
                        int end   = responseIndex + requestTypes.Count - responseEnvelope.Returns.Count;

                        // Parse the responses
                        for (int i = start; i < end; i++)
                        {
                            var type = Type.GetType("POGOProtos.Networking.Responses." + requestTypes[i] + "Response,PoGo Proxy.Protocs");

                            var instance = (IMessage)Activator.CreateInstance(type);
                            instance.MergeFrom(responseBytes);

                            Out.WriteLine($"[*] Parsing as response {responseIndex} as {requestTypes[i]}");
                            Out.WriteLine(JsonConvert.SerializeObject(instance));
                        }

                        responseIndex++;
                        Out.WriteLine();
                    }
                    Out.WriteLine($"[*]\n");
                }

                // Parse the responses
                for (int i = 0; i < responseEnvelope.Returns.Count; i++)
                {
                    // Had to add assembly name to end of typeName string since protocs.cs files are in a different assembly
                    var type = Type.GetType("POGOProtos.Networking.Responses." + requestTypes[i] + "Response,PoGo Proxy.Protocs");

                    if (type == null)
                    {
                        if (Out != StreamWriter.Null)
                        {
                            Out.WriteLine("[***] GetType returns null for requestType: " + requestTypes[i]);
                        }
                        if (Out != StreamWriter.Null)
                        {
                            Out.WriteLine("[***] Check if POGOProtos.Networking.Requests.Messages." + requestTypes[i] + "Message exists.");
                        }
                        if (Out != StreamWriter.Null)
                        {
                            Out.WriteLine("[*]\n");
                        }

                        responseBlock.ParsedMessages.Add(requestTypes[i], default(IMessage));
                    }
                    else
                    {
                        var instance = (IMessage)Activator.CreateInstance(type);
                        instance.MergeFrom(responseEnvelope.Returns[i]);

                        responseBlock.ParsedMessages.Add(requestTypes[i], instance);
                    }
                }

                // Have not seen this issue yet - here just in case
                if (!_apiBlocks.ContainsKey(responseEnvelope.RequestId))
                {
                    if (Out != StreamWriter.Null)
                    {
                        Out.WriteLine($"[*] Request doesn't exist with specified RequestId ({responseEnvelope.RequestId}).");
                        Out.WriteLine($"Response:\n{responseBlock}");
                        Out.WriteLine("[*]\n");
                    }
                }

                // Remove block from dictionary and invoke event handler
                args.ResponseBlock = responseBlock;
                _apiBlocks.Remove(args.RequestId);

                RequestHandled?.Invoke(this, args);
            }
        }
Esempio n. 5
0
        public void Start()
        {
            using (var wc = new WebClient())
            {
                wc.DownloadStringCompleted += (wc_sender, wc_e) =>
                {
                    using (var bgw = new BackgroundWorker())
                    {
                        bgw.WorkerReportsProgress      = true;
                        bgw.WorkerSupportsCancellation = true;

                        bgw.DoWork += (bgw_doWorkSender, bgw_e) =>
                        {
                            var response = new XmlDocument();
                            response.LoadXml((string)bgw_e.Argument);

                            var totalStreams = int.Parse(response.DocumentElement.SelectSingleNode("STREAMSTATS/TOTALSTREAMS").InnerText);
                            if (totalStreams != 0 && totalStreams < byte.MaxValue)
                            {
                                var streamXML = new XmlDocument();
                                using (var scStream = new ShoutcastStream())
                                    for (var i = 0; i < totalStreams; i++)
                                    {
                                        streamXML.LoadXml(response.DocumentElement.SelectNodes("STREAMSTATS/STREAM")[i].OuterXml
                                                          .Replace(string.Format("<STREAM id=\"{0}\">", (i + 1)), "<SHOUTCASTSERVER>")
                                                          .Replace("</STREAM>", "</SHOUTCASTSERVER>"));

                                        streamXML.CreateXmlDeclaration("1.0", "UTF-8", "yes");

                                        scStream.Listeners = int.Parse(streamXML.DocumentElement.SelectSingleNode("CURRENTLISTENERS").InnerText);
                                        scStream.Active    = (int.Parse(streamXML.DocumentElement.SelectSingleNode("STREAMSTATUS").InnerText) != 0);
                                        scStream.Title     = streamXML.DocumentElement.SelectSingleNode("SONGTITLE").InnerText;
                                        scStream.Name      = streamXML.DocumentElement.SelectSingleNode("SERVERTITLE").InnerText;
                                        scStream.ID        = Convert.ToString((i + 1));
                                        scStream.XML       = streamXML;

                                        bgw.ReportProgress((i + 1), scStream);
                                    }
                            }
                        };

                        bgw.ProgressChanged += (bgw_progChanged_sender, progress) =>
                        {
                            var stream = (ShoutcastStream)progress.UserState;
                            if (string.IsNullOrEmpty(stream.ID))
                            {
                                lock (streams)
                                {
                                    if (streams.ContainsKey(stream.ID))
                                    {
                                        streams.Add(stream.ID, stream);
                                    }
                                    else
                                    {
                                        streams[stream.ID].Listeners = stream.Listeners;
                                        streams[stream.ID].Name      = stream.Name;
                                        streams[stream.ID].Title     = stream.Title;
                                        streams[stream.ID].XML       = stream.XML;
                                    }
                                }
                            }
                        };

                        bgw.RunWorkerCompleted += (bgw_done_sender, done_e) =>
                        {
                            if (RequestHandled == null)
                            {
                                return;
                            }

                            var evargs = new RequestHandledEventArgs();
                            evargs.Action = Actions.Add;
                            evargs.Type   = Types.Content;

                            RequestHandled.Invoke(this, evargs);
                        };
                    }
                };

                wc.DownloadStringAsync(sc_url);
            }
        }