private void ParseResponse(string responseString) { var heosResponse = JsonConvert.DeserializeObject <HeosResponse>(responseString, JsonSerializerSettings); if (!string.IsNullOrWhiteSpace(heosResponse.Heos.Message) && heosResponse.Heos.Message.Contains("command under process")) { Logger.Warn("Ignoring command under process"); return; } if (heosResponse.Heos.Command.StartsWith("event", StringComparison.OrdinalIgnoreCase)) { var @event = eventParser.Create(heosResponse.Heos); if (@event != null) { Logger.Info($"Event parsed: {@event.GetType().Name}"); eventSubject.OnNext(@event); } } else { var query = QueryHelpers.ParseQuery(heosResponse.Heos.Message); var sequenceString = query.ContainsKey(Constants.Sequence) ? query[Constants.Sequence] : null; var success = heosResponse.Heos.Result.Equals("success", StringComparison.OrdinalIgnoreCase); var sequence = -1; if (!string.IsNullOrWhiteSpace(sequenceString)) { sequence = int.Parse(sequenceString); Logger.Info($"Sequence found: {sequence}"); } else { var commandAndMessage = heosResponse.Heos.Command; if (!string.IsNullOrWhiteSpace(heosResponse.Heos.Message)) { commandAndMessage += "?" + heosResponse.Heos.Message; } // HACK: commandAndMessage = commandAndMessage.Replace("signed_in&", string.Empty); Logger.Info($"Awaiting request match: {commandAndMessage}"); // TODO: StringComparison.InvariantCultureIgnoreCase var command = RequestObservable .Where(r => commandAndMessage.ToLowerInvariant().Contains(r.Text.ToLowerInvariant()) || r.Text.ToLowerInvariant().Contains(commandAndMessage.ToLowerInvariant())) .TakeSynchronousNotifications().LastOrDefault(); // TODO: if (command != null) { sequence = command.Sequence; Logger.Info($"Awaiting sequence found: {sequence}"); } else { // TODO: log Logger.Error($"Awaiting sequence not found: {commandAndMessage}"); } } var response = new Response(sequence, success, heosResponse, responseString); responseSubject.OnNext(response); } }