Ejemplo n.º 1
0
        private async Task <HandlerExec> Exec(EventHandler handler, HandlerParams param)
        {
            var provider = param.ServiceProvider;
            var method   = handler.Method;

            try
            {
                var instance = (BotEventHandler)ActivatorUtilities.CreateInstance(provider, method.DeclaringType);
                instance.__Instantiate(param);
                object[] paramObjects;
                if (handler.Parameters.Length > 0 && handler.Parametrized)
                {
                    var parseOk = param.TryParseParams(handler.Parameters);

                    var paramses = handler.Parameters;
                    if (parseOk)
                    {
                        paramObjects =
                            paramses.Select(x =>
                        {
                            return(param.CommandParameters
                                   .First(p => p.Position == x.Position)
                                   .TypedValue);
                        })
                            .ToArray();
                    }
                    else
                    {
                        return(HandlerExec.Error);
                    }
                }
                else
                {
                    paramObjects = null;
                }

                if (method.ReturnParameter.ParameterType == typeof(Task))
                {
                    var task = method.Invoke(instance, paramObjects);
                    await(Task) task;
                    return(HandlerExec.Continue);
                }
                else if (method.ReturnParameter.ParameterType == typeof(Task <bool>))
                {
                    var task = method.Invoke(instance, paramObjects);
                    return(await(Task <bool>) task ? HandlerExec.Continue : HandlerExec.Break);
                }


                method.Invoke(instance, paramObjects);
                return(HandlerExec.Continue);
            } catch (ArgumentException e)
            {
                Console.WriteLine(e);
            }

            return(HandlerExec.Error);
        }