2
0
mirror of https://github.com/9ParsonsB/Pulsar.git synced 2025-04-05 17:39:39 -04:00
This commit is contained in:
Xjph 2022-05-03 19:03:43 -02:30
commit a67cf7f6bb
8 changed files with 114 additions and 43 deletions

View File

@ -30,8 +30,9 @@ namespace Observatory
{
var docPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
var errorMessage = new System.Text.StringBuilder();
var timestamp = DateTime.Now.ToString("G");
errorMessage
.AppendLine($"Error encountered in Elite Observatory {context}.")
.AppendLine($"[{timestamp}] Error encountered in Elite Observatory {context}")
.AppendLine(FormatExceptionMessage(ex))
.AppendLine();
System.IO.File.AppendAllText(docPath + System.IO.Path.DirectorySeparatorChar + "ObservatoryErrorLog.txt", errorMessage.ToString());

View File

@ -21,6 +21,14 @@ namespace Observatory.PluginManagement
public string Version => System.Reflection.Assembly.GetEntryAssembly().GetName().Version.ToString();
public Action<Exception, String> GetPluginErrorLogger(IObservatoryPlugin plugin)
{
return (ex, context) =>
{
ObservatoryCore.LogError(ex, $"from plugin {plugin.ShortName} {context}");
};
}
public Status GetStatus()
{
throw new NotImplementedException();

View File

@ -12,9 +12,12 @@ namespace Observatory.Explorer
{
private Lua LuaState;
private List<LuaFunction> CriteriaFunctions;
public CustomCriteriaManager()
Action<Exception, String> ErrorLogger;
public CustomCriteriaManager(Action<Exception, String> errorLogger)
{
ErrorLogger = errorLogger;
CriteriaFunctions = new();
}
@ -174,8 +177,14 @@ namespace Observatory.Explorer
originalScript = originalScript.Remove(originalScript.LastIndexOf(Environment.NewLine));
originalScript = originalScript[(originalScript.IndexOf(Environment.NewLine) + Environment.NewLine.Length)..];
throw new CriteriaLoadException(e.Message, originalScript.Replace('\t', ' '));
originalScript = originalScript.Replace('\t', ' ');
StringBuilder errorDetail = new();
errorDetail.AppendLine("Error Reading Custom Criteria File:")
.AppendLine(originalScript)
.AppendLine("NOTE: Custom criteria processing has been disable to prevent further errors.");
ErrorLogger(e, errorDetail.ToString());
throw new CriteriaLoadException(e.Message, originalScript);
}
}
@ -236,6 +245,12 @@ namespace Observatory.Explorer
{
settings.EnableCustomCriteria = false;
results.Add((e.Message, scan.Json, false));
StringBuilder errorDetail = new();
errorDetail.AppendLine("while processing a custom criteria on scan:")
.AppendLine(scan.Json)
.AppendLine("NOTE: Custom criteria process has been disabled to prevent further errors.");
ErrorLogger(e, errorDetail.ToString());
break;
}
}

View File

@ -29,7 +29,7 @@ namespace Observatory.Explorer
ExplorerWorker = explorerWorker;
ObservatoryCore = core;
Results = results;
CustomCriteriaManager = new();
CustomCriteriaManager = new(core.GetPluginErrorLogger(explorerWorker));
CriteriaLastModified = new DateTime(0);
}

View File

@ -174,6 +174,13 @@ namespace Observatory.Framework.Interfaces
/// </summary>
public string Version { get; }
/// <summary>
/// Returns a delegate for logging an error for the calling plugin. A plugin can wrap this method
/// or pass it along to its collaborators.
/// </summary>
/// <param name="plugin">The calling plugin</param>
public Action<Exception, String> GetPluginErrorLogger (IObservatoryPlugin plugin);
/// <summary>
/// Perform an action on the current Avalonia UI thread.
/// </summary>

View File

@ -53,8 +53,9 @@ namespace Observatory.Herald
}
public void Load(IObservatoryCore observatoryCore)
{
var speechManager = new SpeechRequestManager(heraldSettings, observatoryCore.HttpClient, observatoryCore.PluginStorageFolder);
heraldSpeech = new HeraldQueue(speechManager);
var speechManager = new SpeechRequestManager(
heraldSettings, observatoryCore.HttpClient, observatoryCore.PluginStorageFolder, observatoryCore.GetPluginErrorLogger(this));
heraldSpeech = new HeraldQueue(speechManager, observatoryCore.GetPluginErrorLogger(this));
heraldSettings.Test = TestVoice;
}

View File

