diff options
-rw-r--r-- | classes/events.php | 61 | ||||
-rw-r--r-- | classes/forms.php | 81 | ||||
-rw-r--r-- | db/install.xml | 16 | ||||
-rw-r--r-- | editservice.php | 91 | ||||
-rw-r--r-- | lang/en/local_webhooks.php | 10 | ||||
-rw-r--r-- | lang/ru/local_webhooks.php | 10 | ||||
-rw-r--r-- | managerservice.php | 105 | ||||
-rw-r--r-- | settings.php | 23 |
8 files changed, 370 insertions, 27 deletions
diff --git a/classes/events.php b/classes/events.php index bf77d4d..5dfb0cf 100644 --- a/classes/events.php +++ b/classes/events.php @@ -24,19 +24,68 @@ namespace local_webhooks; -defined('MOODLE_INTERNAL') || die(); +defined("MOODLE_INTERNAL") || die(); +/** + * Defines how to work with events. + * + * @copyright 2017 "Valentin Popov" <info@valentineus.link> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ class events { + /** + * External handler. + * + * @param object $event + */ public static function handler($event) { - $enabled = boolval(get_config('local_webhooks', 'enabled')); - $url = get_config('local_webhooks', 'url'); + $config = get_config("local_webhooks"); - if ($enabled && !empty($url)) { + if (boolval($config->enable)) { $data = $event->get_data(); - $json = json_encode($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::send($data, $callback); + } + } + + $callbacks->close(); + } + + /** + * Sending data to the node. + * + * @param array $data + * @param object $callback + */ + private static function send($data, $callback) { + if ($callback->enable) { $curl = new curl(); - $curl::request($url, $json); + $package = self::packup($data); + $curl::request($callback->url, $package); } } + + /** + * Packs the data for transmission. + * + * @param array $data + */ + private static function packup($data) { + return json_encode($data); + } }
\ No newline at end of file diff --git a/classes/forms.php b/classes/forms.php new file mode 100644 index 0000000..c232a7b --- /dev/null +++ b/classes/forms.php @@ -0,0 +1,81 @@ +<?php +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see <http://www.gnu.org/licenses/>. + +/** + * Defines the form of editing the service. + * + * @package local_webhooks + * @copyright 2017 "Valentin Popov" <info@valentineus.link> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +namespace local_webhooks; + +defined("MOODLE_INTERNAL") || die(); + +require_once($CFG->libdir . "/formslib.php"); +use lang_string; +use moodleform; + +/** + * Description editing form definition. + * + * @copyright 2017 "Valentin Popov" <info@valentineus.link> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class service_edit_form extends moodleform { + /** + * @param string $baseurl + */ + public function __construct($baseurl) { + parent::__construct($baseurl); + } + + /** + * Defines the standard structure of the form. + */ + protected function definition() { + $mform =& $this->_form; + + /* Form heading */ + $mform->addElement("header", "editserviceheader", + new lang_string("service", "webservice")); + + /* Name of the service */ + $mform->addElement("text", "title", + new lang_string("name", "moodle"), + array("size" => 60)); + $mform->setType("title", PARAM_NOTAGS); + $mform->addRule("title", null, "required"); + + /* Callback address */ + $mform->addElement("text", "url", + new lang_string("url", "moodle"), + array("size" => 60)); + $mform->setType("url", PARAM_URL); + $mform->addRule("url", null, "required"); + + /* Enabling the service */ + $mform->addElement("checkbox", "enable", + new lang_string("enable", "moodle")); + $mform->setType("enable", PARAM_BOOL); + $mform->setDefault("enable", 1); + $mform->setAdvanced("enable"); + + /* Control Panel */ + $this->add_action_buttons(true); + } +}
\ No newline at end of file diff --git a/db/install.xml b/db/install.xml new file mode 100644 index 0000000..b152933 --- /dev/null +++ b/db/install.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8" ?> +<XMLDB PATH="blocks/local_webhooks/db" VERSION="20171022" COMMENT="XMLDB file for Moodle" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"> + <TABLES> + <TABLE NAME="local_webhooks_service" COMMENT="A table for storing callback services."> + <FIELDS> + <FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true" /> + <FIELD NAME="enable" TYPE="int" LENGTH="2" NOTNULL="true" DEFAULT="0" SEQUENCE="false" /> + <FIELD NAME="title" TYPE="text" NOTNULL="true" SEQUENCE="false" /> + <FIELD NAME="url" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" /> + </FIELDS> + <KEYS> + <KEY NAME="primary" TYPE="primary" FIELDS="id" /> + </KEYS> + </TABLE> + </TABLES> +</XMLDB> diff --git a/editservice.php b/editservice.php new file mode 100644 index 0000000..5c6d1f6 --- /dev/null +++ b/editservice.php @@ -0,0 +1,91 @@ +<?php +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see <http://www.gnu.org/licenses/>. + +/** + * Service editor. + * + * @package local_webhooks + * @copyright 2017 "Valentin Popov" <info@valentineus.link> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once(__DIR__ . "/../../config.php"); +require_once(__DIR__ . "/classes/forms.php"); + +$idservice = optional_param("idservice", 0, PARAM_INT); + +require_login(); + +/* Link generation */ +$urlparameters = array("idservice" => $idservice); +$managerservice = new moodle_url("/local/webhooks/managerservice.php", $urlparameters); +$baseurl = new moodle_url("/local/webhooks/editservice.php", $urlparameters); +$PAGE->set_url($baseurl, $urlparameters); + +/* Configure the context of the page */ +$context = context_system::instance(); +$PAGE->set_context($context); + +/* Preparing a template for data */ +$titlepage = new lang_string("externalservice", "webservice"); +$servicerecord = new stdClass; + +/* Create an editing form */ +$mform = new \local_webhooks\service_edit_form($PAGE->url); + +/* Cancel processing */ +if ($mform->is_cancelled()) { + redirect($managerservice); +} + +/* Getting the data */ +if ($idediting = boolval($idservice)) { + $servicerecord = $DB->get_record("local_webhooks_service", array("id" => $idservice), "*", MUST_EXIST); + $mform->set_data($servicerecord); +} + +/* Processing of received data */ +if ($data = $mform->get_data()) { + if (empty($data->enable)) { + $data->enable = 0; + } + + if ($idediting) { + $data->id = $idservice; + $DB->update_record("local_webhooks_service", $data); + } else { + $DB->insert_record("local_webhooks_service", $data); + } + + redirect($managerservice); +} + +/* Page template */ +$PAGE->set_pagelayout("admin"); +$PAGE->set_heading($titlepage); +$PAGE->set_title($titlepage); + +/* The page title */ +$PAGE->navbar->add(new lang_string("local", "moodle")); +$PAGE->navbar->add(new lang_string("pluginname", "local_webhooks")); +$PAGE->navbar->add(new lang_string("managerservice", "local_webhooks"), $managerservice); +$PAGE->navbar->add($titlepage); +echo $OUTPUT->header(); + +/* Displays the form */ +$mform->display(); + +echo $OUTPUT->footer();
\ No newline at end of file diff --git a/lang/en/local_webhooks.php b/lang/en/local_webhooks.php index 05def67..041233f 100644 --- a/lang/en/local_webhooks.php +++ b/lang/en/local_webhooks.php @@ -15,16 +15,12 @@ // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** - * Strings for component 'local_webhooks', language 'en'. + * Strings for component "local_webhooks", language "en". * * @package local_webhooks * @copyright 2017 "Valentin Popov" <info@valentineus.link> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['local_webhooksdescription'] = ''; -$string['pluginname'] = 'WebHook\'s'; -$string['enabled'] = 'Enabled'; -$string['enabled_help'] = 'Enable event tracking.'; -$string['url'] = 'URL'; -$string['url_help'] = 'Web address of the remote service.';
\ No newline at end of file +$string["managerservice"] = "Service management manager"; +$string["pluginname"] = "WebHooks";
\ No newline at end of file diff --git a/lang/ru/local_webhooks.php b/lang/ru/local_webhooks.php index 4883214..73db595 100644 --- a/lang/ru/local_webhooks.php +++ b/lang/ru/local_webhooks.php @@ -15,16 +15,12 @@ // along with Moodle. If not, see <http://www.gnu.org/licenses/>. /** - * Strings for component 'local_webhooks', language 'ru'. + * Strings for component "local_webhooks", language "ru". * * @package local_webhooks * @copyright 2017 "Valentin Popov" <info@valentineus.link> * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -$string['local_webhooksdescription'] = ''; -$string['pluginname'] = 'WebHook\'s'; -$string['enabled'] = 'Включить'; -$string['enabled_help'] = 'Включить отслеживание событий.'; -$string['url'] = 'URL'; -$string['url_help'] = 'Веб-адрес удалённой службы.';
\ No newline at end of file +$string["managerservice"] = "Менеджер управления службами"; +$string["pluginname"] = "WebHooks";
\ No newline at end of file diff --git a/managerservice.php b/managerservice.php new file mode 100644 index 0000000..c7c6749 --- /dev/null +++ b/managerservice.php @@ -0,0 +1,105 @@ +<?php +// This file is part of Moodle - http://moodle.org/ +// +// Moodle is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// Moodle is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with Moodle. If not, see <http://www.gnu.org/licenses/>. + +/** + * Service Management Manager. + * + * @package local_webhooks + * @copyright 2017 "Valentin Popov" <info@valentineus.link> + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +require_once(__DIR__ . "/../../config.php"); +require_once($CFG->libdir . "/tablelib.php"); + +$deleteservice = optional_param("deleteservice", 0, PARAM_INT); + +require_login(); + +/* Link generation */ +$managerservice = "/local/webhooks/managerservice.php"; +$editservice = "/local/webhooks/editservice.php"; +$baseurl = new moodle_url($managerservice); +$PAGE->set_url($baseurl); + +/* Configure the context of the page */ +$context = context_system::instance(); +$PAGE->set_context($context); + +/* Delete the service */ +if ($deleteservice && confirm_sesskey()) { + $DB->delete_records("local_webhooks_service", array("id" => $deleteservice)); + redirect($PAGE->url, new lang_string("deleted", "moodle")); +} + +/* Retrieving a list of services */ +$select = null; +$callbacks = $DB->get_records_select("local_webhooks_service", $select, null, $DB->sql_order_by_text("id")); + +/* Page template */ +$titlepage = new lang_string("managerservice", "local_webhooks"); +$PAGE->set_pagelayout("standard"); +$PAGE->set_title($titlepage); +$PAGE->set_heading($titlepage); + +/* The page title */ +$PAGE->navbar->add(new lang_string("local", "moodle")); +$PAGE->navbar->add(new lang_string("pluginname", "local_webhooks")); +$PAGE->navbar->add($titlepage, $baseurl); +echo $OUTPUT->header(); + +/* Table declaration */ +$table = new flexible_table("callbacks-table"); + +/* Customize the table */ +$table->define_columns(array("title", "url", "actions")); +$table->define_headers(array( + new lang_string("name", "moodle"), + new lang_string("url", "moodle"), + new lang_string("actions", "moodle"))); +$table->define_baseurl($baseurl); +$table->setup(); + +foreach ($callbacks as $callback) { + /* Filling of information columns */ + $titlecallback = html_writer::div($callback->title, "title"); + $urlcallback = html_writer::div($callback->url, "url"); + + /* Link for editing */ + $editlink = new moodle_url($editservice, + array("idservice" => $callback->id)); + $edititem = $OUTPUT->action_icon($editlink, + new pix_icon("t/edit", get_string("edit"))); + + /* Link to remove */ + $deletelink = new moodle_url($managerservice, + array("deleteservice" => $callback->id, "sesskey" => sesskey())); + $deleteitem = $OUTPUT->action_icon($deletelink, + new pix_icon("t/delete", get_string("delete"))); + + /* Adding data to the table */ + $table->add_data(array($titlecallback, $urlcallback, $edititem . $deleteitem)); +} + +/* Display the table */ +$table->print_html(); + +/* Add service button */ +$addurl = new moodle_url("/local/webhooks/editservice.php"); +echo $OUTPUT->single_button($addurl, + new lang_string("addaservice", "webservice"), "get"); + +echo $OUTPUT->footer();
\ No newline at end of file diff --git a/settings.php b/settings.php index 0e9727f..c2235c2 100644 --- a/settings.php +++ b/settings.php @@ -22,15 +22,24 @@ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -defined('MOODLE_INTERNAL') || die(); +defined("MOODLE_INTERNAL") || die(); +$settings = null; if ($hassiteconfig) { - $settings = new admin_settingpage('local_webhooks', get_string('pluginname', 'local_webhooks')); - $ADMIN->add('localplugins', $settings); + $settings = new admin_settingpage("local_webhooks", + new lang_string("pluginname", "local_webhooks")); - $settings->add(new admin_setting_configcheckbox('local_webhooks/enabled', get_string('enabled', 'local_webhooks'), - get_string('enabled_help', 'local_webhooks'), false)); + $ADMIN->add("localplugins", $settings); - $settings->add(new admin_setting_configtext('local_webhooks/url', get_string('url', 'local_webhooks'), - get_string('url_help', 'local_webhooks'), 'http://example.com/endpoint', PARAM_URL, 40)); + $settings->add(new admin_setting_configcheckbox( + "local_webhooks/enabled", + new lang_string("enable", "moodle"), + new lang_string("enablews", "webservice"), + false)); + + /* Link to the service manager */ + $linktext = new lang_string("managerservice", "local_webhooks"); + $linkurl = new moodle_url("/local/webhooks/managerservice.php"); + $settings->add(new admin_setting_heading("local_webhooks_managerservice", null, + html_writer::link($linkurl, $linktext))); }
\ No newline at end of file |