Esempio n. 1
0
 /**
 * Title
 *
 * Description
 *
 * @access public
 */
 function checkPattern($id, $from_user_id = 0)
 {
     global $session;
     global $pattern_matched;
     $this_pattern_matched = 0;
     $condition_matched = 0;
     $rec = SQLSelectOne("SELECT * FROM patterns WHERE ID='" . (int) $id . "'");
     if ($rec['PATTERN_TYPE'] == 1) {
         //conditional pattern
         $value = getGlobal($rec['LINKED_OBJECT'] . '.' . $rec['LINKED_PROPERTY']);
         $condition_value = $rec['CONDITION_VALUE'];
         if (($rec['CONDITION'] == 2 || $rec['CONDITION'] == 3) && $condition_value != '' && !is_numeric($condition_value) && !preg_match('/^%/', $condition_value)) {
             $condition_value = '%' . $condition_value . '%';
         }
         if (is_integer(strpos($condition_value, "%"))) {
             $condition_value = processTitle($condition_value);
         }
         if ($rec['CONDITION'] == 1 && $value == $condition_value) {
             $status = 1;
         } elseif ($rec['CONDITION'] == 2 && (double) $value >= (double) $condition_value) {
             $status = 1;
         } elseif ($rec['CONDITION'] == 3 && (double) $value < (double) $condition_value) {
             $status = 1;
         } elseif ($rec['CONDITION'] == 4 && $value != $condition_value) {
             $status = 1;
         } else {
             $status = 0;
         }
         if ($status == 1 && !$rec['ACTIVE_STATE']) {
             $rec['ACTIVE_STATE'] = 1;
             SQLUpdate('patterns', $rec);
             $condition_matched = 1;
         } elseif ($status == 0 && $rec['ACTIVE_STATE']) {
             $rec['ACTIVE_STATE'] = 0;
             SQLUpdate('patterns', $rec);
             if ($rec['SCRIPT_EXIT']) {
                 $this->runPatternExitAction($rec['ID'], $rec['SCRIPT_EXIT']);
             }
             //to-do: state exit script
         }
     } else {
         if ($rec['SKIPSYSTEM'] && !$from_user_id) {
             return 0;
         }
         if (!$rec['PATTERN']) {
             $pattern = $rec['TITLE'];
         } else {
             $pattern = $rec['PATTERN'];
         }
         $pattern = str_replace("\r", '', $pattern);
         if ($pattern == '') {
             return 0;
         }
         if ($rec['EXECUTED'] > 0 && $rec['TIME_LIMIT'] && time() - $rec['EXECUTED'] <= $rec['TIME_LIMIT']) {
             return 0;
         }
         $lines_pattern = explode("\n", $pattern);
         $total_lines = count($lines_pattern);
         if (!$rec['TIME_LIMIT']) {
             $messages = SQLSelect("SELECT MESSAGE FROM shouts ORDER BY ID DESC LIMIT " . (int) $total_lines);
             $messages = array_reverse($messages);
         } else {
             $start_from = time() - $rec['TIME_LIMIT'];
             $messages = SQLSelect("SELECT MESSAGE FROM shouts WHERE ADDED>=('" . date('Y-m-d H:i:s', $start_from) . "') ORDER BY ADDED");
         }
         $total = count($messages);
         if (!$total) {
             return 0;
         }
         $lines = array();
         for ($i = 0; $i < $total; $i++) {
             $lines[] = $messages[$i]['MESSAGE'];
         }
         $history = implode('@@@@', $lines);
         $check = implode('@@@@', $lines_pattern);
         if (preg_match('/' . $check . '/isu', $history, $matches)) {
             $condition_matched = 1;
         }
     }
     if ($condition_matched) {
         if (checkAccess('pattern', $rec['ID'])) {
             $is_common = 0;
             if ($rec['PARENT_ID']) {
                 $parent_rec = SQLSelectOne("SELECT IS_COMMON_CONTEXT FROM patterns WHERE ID='" . $rec['PARENT_ID'] . "'");
                 $is_common = (int) $parent_rec['IS_COMMON_CONTEXT'];
             }
             if (context_getcurrent()) {
                 $history = context_get_history() . ' ' . $history;
             }
             if ($rec['IS_CONTEXT']) {
                 context_activate($rec['ID'], 1, $history);
             } elseif ($rec['MATCHED_CONTEXT_ID']) {
                 context_activate($rec['MATCHED_CONTEXT_ID'], 0, $history);
             } elseif (!$is_common) {
                 context_activate(0);
             }
             $rec['LOG'] = date('Y-m-d H:i:s') . ' Pattern matched' . "\n" . $rec['LOG'];
             $rec['EXECUTED'] = time();
             SQLUpdate('patterns', $rec);
             $pattern_matched = 1;
             $this_pattern_matched = 1;
             $sub_patterns_matched = 0;
             if ($rec['IS_CONTEXT']) {
                 $sub_patterns = SQLSelect("SELECT ID, IS_LAST FROM patterns WHERE PARENT_ID='" . $rec['ID'] . "' ORDER BY PRIORITY DESC, TITLE");
                 $total = count($sub_patterns);
                 for ($i = 0; $i < $total; $i++) {
                     if ($this->checkPattern($sub_patterns[$i]['ID'], $from_user_id)) {
                         $sub_patterns_matched = 1;
                         if ($sub_patterns[$i]['IS_LAST']) {
                             break;
                         }
                     }
                 }
             }
             if (!$sub_patterns_matched) {
                 $this->runPatternAction($rec['ID'], $matches, $history, $from_user_id);
             }
             if ($rec['ONETIME']) {
                 SQLExec("DELETE FROM patterns WHERE ID='" . $rec['ID'] . "'");
             }
         }
     } else {
         $this_pattern_matched = 0;
     }
     return $this_pattern_matched;
 }
Esempio n. 2
0
 function getAvailableActions()
 {
     $current_context = context_getcurrent();
     if (preg_match('/^ext(\\d+)/', $current_context, $m)) {
         $res = $this->getAvailableActionsExt($m[1]);
         return $res;
     }
     $patterns = SQLSelect("SELECT * FROM patterns WHERE 1 AND PARENT_ID='" . (int) $current_context . "' AND IS_COMMON_CONTEXT!=1 ORDER BY ID");
     $total = count($patterns);
     if (!$total) {
         return 0;
     }
     $res = array();
     for ($i = 0; $i < $total; $i++) {
         $res[] = $patterns[$i]['TITLE'];
     }
     return $res;
 }