Added AutoRespond/ResponseConfigItem
This commit is contained in:
parent
e020b328c6
commit
bd46c53a02
2 changed files with 87 additions and 1 deletions
|
@ -127,8 +127,11 @@ namespace Noikoio.RegexBot.ConfigItem
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Helper method for reading whitelist and blacklist filtering lists
|
||||
/// Helper method for reading whitelist and blacklist filtering lists.
|
||||
/// </summary>
|
||||
/// <param name="section">
|
||||
/// A JSON object which presumably contains an array named "whitelist" or "blacklist".
|
||||
/// </param>
|
||||
public static (FilterType, EntityList) GetFilterList(JObject section)
|
||||
{
|
||||
var mode = FilterType.None;
|
||||
|
|
83
Feature/AutoRespond/ResponseConfigItem.cs
Normal file
83
Feature/AutoRespond/ResponseConfigItem.cs
Normal file
|
@ -0,0 +1,83 @@
|
|||
using Newtonsoft.Json.Linq;
|
||||
using Noikoio.RegexBot.ConfigItem;
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Noikoio.RegexBot.Feature.AutoRespond
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a single autoresponse definition.
|
||||
/// </summary>
|
||||
struct ResponseConfigItem
|
||||
{
|
||||
public enum ResponseType { None, Exec, Reply }
|
||||
|
||||
string _label;
|
||||
Regex _trigger;
|
||||
ResponseType _rtype;
|
||||
string _rbody; // response body
|
||||
private FilterType _filtermode;
|
||||
private EntityList _filterlist;
|
||||
|
||||
public string Label => _label;
|
||||
public Regex Trigger => _trigger;
|
||||
public (ResponseType, string) Response => (_rtype, _rbody);
|
||||
public (FilterType, EntityList) Filter => (_filtermode, _filterlist);
|
||||
|
||||
public ResponseConfigItem(JObject definition)
|
||||
{
|
||||
// label
|
||||
_label = definition["label"]?.Value<string>();
|
||||
if (string.IsNullOrWhiteSpace(_label))
|
||||
throw new RuleImportException("Label is not defined in response definition.");
|
||||
|
||||
// error postfix string
|
||||
string errorpfx = $" in response definition for '{_label}'.";
|
||||
|
||||
// regex trigger
|
||||
const RegexOptions rxopts = RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Multiline;
|
||||
string triggerstr = definition["trigger"]?.Value<string>();
|
||||
if (string.IsNullOrWhiteSpace(triggerstr))
|
||||
throw new RuleImportException("Regular expression trigger is not defined" + errorpfx);
|
||||
try
|
||||
{
|
||||
_trigger = new Regex(triggerstr, rxopts);
|
||||
}
|
||||
catch (ArgumentException ex)
|
||||
{
|
||||
throw new RuleImportException
|
||||
("Failed to parse regular expression pattern" + errorpfx +
|
||||
$" ({ex.GetType().Name}: {ex.Message})");
|
||||
}
|
||||
|
||||
// response - defined in either "exec" or "reply", but not both
|
||||
_rbody = null;
|
||||
_rtype = ResponseType.None;
|
||||
|
||||
// exec response ---
|
||||
string execstr = definition["exec"]?.Value<string>();
|
||||
if (!string.IsNullOrWhiteSpace(execstr))
|
||||
{
|
||||
_rbody = execstr;
|
||||
_rtype = ResponseType.Exec;
|
||||
}
|
||||
|
||||
// reply response
|
||||
string replystr = definition["reply"]?.Value<string>();
|
||||
if (!string.IsNullOrWhiteSpace(replystr))
|
||||
{
|
||||
if (_rbody != null)
|
||||
throw new RuleImportException("A value for both 'exec' and 'reply' is not allowed" + errorpfx);
|
||||
_rbody = replystr;
|
||||
_rtype = ResponseType.Reply;
|
||||
}
|
||||
|
||||
if (_rbody == null)
|
||||
throw new RuleImportException("A response value of either 'exec' or 'reply' was not defined" + errorpfx);
|
||||
// ---
|
||||
|
||||
// whitelist/blacklist filtering
|
||||
(_filtermode, _filterlist) = EntityList.GetFilterList(definition);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue