. namespace core_ai; use core_ai\aiactions\base; use core_ai\aiactions\responses\response_base; /** * Base class for provider processors. * * Each provider processor should extend this class. * * @package core_ai * @copyright 2024 Matt Porritt * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ abstract class process_base { /** * Class constructor. * * @param provider $provider The provider that will process the action. * @param base $action The action to process. */ public function __construct( /** @var provider The provider that will process the action. */ protected readonly provider $provider, /** @var base The action to process. */ protected readonly base $action, ) { } /** * Process the AI request. * * @return response_base The result of the action. */ public function process(): response_base { // Check the rate limiter. $ratelimitcheck = $this->provider->is_request_allowed($this->action); if ($ratelimitcheck !== true) { return $this->get_response( success: false, errorcode: $ratelimitcheck['errorcode'], errormessage: $ratelimitcheck['errormessage'], ); } // Format the action response object. return $this->prepare_response($this->query_ai_api()); } /** * Query the AI service. * * @return array The response from the AI service. */ abstract protected function query_ai_api(): array; /** * Prepare the response object. * * @param array $responsedata The response object. * @return response_base The action response object. */ private function prepare_response(array $responsedata): response_base { if ($responsedata['success']) { $response = $this->get_response( success: true, ); $response->set_response_data($responsedata); return $response; } else { return $this->get_response( success: false, errorcode: $responsedata['errorcode'], errormessage: $responsedata['errormessage'], ); } } /** * Get the instantiated Response Class for the action described by this processor. * * @param mixed ...$args The arguments to pass to the response class constructor. * @return response_base */ protected function get_response(...$args): response_base { $responseclassname = $this->action::get_response_classname(); return new $responseclassname( ...$args, ); } }