Added the ability to not create an empty variable when the Parse Block fails.

This commit is contained in:
ruri
2019-05-09 01:14:12 +02:00
parent a2cc07a100
commit 74d5aa3436
7 changed files with 72 additions and 22 deletions
+4 -4
View File
@@ -321,10 +321,10 @@ CAPTCHA "http://example.com/image.png" -> VAR "CAP"
This will spawn and execute a Parse Block. This will spawn and execute a Parse Block.
Syntax: Syntax:
PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [CreateEmpty?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" JSON "FIELD" [Recursive?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" JSON "FIELD" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
Examples: Examples:
PARSE "<SOURCE>" LR "<span>" "</span>" Recursive=True -> CAP "BALANCE" "$" "" PARSE "<SOURCE>" LR "<span>" "</span>" Recursive=True -> CAP "BALANCE" "$" ""
@@ -76,7 +76,8 @@
</DockPanel> </DockPanel>
<DockPanel> <DockPanel>
<CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/> <CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/>
<CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/> <CheckBox Content="Enc. Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/>
<CheckBox Content="Create Empty" IsChecked="{Binding CreateEmpty}" VerticalContentAlignment="Center"/>
<CheckBox Content="Use Regex" IsChecked="{Binding UseRegexLR}" VerticalContentAlignment="Center" > <CheckBox Content="Use Regex" IsChecked="{Binding UseRegexLR}" VerticalContentAlignment="Center" >
<CheckBox.ToolTip> <CheckBox.ToolTip>
<TextBlock>Whether the program matches the LEFT and RIGHT strings through a regex pattern<LineBreak /> or with simple string in string searches</TextBlock> <TextBlock>Whether the program matches the LEFT and RIGHT strings through a regex pattern<LineBreak /> or with simple string in string searches</TextBlock>
@@ -114,6 +115,7 @@
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/> <CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/>
<CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/> <CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/>
<CheckBox Content="Create Empty" IsChecked="{Binding CreateEmpty}" VerticalContentAlignment="Center"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</TabItem> </TabItem>
@@ -126,6 +128,7 @@
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/> <CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/>
<CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/> <CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/>
<CheckBox Content="Create Empty" IsChecked="{Binding CreateEmpty}" VerticalContentAlignment="Center"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</TabItem> </TabItem>
@@ -142,6 +145,7 @@
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
<CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/> <CheckBox Content="Recursive" IsChecked="{Binding Recursive}" VerticalContentAlignment="Center"/>
<CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/> <CheckBox Content="Encode Output" IsChecked="{Binding EncodeOutput}" VerticalContentAlignment="Center"/>
<CheckBox Content="Create Empty" IsChecked="{Binding CreateEmpty}" VerticalContentAlignment="Center"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</TabItem> </TabItem>
+4 -4
View File
@@ -28,10 +28,10 @@ RECAPTCHA "URL" "SITEKEY" -> VAR "NAME"
CAPTCHA "URL" [Base64?] [SendScreenshot?] -> VAR "NAME" CAPTCHA "URL" [Base64?] [SendScreenshot?] -> VAR "NAME"
</item> </item>
<item name="PARSE"> <item name="PARSE">
PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" LR "LEFT" "RIGHT" [Recursive?] [EncodeOutput?] [CreateEmpty?] [UseRegexLR?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" CSS "SELECTOR" "ATTRIBUTE" [INDEX / Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" JSON "FIELD" [Recursive?] [EncodeOutput?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" JSON "FIELD" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"] PARSE "TARGET" REGEX "REGEX" "OUTPUT" [Recursive?] [EncodeOutput?] [CreateEmpty?] -> VAR/CAP "NAME" ["PREFIX" "SUFFIX"]
</item> </item>
<item name="UTILITY"> <item name="UTILITY">
UTILITY LIST "List Name" ACTION [PARAMETERS] [-> VAR/CAP "NAME"] UTILITY LIST "List Name" ACTION [PARAMETERS] [-> VAR/CAP "NAME"]
+40 -4
View File
@@ -288,16 +288,52 @@ namespace RuriLib
/// <param name="prefix">The string to add at the start of the value</param> /// <param name="prefix">The string to add at the start of the value</param>
/// <param name="suffix">The string to add at the end of the value</param> /// <param name="suffix">The string to add at the end of the value</param>
/// <param name="urlEncode">Whether to URLencode the values before creating the variables</param> /// <param name="urlEncode">Whether to URLencode the values before creating the variables</param>
public static void InsertVariables(BotData data, bool isCapture, bool recursive, List<string> values, string variableName, string prefix, string suffix, bool urlEncode) /// <param name="createEmpty">Whether to create an empty (single) variable if the list of values is empty</param>
public static void InsertVariables(BotData data, bool isCapture, bool recursive, List<string> values, string variableName, string prefix, string suffix, bool urlEncode, bool createEmpty)
{ {
var list = values.Select(v => ReplaceValues(prefix, data) + v.Trim() + ReplaceValues(suffix, data)).ToList(); var list = values.Select(v => ReplaceValues(prefix, data) + v.Trim() + ReplaceValues(suffix, data)).ToList();
if (urlEncode) list = list.Select(v => System.Uri.EscapeDataString(v)).ToList(); if (urlEncode) list = list.Select(v => System.Uri.EscapeDataString(v)).ToList();
CVar variable;
if (recursive) variable = new CVar(variableName, list, isCapture); CVar variable = null;
else variable = new CVar(variableName, list.Count == 0 ? "" : list.First(), isCapture); if (recursive)
{
if (list.Count == 0)
{
if (createEmpty)
{
variable = new CVar(variableName, list, isCapture);
}
}
else
{
variable = new CVar(variableName, list, isCapture);
}
}
else
{
if (list.Count == 0)
{
if (createEmpty)
{
variable = new CVar(variableName, "", isCapture);
}
}
else
{
variable = new CVar(variableName, list.First(), isCapture);
}
}
if (variable != null)
{
data.Variables.Set(variable); data.Variables.Set(variable);
data.Log(new LogEntry("Parsed variable" + " | Name: " + variable.Name + " | Value: " + variable.ToString() + Environment.NewLine, isCapture ? Colors.OrangeRed : Colors.Gold)); data.Log(new LogEntry("Parsed variable" + " | Name: " + variable.Name + " | Value: " + variable.ToString() + Environment.NewLine, isCapture ? Colors.OrangeRed : Colors.Gold));
} }
else
{
data.Log(new LogEntry("Could not parse any data. The variable was not created.", Colors.White));
}
}
#region File Utilities #region File Utilities
/// <summary> /// <summary>
+1 -1
View File
@@ -690,7 +690,7 @@ namespace RuriLib
} }
var isList = outputs.Count > 1 || InputString.Contains("[*]") || InputString.Contains("(*)") || InputString.Contains("{*}"); var isList = outputs.Count > 1 || InputString.Contains("[*]") || InputString.Contains("(*)") || InputString.Contains("{*}");
InsertVariables(data, isCapture, isList, outputs, variableName, "", "", false); InsertVariables(data, isCapture, isList, outputs, variableName, "", "", false, true);
} }
#region Base64 #region Base64
+15 -5
View File
@@ -63,6 +63,10 @@ namespace RuriLib
/// <summary>Whether to URL encode the parsed text.</summary> /// <summary>Whether to URL encode the parsed text.</summary>
public bool EncodeOutput { get { return encodeOutput; } set { encodeOutput = value; OnPropertyChanged(); } } public bool EncodeOutput { get { return encodeOutput; } set { encodeOutput = value; OnPropertyChanged(); } }
private bool createEmpty = true;
/// <summary>Whether to create the variable with an empty value if the parsing was not successful.</summary>
public bool CreateEmpty { get { return createEmpty; } set { createEmpty = value; OnPropertyChanged(); } }
private ParseType type = ParseType.LR; private ParseType type = ParseType.LR;
/// <summary>The parsing algorithm being used.</summary> /// <summary>The parsing algorithm being used.</summary>
public ParseType Type { get { return type; } set { type = value; OnPropertyChanged(); } } public ParseType Type { get { return type; } set { type = value; OnPropertyChanged(); } }
@@ -151,7 +155,7 @@ namespace RuriLib
LineParser.SetBool(ref input, this); LineParser.SetBool(ref input, this);
else if (LineParser.Lookahead(ref input) == TokenType.Integer) else if (LineParser.Lookahead(ref input) == TokenType.Integer)
CssElementIndex = LineParser.ParseInt(ref input, "INDEX"); CssElementIndex = LineParser.ParseInt(ref input, "INDEX");
if (LineParser.Lookahead(ref input) == TokenType.Boolean) while (LineParser.Lookahead(ref input) == TokenType.Boolean)
LineParser.SetBool(ref input, this); LineParser.SetBool(ref input, this);
break; break;
@@ -216,6 +220,7 @@ namespace RuriLib
.Literal(RightString) .Literal(RightString)
.Boolean(Recursive, "Recursive") .Boolean(Recursive, "Recursive")
.Boolean(EncodeOutput, "EncodeOutput") .Boolean(EncodeOutput, "EncodeOutput")
.Boolean(CreateEmpty, "CreateEmpty")
.Boolean(UseRegexLR, "UseRegexLR"); .Boolean(UseRegexLR, "UseRegexLR");
break; break;
@@ -225,14 +230,18 @@ namespace RuriLib
.Literal(AttributeName); .Literal(AttributeName);
if (Recursive) writer.Boolean(Recursive, "Recursive"); if (Recursive) writer.Boolean(Recursive, "Recursive");
else writer.Integer(CssElementIndex, "CssElementIndex"); else writer.Integer(CssElementIndex, "CssElementIndex");
writer.Boolean(EncodeOutput, "EncodeOutput");
writer
.Boolean(EncodeOutput, "EncodeOutput")
.Boolean(CreateEmpty, "CreateEmpty");
break; break;
case ParseType.JSON: case ParseType.JSON:
writer writer
.Literal(JsonField) .Literal(JsonField)
.Boolean(Recursive, "Recursive") .Boolean(Recursive, "Recursive")
.Boolean(EncodeOutput, "EncodeOutput"); .Boolean(EncodeOutput, "EncodeOutput")
.Boolean(CreateEmpty, "CreateEmpty");
break; break;
case ParseType.REGEX: case ParseType.REGEX:
@@ -240,7 +249,8 @@ namespace RuriLib
.Literal(RegexString) .Literal(RegexString)
.Literal(RegexOutput) .Literal(RegexOutput)
.Boolean(Recursive, "Recursive") .Boolean(Recursive, "Recursive")
.Boolean(EncodeOutput, "EncodeOutput"); .Boolean(EncodeOutput, "EncodeOutput")
.Boolean(CreateEmpty, "CreateEmpty");
break; break;
} }
@@ -260,7 +270,7 @@ namespace RuriLib
{ {
base.Process(data); base.Process(data);
InsertVariables(data, isCapture, recursive, Parse(data), variableName, prefix, suffix, encodeOutput); InsertVariables(data, isCapture, recursive, Parse(data), variableName, prefix, suffix, encodeOutput, createEmpty);
} }
private List<string> Parse(BotData data) private List<string> Parse(BotData data)
+1 -1
View File
@@ -341,7 +341,7 @@ namespace RuriLib
if (outputs.Count != 0) if (outputs.Count != 0)
{ {
InsertVariables(data, isCapture, recursive, outputs, outputVariable, "", "", false); InsertVariables(data, isCapture, recursive, outputs, outputVariable, "", "", false, true);
} }
} }