original_string: public static function mark_message_read($messageid, $timeread) {
          global $CFG, $DB, $USER;
  
          // Check if private messaging between users is allowed.
          if (empty($CFG->messaging)) {
              throw new moodle_exception('disabled', 'message');
          }
  
          // Warnings array, it can be empty at the end but is mandatory.
          $warnings = array();
  
          // Validate params.
          $params = array(
              'messageid' => $messageid,
              'timeread' => $timeread
          );
          $params = self::validate_parameters(self::mark_message_read_parameters(), $params);
  
          if (empty($params['timeread'])) {
              $timeread = time();
          } else {
              $timeread = $params['timeread'];
          }
  
          // Validate context.
          $context = context_system::instance();
          self::validate_context($context);
  
          $sql = "SELECT m.*, mcm.userid as useridto
                    FROM {messages} m
              INNER JOIN {message_conversations} mc
                      ON m.conversationid = mc.id
              INNER JOIN {message_conversation_members} mcm
                      ON mcm.conversationid = mc.id
               LEFT JOIN {message_user_actions} mua
                      ON (mua.messageid = m.id AND mua.userid = ? AND mua.action = ?)
                   WHERE mua.id is NULL
                     AND mcm.userid != m.useridfrom
                     AND m.id = ?";
          $messageparams = [];
          $messageparams[] = $USER->id;
          $messageparams[] = \core_message\api::MESSAGE_ACTION_READ;
          $messageparams[] = $params['messageid'];
          $message = $DB->get_record_sql($sql, $messageparams, MUST_EXIST);
  
          if ($message->useridto != $USER->id) {
              throw new invalid_parameter_exception('Invalid messageid, you don\'t have permissions to mark this message as read');
          }
  
          \core_message\api::mark_message_as_read($USER->id, $message, $timeread);
  
          $results = array(
              'messageid' => $message->id,
              'warnings' => $warnings
          );
          return $results;
      }
code: public static function mark_message_read($messageid, $timeread) {
          global $CFG, $DB, $USER;
  
          // Check if private messaging between users is allowed.
          if (empty($CFG->messaging)) {
              throw new moodle_exception('disabled', 'message');
          }
  
          // Warnings array, it can be empty at the end but is mandatory.
          $warnings = array();
  
          // Validate params.
          $params = array(
              'messageid' => $messageid,
              'timeread' => $timeread
          );
          $params = self::validate_parameters(self::mark_message_read_parameters(), $params);
  
          if (empty($params['timeread'])) {
              $timeread = time();
          } else {
              $timeread = $params['timeread'];
          }
  
          // Validate context.
          $context = context_system::instance();
          self::validate_context($context);
  
          $sql = "SELECT m.*, mcm.userid as useridto
                    FROM {messages} m
              INNER JOIN {message_conversations} mc
                      ON m.conversationid = mc.id
              INNER JOIN {message_conversation_members} mcm
                      ON mcm.conversationid = mc.id
               LEFT JOIN {message_user_actions} mua
                      ON (mua.messageid = m.id AND mua.userid = ? AND mua.action = ?)
                   WHERE mua.id is NULL
                     AND mcm.userid != m.useridfrom
                     AND m.id = ?";
          $messageparams = [];
          $messageparams[] = $USER->id;
          $messageparams[] = \core_message\api::MESSAGE_ACTION_READ;
          $messageparams[] = $params['messageid'];
          $message = $DB->get_record_sql($sql, $messageparams, MUST_EXIST);
  
          if ($message->useridto != $USER->id) {
              throw new invalid_parameter_exception('Invalid messageid, you don\'t have permissions to mark this message as read');
          }
  
          \core_message\api::mark_message_as_read($USER->id, $message, $timeread);
  
          $results = array(
              'messageid' => $message->id,
              'warnings' => $warnings
          );
          return $results;
      }
code_tokens: public static function mark_message_read ( $ messageid , $ timeread ) { global $ CFG , $ DB , $ USER ; // Check if private messaging between users is allowed. if ( empty ( $ CFG -> messaging ) ) { throw new moodle_exception ( 'disabled' , 'message' ) ; } // Warnings array, it can be empty at the end but is mandatory. $ warnings = array ( ) ; // Validate params. $ params = array ( 'messageid' => $ messageid , 'timeread' => $ timeread ) ; $ params = self :: validate_parameters ( self :: mark_message_read_parameters ( ) , $ params ) ; if ( empty ( $ params [ 'timeread' ] ) ) { $ timeread = time ( ) ; } else { $ timeread = $ params [ 'timeread' ] ; } // Validate context. $ context = context_system :: instance ( ) ; self :: validate_context ( $ context ) ; $ sql = "SELECT m.*, mcm.userid as useridto
                    FROM {messages} m
              INNER JOIN {message_conversations} mc
                      ON m.conversationid = mc.id
              INNER JOIN {message_conversation_members} mcm
                      ON mcm.conversationid = mc.id
               LEFT JOIN {message_user_actions} mua
                      ON (mua.messageid = m.id AND mua.userid = ? AND mua.action = ?)
                   WHERE mua.id is NULL
                     AND mcm.userid != m.useridfrom
                     AND m.id = ?" ; $ messageparams = [ ] ; $ messageparams [ ] = $ USER -> id ; $ messageparams [ ] = \ core_message \ api :: MESSAGE_ACTION_READ ; $ messageparams [ ] = $ params [ 'messageid' ] ; $ message = $ DB -> get_record_sql ( $ sql , $ messageparams , MUST_EXIST ) ; if ( $ message -> useridto != $ USER -> id ) { throw new invalid_parameter_exception ( 'Invalid messageid, you don\'t have permissions to mark this message as read' ) ; } \ core_message \ api :: mark_message_as_read ( $ USER -> id , $ message , $ timeread ) ; $ results = array ( 'messageid' => $ message -> id , 'warnings' => $ warnings ) ; return $ results ; }
docstring: Mark a single message as read, trigger message_viewed event
  
  @param  int $messageid id of the message (in the message table)
  @param  int $timeread timestamp for when the message should be marked read
  @return external_description
  @throws invalid_parameter_exception
  @throws moodle_exception
  @since 2.9
docstring_tokens: Mark a single message as read trigger message_viewed event