Files
AIML/AimlConsoleBot/Program.cs

176 lines
5.4 KiB
C#

using Aiml;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace AimlConsoleBot {
internal class Program {
internal static int Main(string[] args) {
bool switches = true; bool useTests = false; string? botPath = null; string? testPath = null;
var inputs = new List<string>();
var sraixServicePaths = new List<string>();
for (int i = 0; i < args.Length; ++i) {
var s = args[i];
if (switches && s.StartsWith("-")) {
if (s == "--")
switches = false;
else if (s == "-i" || s == "--input")
inputs.Add(args[++i]);
else if (s == "-s" || s == "--services")
sraixServicePaths.Add(args[++i]);
else if (s == "-t" || s == "--test") {
useTests = true;
testPath = args[++i];
}
} else {
switches = false;
botPath = s;
}
}
if (botPath == null) {
Console.Error.WriteLine("Usage: AimlConsoleBot [--test] <bot path>");
return 1;
}
var bot = new Bot(botPath);
bot.LogMessage += Bot_LogMessage;
foreach (var path in sraixServicePaths) {
var assembly = Assembly.LoadFrom(path);
var found = false;
foreach (var type in assembly.GetExportedTypes()) {
if (!type.IsAbstract && typeof(ISraixService).IsAssignableFrom(type)) {
Console.WriteLine($"Initialising service {type.FullName} from {path}...");
found = true;
bot.SraixServices.Add(type.FullName, (ISraixService) Activator.CreateInstance(type));
}
}
if (!found) {
Console.Error.WriteLine($"No services found in {path}.");
return 1;
}
}
bot.LoadConfig();
bot.LoadAIML();
if (useTests) bot.AimlLoader.LoadAimlFiles(Path.Combine(botPath, testPath!));
var user = new User("User", bot);
if (useTests) {
Console.WriteLine("Looking for tests...");
var categories = new List<KeyValuePair<string, Template>>();
var tests = new Dictionary<string, TestResult?>();
foreach (var entry in bot.Graphmaster.GetTemplates()) {
var tests2 = entry.Value.GetTests();
foreach (var test in tests2)
tests.Add(test.Name, null);
if (tests2.Count > 0)
categories.Add(entry);
}
if (tests.Count == 1)
Console.WriteLine($"{tests.Count} test found.");
else
Console.WriteLine($"{tests.Count} tests found.");
foreach (var (path, template) in categories) {
Console.WriteLine($"Running test template in file '{template.FileName}' with path '{path}'...");
var pos = path.IndexOf(" <that> ");
var input = path.Substring(0, pos);
var request = new Request(input, user, bot);
var process = new RequestProcess(new RequestSentence(request, input), 0, true);
var text = template.Content.Evaluate(process);
user.Responses.Add(new Response(request, text));
foreach (var (name, result) in process.TestResults) {
tests[name] = result;
}
}
int passes = 0, failures = 0, i = 1;
Console.WriteLine();
Console.WriteLine("Test results:");
Console.WriteLine();
foreach (var (name, result) in tests) {
Console.ForegroundColor = ConsoleColor.White;
Console.Write((i++).ToString().PadLeft(4));
Console.Write(": ");
Console.Write(name);
Console.Write(" ");
if (result == null) {
++failures;
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("was not reached");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine(".");
} else if (result.Passed) {
++passes;
Console.ForegroundColor = ConsoleColor.Green;
Console.Write("passed");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($" in {result.Duration.TotalMilliseconds} ms.");
} else {
++failures;
Console.ForegroundColor = ConsoleColor.Red;
Console.Write("failed");
Console.ForegroundColor = ConsoleColor.White;
Console.WriteLine($" in {result.Duration.TotalMilliseconds} ms.");
Console.ResetColor();
Console.WriteLine(result.Message);
}
}
Console.ResetColor();
Console.WriteLine();
if (passes > 0) Console.ForegroundColor = ConsoleColor.Green;
Console.Write(passes);
Console.ResetColor();
if (passes == 1) Console.Write(" test passed; ");
else Console.Write(" tests passed; ");
if (failures > 0) Console.ForegroundColor = ConsoleColor.Red;
Console.Write(failures);
Console.ResetColor();
if (failures == 1) Console.Write(" test failed.");
else Console.Write(" tests failed.");
Console.WriteLine();
} else {
foreach (var s in inputs) {
Console.WriteLine("> " + s);
bot.Chat(new Request(s, user, bot), false);
}
while (true) {
Console.Write("> ");
var message = Console.ReadLine();
var trace = false;
if (message.StartsWith(".trace ")) {
trace = true;
message = message.Substring(7);
}
var response = bot.Chat(new Request(message, user, bot), trace);
}
}
return 0;
}
private static void Bot_LogMessage(object sender, LogMessageEventArgs e) {
switch (e.Level) {
case LogLevel.Warning: Console.ForegroundColor = ConsoleColor.Yellow; break;
case LogLevel.Gossip: Console.ForegroundColor = ConsoleColor.Blue; break;
case LogLevel.Chat: Console.ForegroundColor = ConsoleColor.Blue; break;
case LogLevel.Diagnostic: Console.ForegroundColor = ConsoleColor.DarkBlue; break;
}
Console.WriteLine($"[{e.Level}] {e.Message}");
Console.ResetColor();
}
}
}