public void C2AcesToCondition(C3Addon addon, C2Ace ace) { try { var condition = new Condition { Category = ace.Category.ToLower(), Id = ace.ScriptName.SplitCamelCase("-"), DisplayText = ace.DisplayString, ListName = ace.ListName, Description = ace.Description, Highlight = "false", C2Id = ace.Id, Deprecated = ace.Flags.Contains("cf_deprecated").ToString().ToLower(), Trigger = ace.Flags.Contains("cf_trigger").ToString().ToLower(), FakeTrigger = ace.Flags.Contains("cf_fake_trigger").ToString().ToLower(), Static = ace.Flags.Contains("cf_static").ToString().ToLower(), Looping = ace.Flags.Contains("cf_looping").ToString().ToLower(), Invertible = (!ace.Flags.Contains("cf_not_invertible")).ToString().ToLower(), TriggerCompatible = (!ace.Flags.Contains("cf_incompatible_with_triggers")).ToString().ToLower(), }; if (ace.Params.Any()) { condition.Ace = C2TemplateHelper.ConditionAceImport(condition); condition.Language = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionLanguage, condition); condition.Code = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionCode, condition); var paramId = 0; //action params foreach (var param in ace.Params) { var paramType = ResolveParamType(param); condition = paramType == "combo" ? AceParameterHelper.Insatnce.GenerateParam(condition, $"param{paramId}", paramType, param.DefaultValue, $"param{paramId}", param.Description, param.ComboItems) : AceParameterHelper.Insatnce.GenerateParam(condition, $"param{paramId}", paramType, param.DefaultValue, $"param{paramId}", param.Description); paramId++; } } else { condition.Ace = C2TemplateHelper.ConditionAceImport(condition); condition.Language = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionLanguage, condition); condition.Code = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionCode, condition); } addon.Conditions.Add(condition.Id, condition); } catch (Exception ex) { LogManager.AddImportLogMessage($"ERROR => \n{ex.Message}"); LogManager.AddImportLogMessage($"STACK TRACE => \n{ex.StackTrace}"); return; } }
public void C2AcesToAction(C3Addon addon, C2Ace ace) { try { var action = new Action { Category = ace.Category.ToLower(), Id = ace.ScriptName.SplitCamelCase("-"), DisplayText = ace.DisplayString, ListName = ace.ListName, Description = ace.Description, Highlight = "false", C2Id = ace.Id, Deprecated = ace.Flags.Contains("af_deprecated").ToString().ToLower() }; if (ace.Params.Any()) { action.Ace = TemplateCompiler.Insatnce.CompileTemplates(C2TemplateHelper.ActionAceImport, action); action.Language = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionLanguage, action); action.Code = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionCode, action); var paramId = 0; //action params foreach (var param in ace.Params) { var paramType = ResolveParamType(param); action = paramType == "combo" ? AceParameterHelper.Insatnce.GenerateParam(action, $"param{paramId}", paramType, param.DefaultValue, $"param{paramId}", param.Description, param.ComboItems) : AceParameterHelper.Insatnce.GenerateParam(action, $"param{paramId}", paramType, param.DefaultValue, $"param{paramId}", param.Description); paramId++; } } else { action.Ace = TemplateCompiler.Insatnce.CompileTemplates(C2TemplateHelper.ActionAceImport, action); action.Language = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionLanguage, action); action.Code = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionCode, action); } addon.Actions.Add(action.Id, action); } catch (Exception ex) { LogManager.AddImportLogMessage($"ERROR => \n{ex.Message}"); LogManager.AddImportLogMessage($"STACK TRACE => \n{ex.StackTrace}"); return; } }
public void C2AceToExpression(C3Addon addon, C2Ace ace) { try { var exp = new Expression { Category = ace.Category.ToLower(), Id = ace.ScriptName.SplitCamelCase("-"), TranslatedName = ace.ScriptName, ReturnType = ResolveRetrunType(ace.Flags), Description = ace.Description, C2Id = ace.Id, Deprecated = ace.Flags.Contains("ef_deprecated").ToString().ToLower(), IsVariadicParameters = ace.Flags.Contains("ef_variadic_parameters").ToString().ToLower() }; if (ace.Params.Any()) { exp.Ace = C2TemplateHelper.ExpressionAceImport(exp); exp.Language = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionLanguage, exp); exp.Code = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionCode, exp); var paramId = 0; foreach (var param in ace.Params) { var paramType = ResolveParamType(param); AceParameterHelper.Insatnce.GenerateParam(exp, $"param{paramId}", paramType, param.DefaultValue, $"param{paramId}", param.Description); paramId++; } } else { exp.Ace = C2TemplateHelper.ExpressionAceImport(exp); exp.Language = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionLanguage, exp); exp.Code = TemplateCompiler.Insatnce.CompileTemplates(addon.Template.ActionCode, exp); } addon.Expressions.Add(exp.Id, exp); } catch (Exception ex) { LogManager.AddImportLogMessage($"ERROR => \n{ex.Message}"); LogManager.AddImportLogMessage($"STACK TRACE => \n{ex.StackTrace}"); return; } }
public C2Addon TraverseJavascriptTree(dynamic p) { // get addon type var config = p.body[0]; if (config.type == "FunctionDeclaration") { switch (config.id.name.ToString()) { case "GetPluginSettings": c2addon.Type = "Plugin"; break; case "GetBehaviorSettings": c2addon.Type = "Behavior"; break; case "Effect": c2addon.Type = "Effect"; break; default: c2addon.Type = "Unknown"; break; } //get properties var props = config.body.body[0].argument.properties; foreach (dynamic prop in props) { var key = prop.key.value.ToString(); //var value = prop.value.value.ToString(); var value = TryGet( () => throw new Exception(), () => prop.value.value.ToString(), () => prop.value.name.ToString(), () => { if (prop.value.type.ToString() == "BinaryExpression") { return(GetBinaryExpression(prop.value.left, prop.value.right)); } throw new RuntimeBinderException(); }); c2addon.Properties.Add(key, value); } } //get actions var body = p.body; var ace = new C2Ace(); var comboOptions = new List <string>(); foreach (var value in body) { //check for value to be of type expression statement if (value.type == "ExpressionStatement") { var expression = value.expression; string caller = TryGet( () => string.Empty, () => expression.callee.name.ToString() ); if (caller == "ACESDone") { continue; } else if (caller == "AddCondition" || caller == "AddAction") { var args = expression.arguments; var index = 0; foreach (var arg in args) { switch (index) { case 0: ace.Id = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 1: ace.Flags = TryGet( () => throw new Exception(), () => arg.value.ToString(), () => arg.name.ToString(), () => { if (arg.type.ToString() == "BinaryExpression") { return(GetBinaryExpression(arg.left, arg.right)); } throw new RuntimeBinderException(); }); break; case 2: ace.ListName = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 3: ace.Category = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 4: ace.DisplayString = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 5: ace.Description = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 6: ace.ScriptName = TryGet( () => string.Empty, () => arg.value.ToString()); break; } index++; } switch (caller) { case "AddCondition": c2addon.Conditions.Add(ace); break; case "AddAction": c2addon.Actions.Add(ace); break; default: LogManager.AddImportLogMessage($"Unknown function beign called => {caller}"); break; } ace = new C2Ace(); } else if (caller == "AddExpression") { var args = expression.arguments; var index = 0; foreach (var arg in args) { switch (index) { case 0: ace.Id = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 1: ace.Flags = TryGet( () => throw new Exception(), () => arg.value.ToString(), () => arg.name.ToString(), () => { if (arg.type.ToString() == "BinaryExpression") { return(GetBinaryExpression(arg.left, arg.right)); } throw new RuntimeBinderException(); }); break; case 2: ace.ListName = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 3: ace.Category = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 4: ace.ScriptName = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 5: ace.Description = TryGet( () => string.Empty, () => arg.value.ToString()); break; } index++; } switch (caller) { case "AddExpression": c2addon.Expressions.Add(ace); break; default: LogManager.AddImportLogMessage($"Unknown function beign called => {caller}"); break; } ace = new C2Ace(); } else { var paramOptions = TryGet( () => string.Empty, () => value.expression.callee.name.ToString()); var param = new C2AceParam { Script = paramOptions }; //todo: if script is not one of the param functions => resolve function; if (paramOptions == "AddComboParamOption") { comboOptions.Add(value.expression.arguments[0].value.ToString()); } param.ComboItems = comboOptions; comboOptions = new List <string>(); var args = value.expression.arguments; if (args != null) { var index = 0; foreach (var arg in args) { switch (index) { case 0: param.Text = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 1: param.Description = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 2: //check else param.DefaultValue = TryGet( () => string.Empty, () => arg.value.ToString()); break; } index++; } ace.Params.Add(param); } } } else if (value.type == "VariableDeclaration") { var declaration = value.declarations[0]; if (declaration.id.name.ToString() == "property_list") { if (declaration.init.type == "ArrayExpression") { var arrElements = declaration.init.elements; //not property array if (arrElements == null) { continue; } foreach (var element in arrElements) { var args = element.arguments; var prop = new C2Property(); var index = 0; foreach (var arg in args) { switch (index) { case 0: prop.Type = TryGet( () => string.Empty, () => arg.name.ToString()); break; case 1: prop.Name = TryGet( () => throw new Exception(), () => arg.value.ToString()); break; case 2: prop.Value = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 3: prop.Description = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 4: prop.Params = TryGet( () => string.Empty, () => arg.value.ToString()); break; case 5: prop.Readonly = TryGet( () => string.Empty, () => arg.value.ToString()); break; } index++; } c2addon.PluginProperties.Add(prop); } } } } } return(c2addon); }
public C2Addon Parse(string json) { var c2addon = new C2Addon(); dynamic data = JObject.Parse(json); //settings var settings = data["settings"]; foreach (JProperty prop in settings) { //handle array if (prop.Name == "flags") { var sb = new StringBuilder(); foreach (var val in prop.Value) { sb.Append($" {val} "); } c2addon.Properties.Add(prop.Name, sb.ToString()); continue; } c2addon.Properties.Add(prop.Name, prop.Value.ToString()); } //properties var props = data["properties"]; foreach (var p in props) { var property = new C2Property(); property.Type = p["flags"].ToString(); property.Name = p["key"].ToString(); property.Value = p["initial_str"]?.ToString() ?? string.Empty; property.Description = p["description"].ToString(); var flags = p["params"]; var fList = new List <string>(); foreach (var flag in flags) { fList.Add(flag); } property.Params = string.Join("|", fList); property.Readonly = p["read_only"] != null ? p["read_only"].ToString().ToLower() : "false"; } //actions var actions = data["actions"]; c2addon.Actions = new List <C2Ace>(); foreach (JObject act in actions) { var ace = new C2Ace { Id = act["id"].ToString(), ListName = act["list_name"].ToString(), Category = act["category"].ToString(), DisplayString = act["display_string"].ToString(), Description = act["description"].ToString(), ScriptName = act["script_name"].ToString() }; //get flags var sb = new StringBuilder(); foreach (var val in act["flags"]) { sb.Append($" {val} "); } ace.Flags = sb.ToString(); //params foreach (var param in act["params"]) { var aceParam = new C2AceParam { Text = param["name"]?.ToString(), Description = param["description"]?.ToString(), DefaultValue = param["initial"]?.ToString(), Script = param["caller"]?.ToString() }; if (param["caller"]?.ToString() == "AddComboParam") { aceParam.ComboItems = new List <string>(); foreach (var val in param["options"]) { aceParam.ComboItems.Add(val["text"].ToString()); } } ace.Params.Add(aceParam); c2addon.Actions.Add(ace); } } //conditions var conditions = data["conditions"]; c2addon.Conditions = new List <C2Ace>(); foreach (JObject cnd in conditions) { var ace = new C2Ace { Id = cnd["id"].ToString(), ListName = cnd["list_name"].ToString(), Category = cnd["category"].ToString(), DisplayString = cnd["display_string"].ToString(), Description = cnd["description"].ToString(), ScriptName = cnd["script_name"].ToString() }; //get flags var sb = new StringBuilder(); foreach (var val in cnd["flags"]) { sb.Append($" {val} "); } ace.Flags = sb.ToString(); //params foreach (var param in cnd["params"]) { var aceParam = new C2AceParam { Text = param["name"]?.ToString(), Description = param["description"]?.ToString(), DefaultValue = param["initial"]?.ToString(), Script = param["caller"]?.ToString() }; if (param["caller"]?.ToString() == "AddComboParam") { aceParam.ComboItems = new List <string>(); foreach (var val in param["options"]) { aceParam.ComboItems.Add(val["text"].ToString()); } } ace.Params.Add(aceParam); } c2addon.Conditions.Add(ace); } //expressions var expressions = data["expressions"]; c2addon.Expressions = new List <C2Ace>(); foreach (JObject exp in expressions) { var ace = new C2Ace { Id = exp["id"].ToString(), ListName = exp["list_name"].ToString(), Category = exp["category"].ToString(), Description = exp["description"].ToString(), ScriptName = exp["expression_name"].ToString(), }; //get flags var sb = new StringBuilder(); foreach (var val in exp["flags"]) { sb.Append($" {val} "); } ace.Flags = sb.ToString(); //params foreach (var param in exp["params"]) { var aceParam = new C2AceParam { Text = param["name"]?.ToString(), Description = param["description"]?.ToString(), DefaultValue = param["initial"]?.ToString(), Script = param["caller"]?.ToString() }; if (param["caller"]?.ToString() == "AddComboParam") { aceParam.ComboItems = new List <string>(); foreach (var val in param["options"]) { aceParam.ComboItems.Add(val["text"].ToString()); } } ace.Params.Add(aceParam); } c2addon.Expressions.Add(ace); } return(c2addon); }