Example #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;
 }
Example #2
0
/**
 * 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']);
    }
}
Example #3
0
 /**
 * 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;
     }
 }