. /** * Library of functions for chat outside of the core api */ require_once($CFG->dirroot . '/mod/chat/lib.php'); require_once($CFG->libdir . '/portfolio/caller.php'); /** * @package mod-chat * @copyright 1999 onwards Martin Dougiamas {@link http://moodle.com} * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class chat_portfolio_caller extends portfolio_module_caller_base { /** @var object */ private $chat; /** @var int Timestamp */ protected $start; /** @var int Timestamp */ protected $end; /** * @return array */ public static function expected_callbackargs() { return array( 'id' => true, 'start' => false, 'end' => false, ); } /** * @global object */ public function load_data() { global $DB; if (!$this->cm = get_coursemodule_from_id('chat', $this->id)) { throw new portfolio_caller_exception('invalidid', 'chat'); } $this->chat = $DB->get_record('chat', array('id' => $this->cm->instance)); $select = 'chatid = ?'; $params = array($this->chat->id); if ($this->start && $this->end) { $select .= ' AND timestamp >= ? AND timestamp <= ?'; $params[] = $this->start; $params[] = $this->end; } $this->messages = $DB->get_records_select( 'chat_messages', $select, $params, 'timestamp ASC' ); $select .= ' AND userid = ?'; $params[] = $this->user->id; $this->participated = $DB->record_exists_select( 'chat_messages', $select, $params ); } /** * @return array */ public static function base_supported_formats() { return array(PORTFOLIO_FORMAT_PLAINHTML); } /** * */ public function expected_time() { return portfolio_expected_time_db(count($this->messages)); } /** * @return string */ public function get_sha1() { $str = ''; ksort($this->messages); foreach ($this->messages as $m) { $str .= implode('', (array)$m); } return sha1($str); } /** * @return bool */ public function check_permissions() { $context = get_context_instance(CONTEXT_MODULE, $this->cm->id); return has_capability('mod/chat:exportsession', $context) || ($this->participated && has_capability('mod/chat:exportparticipatedsession', $context)); } /** * @todo Document this function */ public function prepare_package() { $content = ''; $lasttime = 0; $sessiongap = 5 * 60; // 5 minutes silence means a new session foreach ($this->messages as $message) { // We are walking FORWARDS through messages $m = clone $message; // grrrrrr - this causes the sha1 to change as chat_format_message changes what it's passed. $formatmessage = chat_format_message($m, $this->cm->course, $this->user); if (!isset($formatmessage->html)) { continue; } if (empty($lasttime) || (($message->timestamp - $lasttime) > $sessiongap)) { $content .= '
'; $content .= userdate($message->timestamp); } $content .= $formatmessage->html; $lasttime = $message->timestamp; } $content = preg_replace('/\]*\>/', '', $content); $this->exporter->write_new_file($content, clean_filename($this->cm->name . '-session.html'), false); } /** * @return string */ public static function display_name() { return get_string('modulename', 'chat'); } /** * @global object * @return string */ public function get_return_url() { global $CFG; return $CFG->wwwroot . '/mod/chat/report.php?id=' . $this->cm->id . ((isset($this->start)) ? '&start=' . $this->start . '&end=' . $this->end : ''); } }