public function getUsers($nick) { $connection = $this->getConnection(); $now = time(); $sqlQuery = ' UPDATE `' . XOAD_CHAT_USERS_TABLE_NAME . '` SET `time` = ' . $now . ' WHERE `nick` = \'' . $this->escapeString($nick, $connection) . '\' '; mysql_query($sqlQuery, $connection); $sqlQuery = ' SELECT `nick` FROM `' . XOAD_CHAT_USERS_TABLE_NAME . '` WHERE `time` < ' . ($now - 30) . ' ORDER BY `time` ASC, `nick` ASC '; $sqlResult = mysql_query($sqlQuery); $oldUsers = array(); while (($row = mysql_fetch_assoc($sqlResult)) != false) { $oldUsers[] = $row['nick']; } mysql_free_result($sqlResult); $sqlQuery = ' DELETE FROM `' . XOAD_CHAT_USERS_TABLE_NAME . '` WHERE `time` < ' . ($now - 30) . ' '; mysql_query($sqlQuery); $sqlQuery = ' SELECT `nick` FROM `' . XOAD_CHAT_USERS_TABLE_NAME . '` ORDER BY `nick` ASC '; $sqlResult = mysql_query($sqlQuery, $connection); $users = array(); while (($row = mysql_fetch_assoc($sqlResult)) != false) { $users[] = $row['nick']; } mysql_free_result($sqlResult); $storage =& XOAD_Events_Storage::getStorage(); foreach ($oldUsers as $nick) { $storage->postEvent('onUserLeave', 'ChatClient', null, $nick); } $this->closeConnection($connection); return $users; }
/** * Filters the events in the container using multiple criterias. * * <p>Valid keys for each event are:</p> * - event - the event name (case-sensitive); * - className - the class that is the source of the event; * - filter - the event filter data (case-insensitive); * using this argument you can filter events with * the same name but with different filter data; * - time - the event start time (seconds since the Unix * Epoch (January 1 1970 00:00:00 GMT). * * @access public * * @param array $eventsData Array containing associative arrays * with information for each event. * * @return array Sequental array that contains all events that match the * supplied criterias, ordered by time (ascending). * */ public function filterMultipleEvents($eventsData) { $events = array(); $containerData = @file($this->getFileName()); if (empty($containerData)) { return $events; } foreach ($eventsData as $event) { if (!parent::filterMultipleEvents($event)) { continue; } foreach ($containerData as $row) { list($eventName, $className, $time, $endTime, $filter, $rowData) = explode($this->separator, $row, 6); $filter = unserialize($filter); $match = strcmp($eventName, $event['event']) == 0; $match &= strcasecmp($className, $event['className']) == 0; $match &= $time > $event['time']; if (isset($event['filter'])) { $match &= $filter == $event['filter']; } if ($match) { $rowData = unserialize($rowData); $events[] = array('event' => $eventName, 'className' => $className, 'filter' => $filter, 'time' => (double) $time, 'endTime' => (double) $endTime, 'eventData' => array('sender' => isset($rowData['sender']) ? $rowData['sender'] : null, 'data' => isset($rowData['data']) ? $rowData['data'] : null)); } } } if (!empty($events)) { usort($events, array('XOAD_Events_Storage_File', 'sortEvents')); } return $events; }
/** * Retrieves an instanse to the configurated XOAD Events storage provider. * * <p>Example:</p> * <code> * <?php * * require_once('xoad.php'); * * $storage =& XOAD_Events_Storage::getStorage(); * * $storage->postEvent('event', 'class'); * * ?> * </code> * * @access public * * @return object Singleton {@link XOAD_Events_Storage} inherited class based * on the configuration (see {@link XOAD_EVENTS_STORAGE_DSN}). * * @static * */ public static function &getStorage() { if (!isset(self::$instance)) { $className = null; $classParameters = null; $separator = '://'; $position = strpos(XOAD_EVENTS_STORAGE_DSN, $separator); if ($position === false) { $className = XOAD_EVENTS_STORAGE_DSN; } else { $className = substr(XOAD_EVENTS_STORAGE_DSN, 0, $position); $classParameters = substr(XOAD_EVENTS_STORAGE_DSN, $position + strlen($separator)); } if (empty($className)) { return null; } $fileName = XOAD_BASE . '/classes/events/storage/' . $className . '.class.php'; /** * Load the file that defines the events storage provider. */ require_once $fileName; $realClassName = 'XOAD_Events_Storage_' . $className; if (!class_exists($realClassName)) { return null; } self::$instance = new $realClassName($classParameters); } return self::$instance; }
/** * Dispatches a client callback to the server. * * @access public * * @return string Outputs JavaString code that contains the result * and the output of the callback. * * @static * */ public static function dispatch() { if (empty($GLOBALS['_XOAD_SERVER_REQUEST_BODY'])) { return false; } $requestBody =& $GLOBALS['_XOAD_SERVER_REQUEST_BODY']; if (!XOAD_Server::notifyObservers('dispatchEnter', array('request' => &$requestBody))) { return false; } if (isset($requestBody['eventPost'])) { $callbackResponse = array(); $storage =& XOAD_Events_Storage::getStorage(); $callbackResponse['status'] = $storage->postEvent($requestBody['event'], $requestBody['className'], $requestBody['sender'], $requestBody['data'], $requestBody['filter']); if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { if (!empty($callbackResponse['status'])) { print XOAD_Client::register($callbackResponse); } } } else { if (isset($requestBody['eventsCallback'])) { $eventsQuery = array(); foreach ($requestBody['data'] as $event) { $eventsQuery[] = array('event' => $event['event'], 'className' => $event['className'], 'filter' => $event['filter'], 'time' => $requestBody['time']); } $callbackResponse = array(); $storage =& XOAD_Events_Storage::getStorage(); $storage->cleanEvents(); $callbackResponse['result'] = $storage->filterMultipleEvents($eventsQuery); if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { if (!empty($callbackResponse['result'])) { print XOAD_Client::register($callbackResponse); } } } else { $callbackResponse = array(); $outputBuffering = @ob_start(); set_error_handler(array('XOAD_Server', 'handleError')); $callbackResponse['returnValue'] = call_user_func_array(array(&$requestBody['source'], $requestBody['method']), $requestBody['arguments']); if (defined('XOAD_SERVER_EXCEPTION')) { if (XOAD_Server::notifyObservers('dispatchFailed', array('request' => &$requestBody, 'message' => XOAD_SERVER_EXCEPTION))) { XOAD_Server::throwException(XOAD_SERVER_EXCEPTION); return false; } } $callbackResponse['returnObject'] =& $requestBody['source']; if ($outputBuffering) { $output = @ob_get_contents(); if (!empty($output)) { $callbackResponse['output'] = $output; } @ob_end_clean(); } restore_error_handler(); if (XOAD_Server::notifyObservers('dispatchLeave', array('request' => &$requestBody, 'response' => &$callbackResponse))) { print XOAD_Client::register($callbackResponse); } } } return true; }
/** * Filters the events in the database using multiple criterias. * * <p>Valid keys for each event are:</p> * - event - the event name (case-sensitive); * - className - the class that is the source of the event; * - filter - the event filter data (case-insensitive); * using this argument you can filter events with * the same name but with different filter data; * - time - the event start time (seconds since the Unix * Epoch (January 1 1970 00:00:00 GMT). * * @access public * * @param array $eventsData Array containing associative arrays * with information for each event. * * @return array Sequental array that contains all events that match the * supplied criterias, ordered by time (ascending). * */ public function filterMultipleEvents($eventsData) { $connection =& $this->getConnection(); $sqlQuery = ' SELECT `event`, `className`, `filter`, `sender`, `data`, `time`, `endTime` FROM `' . XOAD_EVENTS_TABLE_NAME . '` WHERE '; $index = 0; $length = sizeof($eventsData); foreach ($eventsData as $event) { if (!parent::filterMultipleEvents($event)) { continue; } $sqlQuery .= '( `time` > ' . $this->escapeString($event['time'], $connection) . ' AND `event` = \'' . $this->escapeString($event['event'], $connection) . '\' AND `className` = \'' . $this->escapeString($event['className'], $connection) . '\' '; if (isset($event['filter'])) { $sqlQuery .= 'AND `filter` = \'' . $this->escapeString($event['filter'], $connection) . '\''; } if ($index < $length - 1) { $sqlQuery .= ') OR '; } else { $sqlQuery .= ')'; } $index++; } $sqlQuery .= ' ORDER BY `time` ASC '; $events = array(); $sqlResult =& $connection->query($sqlQuery); while (($row =& $sqlResult->fetchRow()) != false) { $events[] = array('event' => $row['event'], 'className' => $row['className'], 'filter' => $row['filter'], 'time' => (double) $row['time'], 'endTime' => (double) $row['endTime'], 'eventData' => array('sender' => $row['sender'] === null ? null : unserialize($row['sender']), 'data' => $row['data'] === null ? null : unserialize($row['data']))); } $sqlResult->free(); $this->closeConnection($connection); return $events; }