You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
337 lines
12 KiB
337 lines
12 KiB
2 years ago
|
<?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/>.
|
||
|
|
||
|
/**
|
||
|
* New messaging class.
|
||
|
*
|
||
|
* @package core_message
|
||
|
* @since Moodle 2.9
|
||
|
* @copyright 2015 onwards Ankit Agarwal
|
||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||
|
*/
|
||
|
|
||
|
namespace core\message;
|
||
|
|
||
|
defined('MOODLE_INTERNAL') || die();
|
||
|
|
||
|
/**
|
||
|
* New messaging class.
|
||
|
*
|
||
|
* Required parameters of the $eventdata object:
|
||
|
* component string Component name. must exist in message_providers
|
||
|
* name string Message type name. must exist in message_providers
|
||
|
* userfrom object|int The user sending the message
|
||
|
* userto object|int The message recipient. This is mandatory for NOTIFICACIONS and 1:1 personal messages.
|
||
|
* subject string The message subject
|
||
|
* fullmessage string The full message in a given format
|
||
|
* fullmessageformat int The format if the full message (FORMAT_MOODLE, FORMAT_HTML, ..)
|
||
|
* fullmessagehtml string The full version (the message processor will choose with one to use)
|
||
|
* smallmessage string The small version of the message
|
||
|
*
|
||
|
* Required parameters of the $eventdata object for PERSONAL MESSAGES:
|
||
|
* convid int The conversation identifier where this message will be sent
|
||
|
*
|
||
|
* Optional parameters of the $eventdata object:
|
||
|
* notification bool Should the message be considered as a notification rather than a personal message
|
||
|
* contexturl string If this is a notification then you can specify a url to view the event.
|
||
|
* For example the forum post the user is being notified of.
|
||
|
* contexturlname string The display text for contexturl.
|
||
|
* replyto string An email address which can be used to send an reply.
|
||
|
* attachment stored_file File instance that needs to be sent as attachment.
|
||
|
* attachname string Name of the attachment.
|
||
|
* customdata mixed Custom data to be passed to the message processor. Must be serialisable using json_encode().
|
||
|
*
|
||
|
* @package core_message
|
||
|
* @since Moodle 2.9
|
||
|
* @copyright 2015 onwards Ankit Agarwal
|
||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||
|
*/
|
||
|
class message {
|
||
|
/** @var int Course id. */
|
||
|
private $courseid;
|
||
|
|
||
|
/** @var string Module name. */
|
||
|
private $modulename;
|
||
|
|
||
|
/** @var string Component name. */
|
||
|
private $component;
|
||
|
|
||
|
/** @var string Name. */
|
||
|
private $name;
|
||
|
|
||
|
/** @var object|int The user who is sending this message. */
|
||
|
private $userfrom;
|
||
|
|
||
|
/** @var int The conversation id where userfrom is sending this message. */
|
||
|
private $convid;
|
||
|
|
||
|
/** @var int The conversation type, eg. \core_message\api::MESSAGE_CONVERSATION_TYPE_INDIVIDUAL */
|
||
|
private $conversationtype;
|
||
|
|
||
|
/** @var object|int The user who is receiving from which is sending this message. */
|
||
|
private $userto;
|
||
|
|
||
|
/** @var string Subject of the message. */
|
||
|
private $subject;
|
||
|
|
||
|
/** @var string Complete message. */
|
||
|
private $fullmessage;
|
||
|
|
||
|
/** @var int Message format. */
|
||
|
private $fullmessageformat;
|
||
|
|
||
|
/** @var string Complete message in html format. */
|
||
|
private $fullmessagehtml;
|
||
|
|
||
|
/** @var string Smaller version of the message. */
|
||
|
private $smallmessage;
|
||
|
|
||
|
/** @var int Is it a notification? */
|
||
|
private $notification;
|
||
|
|
||
|
/** @var string context url. */
|
||
|
private $contexturl;
|
||
|
|
||
|
/** @var string context name. */
|
||
|
private $contexturlname;
|
||
|
|
||
|
/** @var string An email address which can be used to send an reply. */
|
||
|
private $replyto;
|
||
|
|
||
|
/** @var string A name which can be used with replyto. */
|
||
|
private $replytoname;
|
||
|
|
||
|
/** @var int Used internally to store the id of the row representing this message in DB. */
|
||
|
private $savedmessageid;
|
||
|
|
||
|
/** @var \stored_file File to be attached to the message. Note:- not all processors support this.*/
|
||
|
private $attachment;
|
||
|
|
||
|
/** @var string Name of the attachment. Note:- not all processors support this.*/
|
||
|
private $attachname;
|
||
|
|
||
|
/** @var int The time the message was created.*/
|
||
|
private $timecreated;
|
||
|
|
||
|
/** @var boolean Mark trust content. */
|
||
|
private $fullmessagetrust;
|
||
|
|
||
|
/** @var mixed Custom data to be passed to the message processor. Must be serialisable using json_encode(). */
|
||
|
private $customdata;
|
||
|
|
||
|
/** @var array a list of properties that is allowed for each message. */
|
||
|
private $properties = array(
|
||
|
'courseid',
|
||
|
'modulename',
|
||
|
'component',
|
||
|
'name',
|
||
|
'userfrom',
|
||
|
'convid',
|
||
|
'conversationtype',
|
||
|
'userto',
|
||
|
'subject',
|
||
|
'fullmessage',
|
||
|
'fullmessageformat',
|
||
|
'fullmessagehtml',
|
||
|
'smallmessage',
|
||
|
'notification',
|
||
|
'contexturl',
|
||
|
'contexturlname',
|
||
|
'replyto',
|
||
|
'replytoname',
|
||
|
'savedmessageid',
|
||
|
'attachment',
|
||
|
'attachname',
|
||
|
'timecreated',
|
||
|
'fullmessagetrust',
|
||
|
'customdata',
|
||
|
);
|
||
|
|
||
|
/** @var array property to store any additional message processor specific content */
|
||
|
private $additionalcontent = array();
|
||
|
|
||
|
/**
|
||
|
* Fullmessagehtml content including any processor specific content.
|
||
|
*
|
||
|
* @param string $processorname Name of the processor.
|
||
|
*
|
||
|
* @return mixed|string
|
||
|
*/
|
||
|
protected function get_fullmessagehtml($processorname = '') {
|
||
|
if (!empty($processorname) && isset($this->additionalcontent[$processorname])) {
|
||
|
return $this->get_message_with_additional_content($processorname, 'fullmessagehtml');
|
||
|
} else {
|
||
|
return $this->fullmessagehtml;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Fullmessage content including any processor specific content.
|
||
|
*
|
||
|
* @param string $processorname Name of the processor.
|
||
|
*
|
||
|
* @return mixed|string
|
||
|
*/
|
||
|
protected function get_fullmessage($processorname = '') {
|
||
|
if (!empty($processorname) && isset($this->additionalcontent[$processorname])) {
|
||
|
return $this->get_message_with_additional_content($processorname, 'fullmessage');
|
||
|
} else {
|
||
|
return $this->fullmessage;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Smallmessage content including any processor specific content.
|
||
|
*
|
||
|
* @param string $processorname Name of the processor.
|
||
|
*
|
||
|
* @return mixed|string
|
||
|
*/
|
||
|
protected function get_smallmessage($processorname = '') {
|
||
|
if (!empty($processorname) && isset($this->additionalcontent[$processorname])) {
|
||
|
return $this->get_message_with_additional_content($processorname, 'smallmessage');
|
||
|
} else {
|
||
|
return $this->smallmessage;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Always JSON encode customdata.
|
||
|
*
|
||
|
* @param mixed $customdata a data structure that must be serialisable using json_encode().
|
||
|
*/
|
||
|
protected function set_customdata($customdata) {
|
||
|
// Always include the courseid (because is not stored in the notifications or messages table).
|
||
|
if (!empty($this->courseid) && (is_object($customdata) || is_array($customdata))) {
|
||
|
$customdata = (array) $customdata;
|
||
|
$customdata['courseid'] = $this->courseid;
|
||
|
}
|
||
|
$this->customdata = json_encode($customdata);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Helper method used to get message content added with processor specific content.
|
||
|
*
|
||
|
* @param string $processorname Name of the processor.
|
||
|
* @param string $messagetype one of 'fullmessagehtml', 'fullmessage', 'smallmessage'.
|
||
|
*
|
||
|
* @return mixed|string
|
||
|
*/
|
||
|
protected function get_message_with_additional_content($processorname, $messagetype) {
|
||
|
$message = $this->$messagetype;
|
||
|
if (isset($this->additionalcontent[$processorname]['*'])) {
|
||
|
// Content that needs to be added to all format.
|
||
|
$pattern = $this->additionalcontent[$processorname]['*'];
|
||
|
$message = empty($pattern['header']) ? $message : $pattern['header'] . $message;
|
||
|
$message = empty($pattern['footer']) ? $message : $message . $pattern['footer'];
|
||
|
}
|
||
|
|
||
|
if (isset($this->additionalcontent[$processorname][$messagetype])) {
|
||
|
// Content that needs to be added to the specific given format.
|
||
|
$pattern = $this->additionalcontent[$processorname][$messagetype];
|
||
|
$message = empty($pattern['header']) ? $message : $pattern['header'] . $message;
|
||
|
$message = empty($pattern['footer']) ? $message : $message . $pattern['footer'];
|
||
|
}
|
||
|
|
||
|
return $message;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Magic getter method.
|
||
|
*
|
||
|
* @param string $prop name of property to get.
|
||
|
*
|
||
|
* @return mixed
|
||
|
* @throws \coding_exception
|
||
|
*/
|
||
|
public function __get($prop) {
|
||
|
if (in_array($prop, $this->properties)) {
|
||
|
return $this->$prop;
|
||
|
}
|
||
|
throw new \coding_exception("Invalid property $prop specified");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Magic setter method.
|
||
|
*
|
||
|
* @param string $prop name of property to set.
|
||
|
* @param mixed $value value to assign to the property.
|
||
|
*
|
||
|
* @return mixed
|
||
|
* @throws \coding_exception
|
||
|
*/
|
||
|
public function __set($prop, $value) {
|
||
|
|
||
|
// Custom data must be JSON encoded always.
|
||
|
if ($prop == 'customdata') {
|
||
|
return $this->set_customdata($value);
|
||
|
}
|
||
|
|
||
|
if (in_array($prop, $this->properties)) {
|
||
|
return $this->$prop = $value;
|
||
|
}
|
||
|
throw new \coding_exception("Invalid property $prop specified");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Magic method to check if property is set.
|
||
|
*
|
||
|
* @param string $prop name of property to check.
|
||
|
* @return bool
|
||
|
* @throws \coding_exception
|
||
|
*/
|
||
|
public function __isset($prop) {
|
||
|
if (in_array($prop, $this->properties)) {
|
||
|
return isset($this->$prop);
|
||
|
}
|
||
|
throw new \coding_exception("Invalid property $prop specified");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* This method lets you define content that would be added to the message only for specific message processors.
|
||
|
*
|
||
|
* Example of $content:-
|
||
|
* array('fullmessagehtml' => array('header' => 'header content', 'footer' => 'footer content'),
|
||
|
* 'smallmessage' => array('header' => 'header content for small message', 'footer' => 'footer content'),
|
||
|
* '*' => array('header' => 'header content for all types', 'footer' => 'footer content')
|
||
|
* )
|
||
|
*
|
||
|
* @param string $processorname name of the processor.
|
||
|
* @param array $content content to add in the above defined format.
|
||
|
*/
|
||
|
public function set_additional_content($processorname, $content) {
|
||
|
$this->additionalcontent[$processorname] = $content;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a event object for a specific processor in stdClass format.
|
||
|
*
|
||
|
* @param string $processorname Name of the processor.
|
||
|
*
|
||
|
* @return \stdClass event object in stdClass format.
|
||
|
*/
|
||
|
public function get_eventobject_for_processor($processorname) {
|
||
|
// This is done for Backwards compatibility. We should consider throwing notices here in future versions and requesting
|
||
|
// them to use proper api.
|
||
|
|
||
|
$eventdata = new \stdClass();
|
||
|
foreach ($this->properties as $prop) {
|
||
|
$func = "get_$prop";
|
||
|
$eventdata->$prop = method_exists($this, $func) ? $this->$func($processorname) : $this->$prop;
|
||
|
}
|
||
|
return $eventdata;
|
||
|
}
|
||
|
}
|