Example #1
0
        /// <summary>
        /// Creates the required routes for all IInteractionEngine implementations.
        /// </summary>
        /// <param name="interactionEngine">The <see cref="IInteractionEngine"/> being extended</param>
        /// <param name="handler">A handler to wrap around the call. Takes the output and API input parameters as input.</param>
        /// <returns>The list of API routes</returns>
        public static List <APIRoute> GetRequiredAPIRoutes(this IInteractionEngine interactionEngine, Func <dynamic, object[], dynamic> handler = null)
        {
            var routes = new List <APIRoute>();

            // Create the Skills endpoints
            var route = new APIRoute
            {
                Path                   = "/skills",
                Description            = "List available skills",
                Method                 = HttpMethod.Get,
                RequiresAuthentication = true,
                Handler                = (APIRequest request) =>
                {
                    var response = new APIResponse(interactionEngine.ListSkills());

                    // TODO: the analysis module hook needs to be implemented in a better way
                    return(handler != null?handler(response, new object[] { request }) : response);
                }
            };

            routes.Add(route);

            route = new APIRoute
            {
                Path                   = "/skills",
                Description            = "Register a new skill",
                Method                 = HttpMethod.Post,
                RequiresAuthentication = true,
                Handler                = (APIRequest request) =>
                {
                    Skill skill = ((JObject)request.Data).ToObject <Skill>();
                    switch (skill.Binding)
                    {
                    /*
                     * // TODO: Binary executors can't be loaded over the network using the API
                     * // since they need a method handler
                     * case SkillExecutorBinding.Builtin:
                     * case SkillExecutorBinding.Module:
                     * skill.Executor = ((JObject)skill.Executor).ToObject<BinaryExecutor>();
                     * break;
                     */
                    case SkillExecutorBinding.Network:
                        skill.Executor = ((JObject)skill.Executor).ToObject <NetworkExecutor>();
                        break;

                    default:
                        throw new NotImplementedException(
                                  $"The given skill binding '{skill.Binding}' is not implemented");
                    }

                    APIResponse response = new APIResponse();
                    if (interactionEngine.RegisterSkill(skill))
                    {
                        response.StatusCode = (int)HttpStatusCode.Created;
                        response.Data       = new
                        {
                            UUID       = skill.UUID,
                            Registered = true
                        };
                    }
                    else
                    {
                        response.StatusCode = (int)HttpStatusCode.Conflict;
                        response.Data       = new
                        {
                            Registered = false,
                            Reason     = $"The skill '{skill.UUID}' has already been registered"
                        };
                    }

                    // TODO: the analysis module hook needs to be implemented in a better way
                    return(handler != null?handler(response, new object[] { request }) : response);
                }
            };
            routes.Add(route);

            route = new APIRoute
            {
                Path                   = "/skills/{skillUUID}",
                Description            = "Deregister a new skill",
                Method                 = HttpMethod.Delete,
                RequiresAuthentication = true,
                Handler                = (APIRequest request) =>
                {
                    APIResponse response = new APIResponse();
                    if (interactionEngine.DeregisterSkill(request.Parameters.skillUUID))
                    {
                        response.StatusCode = (int)HttpStatusCode.OK;
                    }
                    else
                    {
                        response.StatusCode    = (int)HttpStatusCode.NotFound;
                        response.StatusMessage =
                            $"The skill '{request.Parameters.skillUUID}' was not found or has already been deregistered";
                    }

                    // TODO: the analysis module hook needs to be implemented in a better way
                    return(handler != null?handler(response, new object[] { request }) : response);
                }
            };
            routes.Add(route);

            return(routes);
        }
Example #2
0
 /// <summary>
 /// TODO: Find a better way to reload modules in other modules
 /// See Issue #3
 /// https://github.com/ProjectLimitless/ProjectLimitless/issues/3
 /// </summary>
 /// <param name="engine"></param>
 public void SetEngine(IInteractionEngine engine)
 {
     _engine = engine;
 }