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 docPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
var errorMessage = new System.Text.StringBuilder(); var errorMessage = new System.Text.StringBuilder();
var timestamp = DateTime.Now.ToString("G");
errorMessage errorMessage
.AppendLine($"Error encountered in Elite Observatory {context}.") .AppendLine($"[{timestamp}] Error encountered in Elite Observatory {context}")
.AppendLine(FormatExceptionMessage(ex)) .AppendLine(FormatExceptionMessage(ex))
.AppendLine(); .AppendLine();
System.IO.File.AppendAllText(docPath + System.IO.Path.DirectorySeparatorChar + "ObservatoryErrorLog.txt", errorMessage.ToString()); 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 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() public Status GetStatus()
{ {
throw new NotImplementedException(); throw new NotImplementedException();

View File

@ -12,9 +12,12 @@ namespace Observatory.Explorer
{ {
private Lua LuaState; private Lua LuaState;
private List<LuaFunction> CriteriaFunctions; private List<LuaFunction> CriteriaFunctions;
Action<Exception, String> ErrorLogger;
public CustomCriteriaManager()
public CustomCriteriaManager(Action<Exception, String> errorLogger)
{ {
ErrorLogger = errorLogger;
CriteriaFunctions = new(); CriteriaFunctions = new();
} }
@ -174,8 +177,14 @@ namespace Observatory.Explorer
originalScript = originalScript.Remove(originalScript.LastIndexOf(Environment.NewLine)); originalScript = originalScript.Remove(originalScript.LastIndexOf(Environment.NewLine));
originalScript = originalScript[(originalScript.IndexOf(Environment.NewLine) + Environment.NewLine.Length)..]; originalScript = originalScript[(originalScript.IndexOf(Environment.NewLine) + Environment.NewLine.Length)..];
originalScript = originalScript.Replace('\t', ' ');
throw new CriteriaLoadException(e.Message, 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; settings.EnableCustomCriteria = false;
results.Add((e.Message, scan.Json, 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; break;
} }
} }

View File

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

View File

@ -174,6 +174,13 @@ namespace Observatory.Framework.Interfaces
/// </summary> /// </summary>
public string Version { get; } 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> /// <summary>
/// Perform an action on the current Avalonia UI thread. /// Perform an action on the current Avalonia UI thread.
/// </summary> /// </summary>

View File

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

View File

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

View File

@ -19,14 +19,17 @@ namespace Observatory.Herald
private string ApiEndpoint; private string ApiEndpoint;
private DirectoryInfo cacheLocation; private DirectoryInfo cacheLocation;
private int cacheSize; private int cacheSize;
private Action<Exception, String> ErrorLogger;
internal SpeechRequestManager(HeraldSettings settings, HttpClient httpClient, string cacheFolder) internal SpeechRequestManager(
HeraldSettings settings, HttpClient httpClient, string cacheFolder, Action<Exception, String> errorLogger)
{ {
ApiKey = ObservatoryAPI.ApiKey; ApiKey = ObservatoryAPI.ApiKey;
ApiEndpoint = settings.ApiEndpoint; ApiEndpoint = settings.ApiEndpoint;
this.httpClient = httpClient; this.httpClient = httpClient;
cacheSize = Math.Max(settings.CacheSize, 1); cacheSize = Math.Max(settings.CacheSize, 1);
cacheLocation = new DirectoryInfo(cacheFolder); cacheLocation = new DirectoryInfo(cacheFolder);
ErrorLogger = errorLogger;
if (!Directory.Exists(cacheLocation.FullName)) if (!Directory.Exists(cacheLocation.FullName))
{ {
@ -49,7 +52,19 @@ namespace Observatory.Herald
var audioFilename = cacheLocation + ssmlHash + ".mp3"; 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) 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)); 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; return audioFilename;
} }
@ -231,6 +246,7 @@ namespace Observatory.Herald
{ {
Console.WriteLine(ex.Message); Console.WriteLine(ex.Message);
cacheIndex = new(); cacheIndex = new();
ErrorLogger(ex, "deserializing CacheIndex.json");
} }
} }
else else