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); } }
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); } }
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); } }