public string ResolveParamType(C2AceParam param) { switch (param.Script) { case "AddNumberParam": return("number"); case "AddStringParam": return("string"); case "AddAnyTypeParam": return("any"); case "AddCmpParam": return("cmp"); case "AddComboParam": return("combo"); case "AddObjectParam": return("object"); case "AddLayerParam": return("layer"); case "AddLayoutParam": return("layout"); case "AddKeybParam": return("keyb"); case "AddAnimationParam": return("animation"); case "AddAudioFileParam": return(string.Empty); //todo: figure out what equivalent is in c3 case "AddVariadicParams": return(string.Empty); //todo: figure out what to dof or varadic params case "AddFunctionNameParam": throw new Exception("AddFunctionNameParam not supported by C3SDK"); default: return(string.Empty); } }
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); }