@ -4,6 +4,8 @@ using System.Threading.Tasks;
using System.Linq;
using NetCoreAudio;
using System.Threading;
using System;
using System.Diagnostics;
namespace Observatory.Herald
{
@ -17,13 +19,15 @@ namespace Observatory.Herald
private byte volume;
private SpeechRequestManager speechManager;
private Player audioPlayer;
public HeraldQueue(SpeechRequestManager speechManager)
private Action<Exception, String> ErrorLogger;
public HeraldQueue(SpeechRequestManager speechManager, Action<Exception, String> errorLogger)
{
this.speechManager = speechManager;
processing = false;
notifications = new();
audioPlayer = new();
ErrorLogger = errorLogger;
}
@ -55,37 +59,48 @@ namespace Observatory.Herald
private void ProcessQueue()
{
while (notifications.Any())
NotificationArgs notification = null;
try
{
audioPlayer.SetVolume(volume).Wait();
var notification = notifications.Dequeue();
Task<string>[] audioRequestTasks = new Task<string> [2];
if (string.IsNullOrWhiteSpace(notification.TitleSsml))
while (notifications.Any())
{
audioRequestTasks[0] = RetrieveAudioToFile(notification.Title);
}
else
{
audioRequestTasks[0] = RetrieveAudioSsmlToFile(notification.TitleSsml);
}
audioPlayer.SetVolume(volume).Wait();
notification = notifications.Dequeue();
Debug.WriteLine("Processing notification: {0} - {1}", notification.Title, notification.Detail);
if (string.IsNullOrWhiteSpace(notification.DetailSsml))
{
audioRequestTasks[1] = RetrieveAudioToFile(notification.Detail);
}
else
{
audioRequestTasks[1] = RetrieveAudioSsmlToFile(notification.DetailSsml);
}
Task<string>[] audioRequestTasks = new Task<string>[2];
PlayAudioRequestsSequentially(audioRequestTasks);
if (string.IsNullOrWhiteSpace(notification.TitleSsml))
{
audioRequestTasks[0] = RetrieveAudioToFile(notification.Title);
}
else
{
audioRequestTasks[0] = RetrieveAudioSsmlToFile(notification.TitleSsml);
}
if (string.IsNullOrWhiteSpace(notification.DetailSsml))
{
audioRequestTasks[1] = RetrieveAudioToFile(notification.Detail);
}
else
{
audioRequestTasks[1] = RetrieveAudioSsmlToFile(notification.DetailSsml);
}
PlayAudioRequestsSequentially(audioRequestTasks);
}
}
catch (Exception ex)
{
Debug.WriteLine($"Failed to fetch/play notification: {notification?.Title} - {notification?.Detail}");
ErrorLogger(ex, "while retrieving and playing audio for a notification");
}
finally
{
processing = false;
}
processing = false;
}
private async Task<string> RetrieveAudioToFile(string text)
@ -103,7 +118,15 @@ namespace Observatory.Herald
foreach (var request in requestTasks)
{
string file = request.Result;
audioPlayer.Play(file).Wait();
try
{
Debug.WriteLine($"Playing audio file: {file}");
audioPlayer.Play(file).Wait();
} catch (Exception ex)
{
Debug.WriteLine($"Failed to play {file}: {ex.Message}");
ErrorLogger(ex, $"while playing: {file}");
}
while (audioPlayer.Playing)
Thread.Sleep(50);

View File

@ -19,15 +19,18 @@ namespace Observatory.Herald
private string ApiEndpoint;
private DirectoryInfo cacheLocation;
private int cacheSize;
internal SpeechRequestManager(HeraldSettings settings, HttpClient httpClient, string cacheFolder)
private Action<Exception, String> ErrorLogger;
internal SpeechRequestManager(
HeraldSettings settings, HttpClient httpClient, string cacheFolder, Action<Exception, String> errorLogger)
{
ApiKey = ObservatoryAPI.ApiKey;
ApiEndpoint = settings.ApiEndpoint;
this.httpClient = httpClient;
cacheSize = Math.Max(settings.CacheSize, 1);
cacheLocation = new DirectoryInfo(cacheFolder);
ErrorLogger = errorLogger;
if (!Directory.Exists(cacheLocation.FullName))
{
Directory.CreateDirectory(cacheLocation.FullName);
@ -49,7 +52,19 @@ namespace Observatory.Herald
var audioFilename = cacheLocation + ssmlHash + ".mp3";
if (!File.Exists(audioFilename))
FileInfo audioFileInfo = null;
if (File.Exists(audioFilename))
{
audioFileInfo = new FileInfo(audioFilename);
if (audioFileInfo.Length == 0)
{
File.Delete(audioFilename);
audioFileInfo = null;
}
}
if (audioFileInfo == null)
{
using StringContent request = new(ssml)
{
@ -71,10 +86,10 @@ namespace Observatory.Herald
{
throw new PluginException("Herald", "Unable to retrieve audio data.", new Exception(response.StatusCode.ToString() + ": " + response.ReasonPhrase));
}
audioFileInfo = new FileInfo(audioFilename);
}
UpdateAndPruneCache(new FileInfo(audioFilename));
UpdateAndPruneCache(audioFileInfo);
return audioFilename;
}
@ -231,6 +246,7 @@ namespace Observatory.Herald
{
Console.WriteLine(ex.Message);
cacheIndex = new();
ErrorLogger(ex, "deserializing CacheIndex.json");
}
}
else