/** * 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; }
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; }