Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  define('AJAX_SCRIPT', true);
  18  
  19  require(__DIR__.'/../../config.php');
  20  require_once (__DIR__ . '/lib.php');
  21  
  22  $action       = optional_param('action', '', PARAM_ALPHANUM);
  23  $beepid       = optional_param('beep', '', PARAM_RAW);
  24  $chatsid      = required_param('chat_sid', PARAM_ALPHANUM);
  25  $theme        = required_param('chat_theme', PARAM_ALPHANUMEXT);
  26  $chatmessage  = optional_param('chat_message', '', PARAM_RAW);
  27  $chatlasttime = optional_param('chat_lasttime', 0, PARAM_INT);
  28  $chatlastrow  = optional_param('chat_lastrow', 1, PARAM_INT);
  29  
  30  if (!confirm_sesskey()) {
  31      throw new moodle_exception('invalidsesskey', 'error');
  32  }
  33  
  34  if (!$chatuser = $DB->get_record('chat_users', array('sid' => $chatsid))) {
  35      throw new moodle_exception('notlogged', 'chat');
  36  }
  37  if (!$chat = $DB->get_record('chat', array('id' => $chatuser->chatid))) {
  38      throw new moodle_exception('invaliduserid', 'error');
  39  }
  40  if (!$course = $DB->get_record('course', array('id' => $chat->course))) {
  41      throw new moodle_exception('invalidcourseid', 'error');
  42  }
  43  if (!$cm = get_coursemodule_from_instance('chat', $chat->id, $course->id)) {
  44      throw new moodle_exception('invalidcoursemodule', 'error');
  45  }
  46  
  47  if (!isloggedin()) {
  48      throw new moodle_exception('notlogged', 'chat');
  49  }
  50  
  51  // Set up $PAGE so that format_text will work properly.
  52  $PAGE->set_cm($cm, $course, $chat);
  53  $PAGE->set_url('/mod/chat/chat_ajax.php', array('chat_sid' => $chatsid));
  54  
  55  require_login($course, false, $cm);
  56  
  57  $context = context_module::instance($cm->id);
  58  require_capability('mod/chat:chat', $context);
  59  
  60  ob_start();
  61  header('Expires: Sun, 28 Dec 1997 09:32:45 GMT');
  62  header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
  63  header('Cache-Control: no-cache, must-revalidate');
  64  header('Pragma: no-cache');
  65  header('Content-Type: text/html; charset=utf-8');
  66  
  67  switch ($action) {
  68      case 'init':
  69          $users = chat_get_users($chatuser->chatid, $chatuser->groupid, $cm->groupingid);
  70          $users = chat_format_userlist($users, $course);
  71          $response['users'] = $users;
  72          echo json_encode($response);
  73          break;
  74  
  75      case 'chat':
  76          \core\session\manager::write_close();
  77          chat_delete_old_users();
  78          $chatmessage = clean_text($chatmessage, FORMAT_MOODLE);
  79  
  80          if (!empty($beepid)) {
  81              $chatmessage = 'beep '.$beepid;
  82          }
  83  
  84          if (!empty($chatmessage)) {
  85  
  86              chat_send_chatmessage($chatuser, $chatmessage, 0, $cm);
  87  
  88              $chatuser->lastmessageping = time() - 2;
  89              $DB->update_record('chat_users', $chatuser);
  90  
  91              // Response OK message.
  92              echo json_encode(true);
  93              ob_end_flush();
  94          }
  95          break;
  96  
  97      case 'update':
  98          if ((time() - $chatlasttime) > $CFG->chat_old_ping) {
  99              chat_delete_old_users();
 100          }
 101  
 102          if ($latestmessage = chat_get_latest_message($chatuser->chatid, $chatuser->groupid)) {
 103              $chatnewlasttime = $latestmessage->timestamp;
 104          } else {
 105              $chatnewlasttime = 0;
 106          }
 107  
 108          if ($chatlasttime == 0) {
 109              $chatlasttime = time() - $CFG->chat_old_ping;
 110          }
 111  
 112          $messages = chat_get_latest_messages($chatuser, $chatlasttime);
 113  
 114          if (!empty($messages)) {
 115              $num = count($messages);
 116          } else {
 117              $num = 0;
 118          }
 119          $chatnewrow = ($chatlastrow + $num) % 2;
 120          $senduserlist = false;
 121          if ($messages && ($chatlasttime != $chatnewlasttime)) {
 122              foreach ($messages as $n => &$message) {
 123                  $tmp = new stdClass();
 124                  // When somebody enter room, user list will be updated.
 125                  if (!empty($message->issystem)) {
 126                      $senduserlist = true;
 127                  }
 128                  if ($html = chat_format_message_theme($message, $chatuser, $USER, $cm->groupingid, $theme)) {
 129                      $message->mymessage = ($USER->id == $message->userid);
 130                      $message->message  = $html->html;
 131                      if (!empty($html->type)) {
 132                          $message->type = $html->type;
 133                      }
 134                  } else {
 135                      unset($messages[$n]);
 136                  }
 137              }
 138          }
 139  
 140          if ($senduserlist) {
 141              // Return users when system message arrives.
 142              $users = chat_format_userlist(chat_get_users($chatuser->chatid, $chatuser->groupid, $cm->groupingid), $course);
 143              $response['users'] = $users;
 144          }
 145  
 146          $DB->set_field('chat_users', 'lastping', time(), array('id' => $chatuser->id));
 147  
 148          $response['lasttime'] = $chatnewlasttime;
 149          $response['lastrow']  = $chatnewrow;
 150          if ($messages) {
 151              $response['msgs'] = $messages;
 152          }
 153  
 154          echo json_encode($response);
 155          header('Content-Length: ' . ob_get_length());
 156  
 157          ob_end_flush();
 158          break;
 159  
 160      default:
 161          break;
 162  }