/** * 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; }
/** * Summary of context_timeout * @param mixed $id ID * @param mixed $user_id User ID * @return void */ function context_timeout($id, $user_id) { global $session; $user = SQLSelectOne("SELECT * FROM users WHERE ID = '" . (int) $user_id . "'"); $session->data['SITE_USER_ID'] = $user['ID']; $context = SQLSelectOne("SELECT * FROM patterns WHERE ID = '" . (int) $id . "'"); if (!$context['TIMEOUT_CONTEXT_ID']) { context_activate(0); } if ($context['TIMEOUT_SCRIPT']) { try { $code = $context['TIMEOUT_SCRIPT']; $success = eval($code); if ($success === false) { DebMes("Error in context timeout code: " . $code); registerError('context_timeout_action', "Error in context timeout code: " . $code); } } catch (Exception $e) { DebMes('Error: exception ' . get_class($e) . ', ' . $e->getMessage() . '.'); registerError('context_timeout_action', get_class($e) . ', ' . $e->getMessage()); } } if ($context['TIMEOUT_CONTEXT_ID']) { context_activate((int) $context['TIMEOUT_CONTEXT_ID']); } }
/** * Title * * Description * * @access public */ function checkPattern($id) { global $session; global $pattern_matched; $rec = SQLSelectOne("SELECT * FROM patterns WHERE ID='" . (int) $id . "'"); 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 . '/is', $history, $matches)) { 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 ($rec['IS_CONTEXT']) { context_activate($rec['ID']); } elseif ($rec['MATCHED_CONTEXT_ID']) { context_activate($rec['MATCHED_CONTEXT_ID']); } 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); global $noPatternMode; $noPatternMode = 1; $pattern_matched = 1; if ($rec['SCRIPT_ID']) { runScript($rec['SCRIPT_ID'], $matches); } elseif ($rec['SCRIPT']) { try { $code = $rec['SCRIPT']; $success = eval($code); if ($success === false) { DebMes("Error in pattern code: " . $code); } } catch (Exception $e) { DebMes('Error: exception ' . get_class($e) . ', ' . $e->getMessage() . '.'); } } $noPatternMode = 0; } } if ($pattern_matched) { return 1; } else { return 0; } }