private void ProcessCommandInvoke(int source, List <object> args, string raw) { string baseCommand = raw.Split(' ')[0].Replace("/", ""); if (args.Count < 1) { //Show base command usage. return; } string subCommand = (string)args[0]; RaceCommandDefinition currentDefinition = null; foreach (RaceCommandDefinition def in commandDefinitions) { if (string.Compare(baseCommand, def.BaseCommand, true) == 0 && string.Compare(subCommand, def.SubCommand, true) == 0) { currentDefinition = def; break; } } if (currentDefinition != null) { bool isValid = true; string paramName = ""; List <object> paramList = new List <object>(); int paramCount = 1; if (currentDefinition.Parameters.Count > args.Count) { //TODO: Move this to RaceCommandDefinition. currentDefinition.OnCommandFailed.DynamicInvoke(new[] { $"Parameter count doesn't match, expected {currentDefinition.Parameters.Count} params , got {args.Count} params." }); return; } string paramInvalidReason = ""; foreach (var paramKvp in currentDefinition.Parameters) { paramName = paramKvp.Key; var param = paramKvp.Value; var arg = args[paramCount]; //Add player source. if (string.Compare("player", param.Name) == 0) { paramList.Add(source); } //Else we copy over any of the args we got passed. else if (param.IsParamValid(arg, out paramInvalidReason)) { paramList.Add(arg); paramCount++; } else { isValid = false; break; } } if (!isValid) { currentDefinition.InvokeFailed(paramInvalidReason); } else { currentDefinition.InvokeSuccess(paramList.ToArray()); } } }
public void Register(RaceCommandDefinition definition) { //TODO: Set the restricted/permissions parameter. registerProxy?.Invoke(definition.BaseCommand, new RaceCommandInvokable(ProcessCommandInvoke), false); commandDefinitions.Add(definition); }