public string ExpandVariables(LoggerDelegate logger, object o, bool numeric, string expr) { Match m, mx; string newexpr = expr; int i = 1; while (true) { m = rex.Match(newexpr); if (m.Success == false) { m = rexnum.Match(newexpr); if (m.Success == false) { break; } } string x = m.Groups["id"].Value; string val = ""; bool found = false; if (testmode == true) { if (x == "_since") { val = ((int)Math.Floor((DateTime.UtcNow - triggered).TotalSeconds)).ToString(); } else if (x == "_sincems") { val = ((int)Math.Floor((DateTime.UtcNow - triggered).TotalMilliseconds)).ToString(); } else { val = (numeric == true ? "1" : "test"); } found = true; } else { int gn; if (Int32.TryParse(x, out gn) == true) { if (gn >= 0 && gn < numgroups.Count) { val = numgroups[gn]; found = true; } } if (found == false) { if (namedgroups.ContainsKey(x) == true) { val = namedgroups[x]; found = true; } } if (found == false) { if (x == "_since") { val = ((int)Math.Floor((DateTime.UtcNow - triggered).TotalSeconds)).ToString(); found = true; } else if (x == "_sincems") { val = ((int)Math.Floor((DateTime.UtcNow - triggered).TotalMilliseconds)).ToString(); found = true; } else if (x == "_systemtime") { val = ((long)(DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0)).TotalSeconds).ToString(); found = true; } else if (x == "_systemtimems") { val = ((long)(DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0)).TotalMilliseconds).ToString(); found = true; } else if (x == "_response") { val = contextResponse; found = true; } else if (x.IndexOf("_jsonresponse") == 0) { mx = rexlidx.Match(x); if (mx.Success == true) { string pathspec = mx.Groups["index"].Value; if (contextJsonParsed == false) { JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); contextJsonResponse = jsonSerializer.Deserialize <dynamic>(contextResponse); contextJsonParsed = true; } string[] path = pathspec.Split("/".ToCharArray()); dynamic curdir = contextJsonResponse; foreach (string px in path) { curdir = curdir[px]; } val = curdir.ToString(); found = true; } } else if (x.IndexOf("evar:") == 0) { string varname = x.Substring(5); lock (plug.simplevariables) // verified { if (plug.simplevariables.ContainsKey(varname) == true) { val = "1"; } else { val = "0"; } found = true; } } else if (x.IndexOf("elvar:") == 0) { string varname = x.Substring(6); lock (plug.listvariables) // verified { if (plug.listvariables.ContainsKey(varname) == true) { val = "1"; } else { val = "0"; } found = true; } } else if (x.IndexOf("var:") == 0) { string varname = x.Substring(4); lock (plug.simplevariables) // verified { if (plug.simplevariables.ContainsKey(varname) == true) { val = plug.simplevariables[varname].Value; found = true; } } } else if (x.IndexOf("lvar:") == 0) { string varname = x.Substring(5); mx = rexlprp.Match(varname); if (mx.Success == true) { string gname = mx.Groups["name"].Value; string gprop = mx.Groups["prop"].Value; switch (gprop) { case "size": { lock (plug.listvariables) { VariableList vl = GetListVariable(plug, gname, false); val = vl.Size().ToString(); found = true; } } break; case "indexof": { string garg = mx.Groups["arg"].Value; lock (plug.listvariables) { VariableList vl = GetListVariable(plug, gname, false); val = vl.IndexOf(garg).ToString(); found = true; } } break; } } else { mx = rexlidx.Match(varname); if (mx.Success == true) { string gname = mx.Groups["name"].Value; string gindex = mx.Groups["index"].Value; lock (plug.listvariables) { VariableList vl = GetListVariable(plug, gname, false); if (gindex == "last") { gindex = vl.Size().ToString(); } int iindex; if (Int32.TryParse(gindex, out iindex) == true) { val = vl.Peek(iindex); } found = true; } found = true; } } } else if (x.IndexOf("numeric:") == 0) { string numexpr = x.Substring(8); val = I18n.ThingToString(EvaluateNumericExpression(logger, o, numexpr)); found = true; } else if (x.IndexOf("string:") == 0) { string numexpr = x.Substring(7); val = EvaluateStringExpression(logger, o, numexpr); found = true; } else if (x.IndexOf("func:") == 0) { val = ""; found = true; string funcexpr = x.Substring(5); int splitter = funcexpr.IndexOf(":"); if (splitter > 0) { string funcdef = funcexpr.Substring(0, splitter); Match rxm = rexfunc.Match(funcdef); if (rxm.Success == true) { string funcname = rxm.Groups["name"].Value.ToLower(); string funcarg = rxm.Groups["arg"].Value; string[] args = SplitArguments(funcarg); int argc = args.Count(); string funcval = funcexpr.Substring(splitter + 1); switch (funcname) { case "toupper": // toupper() val = funcval.ToUpper(); break; case "tolower": // tolower() val = funcval.ToLower(); break; case "length": // length() val = funcval.Length.ToString(); break; case "hex2dec": // hex2dec() val = "" + int.Parse(funcval, System.Globalization.NumberStyles.HexNumber); break; case "padleft": // padleft(charcode,length) if (argc != 2) { throw new ArgumentException(I18n.Translate("internal/Context/padleftargerror", "Padleft function requires two arguments, {0} were given", argc)); } else { val = funcval.PadLeft(Int32.Parse(args[1]), (char)Int32.Parse(args[0])); } break; case "padright": // padright(charcode,length) if (argc != 2) { throw new ArgumentException(I18n.Translate("internal/Context/padrightargerror", "Padright function requires two arguments, {0} were given", argc)); } else { val = funcval.PadRight(Int32.Parse(args[1]), (char)Int32.Parse(args[0])); } break; case "substring": // substring(startindex, length) or substring(startindex) if (argc != 1 && argc != 2) { throw new ArgumentException(I18n.Translate("internal/Context/substringargerror", "Substring function requires one or two arguments, {0} were given", argc)); } else { switch (argc) { case 1: val = funcval.Substring(Int32.Parse(args[0])); break; case 2: val = funcval.Substring(Int32.Parse(args[0]), Int32.Parse(args[1])); break; } } break; case "indexof": // indexof(stringtosearch) if (argc != 1) { throw new ArgumentException(I18n.Translate("internal/Context/indexofargerror", "Indexof function requires one argument, {0} were given", argc)); } else { val = "" + funcval.IndexOf(args[0]); } break; case "trim": // trim() or trim(charcode,charcode,charcode,...) if (argc == 0 || args[0] == "") { val = funcval.Trim(); } else { string xx = ""; foreach (string xyz in args) { xx += (char)Int32.Parse(xyz); } val = funcval.Trim(xx.ToCharArray()); } break; case "trimleft": // trimleft() or trimleft(charcode,charcode,charcode,...) if (argc == 0 || args[0] == "") { val = funcval.TrimStart(); } else { string xx = ""; foreach (string xyz in args) { xx += (char)Int32.Parse(xyz); } val = funcval.TrimStart(xx.ToCharArray()); } break; case "trimright": // trimright() or trimright(charcode,charcode,charcode,...) if (argc == 0 || args[0] == "") { val = funcval.TrimEnd(); } else { string xx = ""; foreach (string xyz in args) { xx += (char)Int32.Parse(xyz); } val = funcval.TrimEnd(xx.ToCharArray()); } break; case "format": // format(type,formatstring) if (argc != 2) { throw new ArgumentException(I18n.Translate("internal/Context/formatargerror", "Format function requires two arguments, {0} were given", argc)); } else { Type type = Type.GetType(args[0]); object converted = Convert.ChangeType(funcval, type, CultureInfo.InvariantCulture); val = String.Format("{0:" + args[1] + "}", converted); } break; } } } } else if (x == "_ffxivplayer") { VariableClump vc = PluginBridges.BridgeFFXIV.GetMyself(); if (vc != null) { val = vc.GetValue("name"); } found = true; } else if (x == "_ffxivpartyorder") { val = plug.cfg.FfxivPartyOrdering + " " + plug.cfg.FfxivCustomPartyOrder; found = true; } else if (x == "_incombat") { val = (plug.mainform.InCombat == true) ? "1" : "0"; found = true; } else if (x == "_duration") { try { if (plug.mainform.InCombat == true) { val = ((int)Math.Floor(plug.mainform.ActiveZone.ActiveEncounter.Duration.TotalSeconds)).ToString(); } else { val = "0"; } } catch (Exception) { val = "0"; } found = true; } else if (x.IndexOf("_ffxivparty") == 0) { mx = rexnump.Match(x); if (mx.Success == true) { string gindex = mx.Groups["index"].Value; string gprop = mx.Groups["prop"].Value; int iindex = 0; Int64 honk; VariableClump vc = null; bool foundid = false; if (Int64.TryParse(gindex, System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out honk) == true) { vc = PluginBridges.BridgeFFXIV.GetIdPartyMember(gindex, out foundid); } if (foundid == false) { if (Int32.TryParse(gindex, out iindex) == true) { vc = PluginBridges.BridgeFFXIV.GetPartyMember(iindex); } else { vc = PluginBridges.BridgeFFXIV.GetNamedPartyMember(gindex); } } if (vc != null) { val = vc.GetValue(gprop); } } found = true; } else if (x.IndexOf("_ffxiventity") == 0) { mx = rexnump.Match(x); if (mx.Success == true) { string gindex = mx.Groups["index"].Value; string gprop = mx.Groups["prop"].Value; Int64 honk; VariableClump vc = null; bool foundid = false; if (Int64.TryParse(gindex, System.Globalization.NumberStyles.HexNumber, CultureInfo.InvariantCulture, out honk) == true) { vc = PluginBridges.BridgeFFXIV.GetIdEntity(gindex, out foundid); } if (foundid == false) { vc = PluginBridges.BridgeFFXIV.GetNamedEntity(gindex); } if (vc != null) { val = vc.GetValue(gprop); } } found = true; } else if (x == "_ffxivtime") { TimeSpan ez = GetEorzeanTime(); int mins = (int)Math.Floor(ez.TotalMinutes); val = mins.ToString(); found = true; } else if (x == "_lastencounter") { Advanced_Combat_Tracker.FormActMain act = Advanced_Combat_Tracker.ActGlobals.oFormActMain; FieldInfo fi = act.GetType().GetField("defaultTextFormat", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance); dynamic texf = fi.GetValue(act); val = ""; if (texf != null) { int zones = act.ZoneList.Count; for (int ii = zones - 1; ii >= 0; ii--) { int encs = act.ZoneList[ii].Items.Count; for (int jj = encs - 1; jj >= 1; jj--) { if (act.ZoneList[ii].Items[jj] != act.ActiveZone.ActiveEncounter) { val = act.GetTextExport(act.ZoneList[ii].Items[jj], texf); ii = 0; jj = 0; } } } } found = true; } else if (x == "_activeencounter") { Advanced_Combat_Tracker.FormActMain act = Advanced_Combat_Tracker.ActGlobals.oFormActMain; FieldInfo fi = act.GetType().GetField("defaultTextFormat", BindingFlags.GetField | BindingFlags.NonPublic | BindingFlags.Instance); dynamic texf = fi.GetValue(act); val = act.GetTextExport(act.ActiveZone.ActiveEncounter, texf); found = true; } else if (x.IndexOf("_textaura") == 0) { mx = rexnump.Match(x); if (mx.Success == true) { string gindex = mx.Groups["index"].Value; string gprop = mx.Groups["prop"].Value.ToLower(); val = ""; lock (plug.textauras) { if (plug.textauras.ContainsKey(gindex) == true) { Forms.AuraContainerForm acf = plug.textauras[gindex]; switch (gprop) { case "x": val = acf.Left.ToString(CultureInfo.InvariantCulture); break; case "y": val = acf.Top.ToString(CultureInfo.InvariantCulture); break; case "w": val = acf.Width.ToString(CultureInfo.InvariantCulture); break; case "h": val = acf.Height.ToString(CultureInfo.InvariantCulture); break; case "opacity": val = acf.PresentableOpacity.ToString(CultureInfo.InvariantCulture); break; case "text": val = acf.CurrentText; break; } } } found = true; } } else if (x.IndexOf("_imageaura") == 0) { mx = rexnump.Match(x); if (mx.Success == true) { string gindex = mx.Groups["index"].Value; string gprop = mx.Groups["prop"].Value.ToLower(); val = ""; lock (plug.imageauras) { if (plug.imageauras.ContainsKey(gindex) == true) { Forms.AuraContainerForm acf = plug.imageauras[gindex]; switch (gprop) { case "x": val = acf.Left.ToString(CultureInfo.InvariantCulture); break; case "y": val = acf.Top.ToString(CultureInfo.InvariantCulture); break; case "w": val = acf.Width.ToString(CultureInfo.InvariantCulture); break; case "h": val = acf.Height.ToString(CultureInfo.InvariantCulture); break; case "opacity": val = acf.PresentableOpacity.ToString(CultureInfo.InvariantCulture); break; } } } found = true; } } else if (x == "_screenwidth") { System.Windows.Forms.Screen scr = System.Windows.Forms.Screen.PrimaryScreen; val = scr.WorkingArea.Width.ToString(CultureInfo.InvariantCulture); found = true; } else if (x == "_screenheight") { System.Windows.Forms.Screen scr = System.Windows.Forms.Screen.PrimaryScreen; val = scr.WorkingArea.Height.ToString(CultureInfo.InvariantCulture); found = true; } else if (x == "_screenminx") { val = plug.MinX.ToString(CultureInfo.InvariantCulture); found = true; } else if (x == "_screenminy") { val = plug.MinY.ToString(CultureInfo.InvariantCulture); found = true; } else if (x == "_screenmaxx") { val = plug.MaxX.ToString(CultureInfo.InvariantCulture); found = true; } else if (x == "_screenmaxy") { val = plug.MaxY.ToString(CultureInfo.InvariantCulture); found = true; } else if (x == "_fps") { if (plug.sc != null) { val = plug.sc.FPS.ToString(CultureInfo.InvariantCulture); } else { val = "0"; } found = true; } } } newexpr = newexpr.Substring(0, m.Index) + val + newexpr.Substring(m.Index + m.Length); /* * if (logger != null) * { * logger(o, I18n.Translate("internal/Context/expansionstep", "Expansion step {0} from '{1}' to '{2}' ({3}) = '{4}'", i, expr, newexpr, val, found)); * } * else if (plug != null) * { * plug.FilteredAddToLog(Plugin.DebugLevelEnum.Verbose, I18n.Translate("internal/Context/expansionstep", "Expansion step {0} from '{1}' to '{2}' ({3}) = '{4}'", i, expr, newexpr, val, found)); * }*/ i++; } ; if (trig != null) { if (trig.DebugLevel == Plugin.DebugLevelEnum.Inherit) { if (plug != null) { if (plug.cfg.DebugLevel < Plugin.DebugLevelEnum.Verbose) { return(newexpr); } } } else { if (trig.DebugLevel < Plugin.DebugLevelEnum.Verbose) { return(newexpr); } } } if (newexpr.CompareTo(expr) != 0) { if (logger != null) { logger(o, I18n.Translate("internal/Context/expansion", "Variable expansion from '{0}' to '{1}'", expr, newexpr)); } else if (plug != null) { plug.FilteredAddToLog(Plugin.DebugLevelEnum.Verbose, I18n.Translate("internal/Context/expansion", "Variable expansion from '{0}' to '{1}'", expr, newexpr)); } } return(newexpr); }
internal override bool CheckCondition(Context ctx, Context.LoggerDelegate logger, object o) { try { if (Enabled == false) { return(false); } string lval = "", rval = ""; switch (ExpressionTypeL) { case ExprTypeEnum.Numeric: lval = I18n.ThingToString(ctx.EvaluateNumericExpression(logger, o, ExpressionL)); break; case ExprTypeEnum.String: lval = ctx.EvaluateStringExpression(logger, o, ExpressionL); break; } switch (ExpressionTypeR) { case ExprTypeEnum.Numeric: rval = I18n.ThingToString(ctx.EvaluateNumericExpression(logger, o, ExpressionR)); break; case ExprTypeEnum.String: rval = ctx.EvaluateStringExpression(logger, o, ExpressionR); break; } switch (ConditionType) { case CndTypeEnum.NumericEqual: { double ld = double.Parse(lval, CultureInfo.InvariantCulture); double rd = double.Parse(rval, CultureInfo.InvariantCulture); return(Math.Abs(ld - rd) < double.Epsilon ? true : false); } case CndTypeEnum.NumericNotEqual: { double ld = double.Parse(lval, CultureInfo.InvariantCulture); double rd = double.Parse(rval, CultureInfo.InvariantCulture); return(Math.Abs(ld - rd) < double.Epsilon ? false : true); } case CndTypeEnum.NumericGreater: { double ld = double.Parse(lval, CultureInfo.InvariantCulture); double rd = double.Parse(rval, CultureInfo.InvariantCulture); return(ld > rd); } case CndTypeEnum.NumericGreaterEqual: { double ld = double.Parse(lval, CultureInfo.InvariantCulture); double rd = double.Parse(rval, CultureInfo.InvariantCulture); return(ld >= rd); } case CndTypeEnum.NumericLess: { double ld = double.Parse(lval, CultureInfo.InvariantCulture); double rd = double.Parse(rval, CultureInfo.InvariantCulture); return(ld < rd); } case CndTypeEnum.NumericLessEqual: { double ld = double.Parse(lval, CultureInfo.InvariantCulture); double rd = double.Parse(rval, CultureInfo.InvariantCulture); return(ld <= rd); } case CndTypeEnum.StringEqualCase: { return(String.Compare(lval, rval, false) == 0); } case CndTypeEnum.StringEqualNocase: { return(String.Compare(lval, rval, true) == 0); } case CndTypeEnum.StringNotEqualCase: { return(String.Compare(lval, rval, false) != 0); } case CndTypeEnum.StringNotEqualNocase: { return(String.Compare(lval, rval, true) != 0); } case CndTypeEnum.RegexMatch: { return(Regex.IsMatch(lval, rval)); } case CndTypeEnum.RegexNotMatch: { return(Regex.IsMatch(lval, rval) == false); } case CndTypeEnum.ListContains: { lock (ctx.plug.listvariables) { if (ctx.plug.listvariables.ContainsKey(lval) == true) { if (ctx.plug.listvariables[lval].IndexOf(rval) > 0) { return(true); } } } return(false); } case CndTypeEnum.ListDoesNotContain: { lock (ctx.plug.listvariables) { if (ctx.plug.listvariables.ContainsKey(lval) == true) { if (ctx.plug.listvariables[lval].IndexOf(rval) > 0) { return(false); } } } return(true); } } } catch (Exception) { } return(false); }
internal void Fire(RealPlugin p, Context ctx) { try { if ((ctx.force & Action.TriggerForceTypeEnum.SkipConditions) == 0) { if (Condition != null && Condition.Enabled == true) { if (Condition.CheckCondition(ctx, TriggerContextLogger, ctx.plug) == false) { AddToLog(p, RealPlugin.DebugLevelEnum.Info, I18n.Translate("internal/Trigger/trignotfired", "Trigger '{0}' not fired, condition not met", LogName)); return; } } } DateTime prevLastFired = LastFired; LastFired = DateTime.Now; if (_PeriodRefire == RefireEnum.Deny) { RefireDelayedUntil = LastFired.AddMilliseconds(ctx.EvaluateNumericExpression(TriggerContextLogger, p, _RefirePeriodExpression)); AddToLog(p, RealPlugin.DebugLevelEnum.Info, I18n.Translate("internal/Trigger/delayingrefire", "Delaying trigger '{0}' refire to {1}", LogName, RefireDelayedUntil)); } else { RefireDelayedUntil = DateTime.MinValue; } DateTime curtime = DateTime.Now; if (_Scheduling == SchedulingEnum.FromLastAction) { // get the last queued action as curTime lock (ctx.plug.ActionQueue) { var ixy = from ax in ctx.plug.ActionQueue where ax.ctx.trig.Id == Id orderby ax.when descending select ax; if (ixy.Count() > 0) { curtime = ixy.ElementAt(0).when; AddToLog(p, RealPlugin.DebugLevelEnum.Info, I18n.Translate("internal/Trigger/lastactionfound", "Last action for trigger '{0}' found at {1}", LogName, curtime)); } } } else if (_Scheduling == SchedulingEnum.FromRefirePeriod) { curtime = prevLastFired.AddMilliseconds(ctx.EvaluateNumericExpression(TriggerContextLogger, p, _RefirePeriodExpression)); if (curtime < LastFired) { curtime = LastFired; AddToLog(p, RealPlugin.DebugLevelEnum.Verbose, I18n.Translate("internal/Trigger/beforelastfired", "Current time is before last fired for trigger '{0}'", LogName)); } } if (_PrevActions == PrevActionsEnum.Interrupt) { int exx = 0; lock (ctx.plug.ActionQueue) { var ixy = from ax in ctx.plug.ActionQueue where ax.ctx.trig.Id == Id select ax; if (ixy.Count() > 0) { List <RealPlugin.QueuedAction> rems = new List <RealPlugin.QueuedAction>(); rems.AddRange(ixy); foreach (RealPlugin.QueuedAction qa in rems) { ctx.plug.ActionQueue.Remove(qa); exx++; } } } if (exx > 0) { if (_PrevActionsRefire == RefireEnum.Deny) { AddToLog(p, RealPlugin.DebugLevelEnum.Info, I18n.Translate("internal/Trigger/removefromqueuenorefire", "Removed {0} instance(s) of trigger '{1}' actions from queue, refire denied", exx, LogName)); return; } else { AddToLog(p, RealPlugin.DebugLevelEnum.Info, I18n.Translate("internal/Trigger/removefromqueue", "Removed {0} instance(s) of trigger '{1}' actions from queue", exx, LogName)); } } } else if (_PrevActionsRefire == RefireEnum.Deny) { int exx = 0; lock (ctx.plug.ActionQueue) { var ixy = from ax in ctx.plug.ActionQueue where ax.ctx.trig.Id == Id select ax; exx = ixy.Count(); } if (exx > 0) { AddToLog(p, RealPlugin.DebugLevelEnum.Info, I18n.Translate("internal/Trigger/refiredenied", "{0} instance(s) of trigger '{1}' actions in queue, refire denied", exx, LogName)); return; } } if (_Sequential == false) { var ix = from tx in Actions orderby tx.OrderNumber ascending select tx; foreach (Action a in ix) { if (a._Enabled == true) { curtime = curtime.AddMilliseconds(ctx.EvaluateNumericExpression(TriggerContextLogger, p, a._ExecutionDelayExpression)); p.QueueAction(ctx, this, a, curtime); } } } else { Action prev = null; Action first = null; var ix = from tx in Actions orderby tx.OrderNumber ascending select tx; foreach (Action a in ix) { if (a._Enabled == false) { continue; } if (prev != null) { prev.NextAction = a; } else { first = a; curtime = curtime.AddMilliseconds(ctx.EvaluateNumericExpression(TriggerContextLogger, p, a._ExecutionDelayExpression)); } prev = a; } if (first != null) { p.QueueAction(ctx, this, first, curtime); } } } catch (Exception ex) { AddToLog(p, RealPlugin.DebugLevelEnum.Error, I18n.Translate("internal/Trigger/firingexception", "Trigger '{0}' didn't fire due to exception: {1}", LogName, ex.Message)); } }
public override string ToString() { string desc = ""; if (ConditionType == CndTypeEnum.ListContains || ConditionType == CndTypeEnum.ListDoesNotContain) { desc = I18n.Translate("internal/ConditionSingle/listvar", "List variable specified by"); desc += " "; switch (ExpressionTypeL) { case ExprTypeEnum.Numeric: desc += I18n.Translate("internal/ConditionSingle/numericexpression", "numeric expression ({0})", ExpressionL); break; case ExprTypeEnum.String: desc += I18n.Translate("internal/ConditionSingle/stringexpression", "string expression ({0})", ExpressionL); break; } desc += " "; switch (ConditionType) { case CndTypeEnum.ListContains: desc += I18n.Translate("internal/ConditionSingle/listmustcontain", "must contain the result from"); break; case CndTypeEnum.ListDoesNotContain: desc += I18n.Translate("internal/ConditionSingle/listcantcontain", "must not contain the result from"); break; } } else { switch (ExpressionTypeL) { case ExprTypeEnum.Numeric: desc = Capitalize(I18n.Translate("internal/ConditionSingle/numericexpression", "numeric expression ({0})", ExpressionL)); break; case ExprTypeEnum.String: desc = Capitalize(I18n.Translate("internal/ConditionSingle/stringexpression", "string expression ({0})", ExpressionL)); break; } desc += " "; switch (ConditionType) { case CndTypeEnum.NumericEqual: desc += I18n.Translate("internal/ConditionSingle/numericequal", "must be numerically equal to"); break; case CndTypeEnum.NumericNotEqual: desc += I18n.Translate("internal/ConditionSingle/numericnotequal", "must not be numerically equal to"); break; case CndTypeEnum.NumericGreater: desc += I18n.Translate("internal/ConditionSingle/numericgreater", "must be numerically greater than"); break; case CndTypeEnum.NumericGreaterEqual: desc += I18n.Translate("internal/ConditionSingle/numericgreaterequal", "must be numerically greater or equal to"); break; case CndTypeEnum.NumericLess: desc += I18n.Translate("internal/ConditionSingle/numericless", "must be numerically less than"); break; case CndTypeEnum.NumericLessEqual: desc += I18n.Translate("internal/ConditionSingle/numericlessequal", "must be numerically less or equal to"); break; case CndTypeEnum.StringEqualCase: desc += I18n.Translate("internal/ConditionSingle/stringequalcase", "must pass case-sensitive string comparison to the string from"); break; case CndTypeEnum.StringEqualNocase: desc += I18n.Translate("internal/ConditionSingle/stringequalnocase", "must pass case-insensitive string comparison to the string from"); break; case CndTypeEnum.StringNotEqualCase: desc += I18n.Translate("internal/ConditionSingle/stringnotequalcase", "must not pass case-sensitive string comparison to the string from"); break; case CndTypeEnum.StringNotEqualNocase: desc += I18n.Translate("internal/ConditionSingle/stringnotequalnocase", "must not pass case-insensitive string comparison to the string from"); break; case CndTypeEnum.RegexMatch: desc += I18n.Translate("internal/ConditionSingle/regexmatch", "must match the regular expression from"); break; case CndTypeEnum.RegexNotMatch: desc += I18n.Translate("internal/ConditionSingle/noregexmatch", "must not match the regular expression from"); break; } } switch (ExpressionTypeR) { case ExprTypeEnum.Numeric: desc += " " + I18n.Translate("internal/ConditionSingle/numericexpression", "numeric expression ({0})", ExpressionR); break; case ExprTypeEnum.String: desc += " " + I18n.Translate("internal/ConditionSingle/stringexpression", "string expression ({0})", ExpressionR); break; } return(Capitalize(desc)); }