. /** * The event handler. * * @package local_webhooks * @copyright 2017 "Valentin Popov" * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace local_webhooks; defined("MOODLE_INTERNAL") || die(); require_once($CFG->libdir . "/filelib.php"); /** * Defines how to work with events. * * @copyright 2017 "Valentin Popov" * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class handler { /** * External handler. * * @param object $event */ public static function events($event) { $enable = get_config("local_webhooks", "enable"); if (boolval($enable)) { $data = $event->get_data(); self::transmitter($data); } } /** * Transmitter, processing event and services. * * @param array $data */ private static function transmitter($data) { global $DB; $callbacks = $DB->get_recordset("local_webhooks_service"); if ($callbacks->valid()) { foreach ($callbacks as $callback) { self::handler_callback($data, $callback); } } $callbacks->close(); } /** * Processes each callback. * * @param array $data * @param object $callback */ private static function handler_callback($data, $callback) { if (boolval($callback->enable)) { $events = array(); if (!empty($callback->events)) { $events = unserialize(gzuncompress(base64_decode($callback->events))); } if (!empty($events[$data["eventname"]])) { if (!empty($callback->token)) { $data["token"] = $callback->token; } self::send($data, $callback); } } } /** * Sending data to the node. * * @param array $data * @param object $callback */ private static function send($data, $callback) { $curl = new \curl(); $curl->setHeader(array("Content-Type: application/$callback->type")); $curl->post($callback->url, json_encode($data)); $response = $curl->getResponse(); self::logger($callback, $response); return $response; } /** * Event logging. * * @param array $response * @param object $callback */ private static function logger($callback, $response) { $event = \local_webhooks\event\response_get::create(array( "context" => \context_system::instance(0), "objectid" => $callback->id, "other" => array( "status" => $response["HTTP/1.1"] ) )); $event->trigger(); } }