Ejemplo n.º 1
0
 /**
  * Returns array of various statistics for each channel.
  *
  * @return array Array of objects (fields: channel, messages, users, last_message)
  */
 public function getChannelsSummary()
 {
     global $wpdb;
     $table = WiseChatInstaller::getMessagesTable();
     $conditions = array();
     $conditions[] = "user != 'System'";
     $sql = "SELECT channel, count(*) AS messages, max(time) AS last_message FROM {$table} " . " WHERE " . implode(" AND ", $conditions) . " GROUP BY channel " . " ORDER BY channel ASC " . " LIMIT 1000;";
     $mainSummary = $wpdb->get_results($sql);
     $usersSummary = $this->channelUsersDAO->getAllChannelsStats();
     $usersSummaryMap = array();
     foreach ($usersSummary as $userDetails) {
         $usersSummaryMap[$userDetails->getChannel()->getName()] = intval($userDetails->getNumberOfUsers());
     }
     $mainSummaryMap = array();
     foreach ($mainSummary as $mainDetails) {
         $mainDetails->users = array_key_exists($mainDetails->channel, $usersSummaryMap) ? $usersSummaryMap[$mainDetails->channel] : 0;
         $mainSummaryMap[$mainDetails->channel] = $mainDetails;
     }
     $channels = $this->channelsDAO->getAll();
     $fullSummary = array();
     foreach ($channels as $channel) {
         if (array_key_exists($channel->getName(), $mainSummaryMap)) {
             $channelPrepared = $mainSummaryMap[$channel->getName()];
             $channelPrepared->secured = strlen($channel->getPassword()) > 0;
             $fullSummary[] = $channelPrepared;
         } else {
             $fullSummary[] = (object) array('channel' => $channel->getName(), 'messages' => 0, 'users' => array_key_exists($channel->getName(), $usersSummaryMap) ? $usersSummaryMap[$channel->getName()] : 0, 'last_message' => null, 'secured' => strlen($channel->getPassword()) > 0);
         }
     }
     return $fullSummary;
 }
Ejemplo n.º 2
0
 /**
  * Bans an user by message ID.
  *
  * @param integer $messageId
  * @param WiseChatChannel $channel
  * @param string $durationString
  *
  * @throws Exception If the message or user was not found
  */
 public function banByMessageId($messageId, $channel, $durationString = '1d')
 {
     $message = $this->messagesDAO->get($messageId);
     if ($message === null) {
         throw new Exception('Message was not found');
     }
     $channelUser = $this->channelUsersDAO->getByUserIdAndChannelId($message->getUserId(), $channel->getId());
     if ($channelUser !== null) {
         $user = $this->usersDAO->get($message->getUserId());
         if ($user !== null) {
             $duration = $this->getDurationFromString($durationString);
             $this->banIpAddress($user->getIp(), $duration);
             return;
         }
     }
     throw new Exception('User was not found in this channel');
 }
Ejemplo n.º 3
0
 /**
  * Returns rendered channel statistics.
  *
  * @param WiseChatChannel $channel
  *
  * @return string HTML source
  */
 public function getRenderedChannelStats($channel)
 {
     if ($channel === null) {
         return 'ERROR: channel does not exist';
     }
     $variables = array('channel' => $channel->getName(), 'messages' => $this->messagesService->getNumberByChannelName($channel->getName()), 'users' => $this->channelUsersDAO->getAmountOfUsersInChannel($channel->getId()));
     return $this->getTemplatedString($variables, $this->options->getOption('template', 'ERROR: TEMPLATE NOT SPECIFIED'));
 }
Ejemplo n.º 4
0
 /**
  * Determines if the number of channels that current user participates has been reached.
  *
  * @param WiseChatChannel $channel
  *
  * @return boolean
  */
 public function isChatChannelsLimitReached($channel)
 {
     $limit = $this->options->getIntegerOption('channels_limit', 0);
     if ($limit > 0) {
         $this->userService->refreshChannelUsersData();
         $amountOfChannels = $this->channelUsersDAO->getAmountOfActiveBySessionId(session_id());
         $user = $this->authentication->getUser();
         if ($user === null || $channel === null || $this->channelUsersDAO->getActiveByUserIdAndChannelId($user->getId(), $channel->getId()) === null) {
             $amountOfChannels++;
         }
         if ($amountOfChannels > $limit) {
             return true;
         }
     }
     return false;
 }
Ejemplo n.º 5
0
 /**
  * Marks presence of the current user in the given channel.
  *
  * @param WiseChatChannel $channel
  *
  * @return null
  */
 private function markPresenceInChannel($channel)
 {
     $user = $this->authentication->getUser();
     if ($user !== null) {
         $channelUser = $this->channelUsersDAO->getByUserIdAndChannelId($user->getId(), $channel->getId());
         if ($channelUser === null) {
             $channelUser = new WiseChatChannelUser();
             $channelUser->setActive(true);
             $channelUser->setLastActivityTime(time());
             $channelUser->setUserId($user->getId());
             $channelUser->setChannelId($channel->getId());
             $this->channelUsersDAO->save($channelUser);
         } else {
             $channelUser->setActive(true);
             $channelUser->setLastActivityTime(time());
             $this->channelUsersDAO->save($channelUser);
         }
     }
 }
Ejemplo n.º 6
0
 /**
  * Validates given username.
  *
  * @param string $userName
  *
  * @return string Validated username (trimmed and filtered)
  * @throws Exception If username is not valid
  */
 public function validateUserName($userName)
 {
     $userName = trim($userName);
     // check for valid characters:
     if (strlen($userName) == 0 || !preg_match('/^[a-zA-Z0-9\\-_ ]+$/', $userName)) {
         throw new Exception($this->options->getOption('message_error_1', 'Only letters, number, spaces, hyphens and underscores are allowed'));
     }
     // filter the new username:
     if ($this->options->isOptionEnabled('filter_bad_words')) {
         WiseChatContainer::load('rendering/filters/pre/WiseChatFilter');
         $userName = WiseChatFilter::filter($userName);
     }
     // check if the new username is already occupied:
     $occupiedException = new Exception($this->options->getOption('message_error_2', 'This name is already occupied'));
     $prefix = $this->options->getOption('user_name_prefix', 'Anonymous');
     if ($this->getUserNameOrEmptyString() == $userName || $this->usersDAO->getWpUserByDisplayName($userName) !== null || $this->usersDAO->getWpUserByLogin($userName) !== null || $this->channelUsersDAO->isUserNameOccupied($userName, $this->userSessionDAO->getSessionId()) || preg_match("/^{$prefix}/", $userName) || $userName == $this->getSystemUser()->getName()) {
         throw $occupiedException;
     }
     return $userName;
 }
Ejemplo n.º 7
0
 /**
  * Endpoint for periodic (every 10-20 seconds) maintenance services like:
  * - user authentication
  * - getting the list of actions to execute on the client side
  * - getting the list of events to listen on the client side
  * - maintenance actions in messages, bans, users, etc.
  */
 public function maintenanceEndpoint()
 {
     $this->verifyCheckSum();
     $response = array();
     try {
         $this->checkChatOpen();
         $this->checkUserAuthorization();
         $this->checkGetParams(array('channelId', 'lastActionId'));
         $channelId = $this->getGetParam('channelId');
         $channel = $this->channelsDAO->get($channelId);
         $this->checkChannel($channel);
         $this->checkChannelAuthorization($channel);
         // periodic maintenance:
         $this->userService->periodicMaintenance($channel);
         $this->messagesService->periodicMaintenance($channel);
         $this->bansService->periodicMaintenance();
         // load actions:
         $lastActionId = intval($this->getGetParam('lastActionId', 0));
         $user = $this->authentication->getUser();
         $response['actions'] = $this->actions->getJSONReadyActions($lastActionId, $user);
         // load events:
         $response['events'] = array();
         if ($this->userEvents->shouldTriggerEvent('usersList', $channel->getName())) {
             if ($this->options->isOptionEnabled('show_users')) {
                 $response['events'][] = array('name' => 'refreshUsersList', 'data' => $this->renderer->getRenderedUsersList($channel));
             }
             if ($this->options->isOptionEnabled('show_users_counter')) {
                 $response['events'][] = array('name' => 'refreshUsersCounter', 'data' => array('total' => $this->channelUsersDAO->getAmountOfUsersInChannel($channel->getId())));
             }
         }
     } catch (WiseChatUnauthorizedAccessException $exception) {
         $response['error'] = $exception->getMessage();
         $this->sendUnauthorizedStatus();
     } catch (Exception $exception) {
         $response['error'] = $exception->getMessage();
         $this->sendBadRequestStatus();
     }
     echo json_encode($response);
     die;
 }
Ejemplo n.º 8
0
 /**
  * Returns chat HTML for given channel.
  *
  * @param string|null $channelName
  *
  * @return string
  * @throws Exception
  */
 public function getRenderedChat($channelName = null)
 {
     $channel = $this->service->createAndGetChannel($this->service->getValidChatChannelName($channelName));
     if ($this->service->isChatRestrictedForAnonymousUsers()) {
         return $this->renderer->getRenderedAccessDenied($this->options->getOption('message_error_4', 'Only logged in users are allowed to enter the chat'), 'wcAccessDenied');
     }
     if (!$this->service->isChatOpen()) {
         return $this->renderer->getRenderedAccessDenied($this->options->getOption('message_error_5', 'The chat is closed now'), 'wcChatClosed');
     }
     if ($this->service->isChatChannelFull($channel)) {
         return $this->renderer->getRenderedAccessDenied($this->options->getOption('message_error_6', 'The chat is full now. Try again later.'), 'wcChatFull');
     }
     if ($this->service->isChatChannelsLimitReached($channel)) {
         return $this->renderer->getRenderedAccessDenied($this->options->getOption('message_error_10', 'You cannot enter the chat due to the limit of channels you can participate simultaneously.'), 'wcChatChannelLimitFull');
     }
     if ($this->service->hasUserToBeForcedToEnterName()) {
         if ($this->getPostParam('wcUserNameSelection') !== null) {
             try {
                 $this->authentication->authenticate($this->getPostParam('wcUserName'));
             } catch (Exception $e) {
                 return $this->renderer->getRenderedUserNameForm($e->getMessage());
             }
         } else {
             return $this->renderer->getRenderedUserNameForm();
         }
     }
     if ($this->service->hasUserToBeAuthorizedInChannel($channel)) {
         if ($this->getPostParam('wcChannelAuthorization') !== null) {
             if (!$this->service->authorize($channel, $this->getPostParam('wcChannelPassword'))) {
                 return $this->renderer->getRenderedPasswordAuthorization($this->options->getOption('message_error_9', 'Invalid password.'));
             }
         } else {
             return $this->renderer->getRenderedPasswordAuthorization();
         }
     }
     $chatId = $this->service->getChatID();
     $this->userService->startUpMaintenance($channel);
     $this->bansService->startUpMaintenance();
     $this->messagesService->startUpMaintenance($channel);
     $messages = $this->messagesService->getAllByChannelNameAndOffset($channel->getName());
     $renderedMessages = '';
     $lastId = 0;
     foreach ($messages as $message) {
         // omit non-admin messages:
         if ($message->isAdmin() && !$this->usersDAO->isWpUserAdminLogged()) {
             continue;
         }
         $renderedMessages .= $this->renderer->getRenderedMessage($message);
         if ($lastId < $message->getId()) {
             $lastId = $message->getId();
         }
     }
     $lastAction = $this->actionsDAO->getLast();
     $jsOptions = array('chatId' => $chatId, 'channelId' => $channel->getId(), 'nowTime' => gmdate('c', time()), 'lastId' => $lastId, 'checksum' => $this->getCheckSum(), 'lastActionId' => $lastAction !== null ? $lastAction->getId() : 0, 'baseDir' => $this->options->getBaseDir(), 'emoticonsBaseURL' => $this->options->getEmoticonsBaseURL(), 'apiEndpointBase' => $this->getEndpointBase(), 'messagesRefreshTime' => intval($this->options->getEncodedOption('messages_refresh_time', 3000)), 'messagesOrder' => $this->options->getEncodedOption('messages_order', '') == 'descending' ? 'descending' : 'ascending', 'enableTitleNotifications' => $this->options->isOptionEnabled('enable_title_notifications'), 'soundNotification' => $this->options->getEncodedOption('sound_notification'), 'messagesTimeMode' => $this->options->getEncodedOption('messages_time_mode'), 'channelUsersLimit' => $this->options->getIntegerOption('channel_users_limit', 0), 'messages' => array('message_sending' => $this->options->getEncodedOption('message_sending', 'Sending ...'), 'hint_message' => $this->options->getEncodedOption('hint_message'), 'messageSecAgo' => $this->options->getEncodedOption('message_sec_ago', 'sec. ago'), 'messageMinAgo' => $this->options->getEncodedOption('message_min_ago', 'min. ago'), 'messageYesterday' => $this->options->getEncodedOption('message_yesterday', 'yesterday'), 'messageUnsupportedTypeOfFile' => $this->options->getEncodedOption('message_error_7', 'Unsupported type of file.'), 'messageSizeLimitError' => $this->options->getEncodedOption('message_error_8', 'The size of the file exceeds allowed limit.')), 'userSettings' => $this->userSettingsDAO->getAll(), 'attachmentsValidFileFormats' => $this->attachmentsService->getAllowedFormats(), 'attachmentsSizeLimit' => $this->attachmentsService->getSizeLimit(), 'imagesSizeLimit' => $this->options->getIntegerOption('images_size_limit', 3145728));
     $templater = new WiseChatTemplater($this->options->getPluginBaseDir());
     $templater->setTemplateFile(WiseChatThemes::getInstance()->getMainTemplate());
     $data = array('chatId' => $chatId, 'baseDir' => $this->options->getBaseDir(), 'messages' => $renderedMessages, 'themeStyles' => $this->options->getBaseDir() . WiseChatThemes::getInstance()->getCss(), 'showMessageSubmitButton' => $this->options->isOptionEnabled('show_message_submit_button'), 'showEmoticonInsertButton' => $this->options->isOptionEnabled('show_emoticon_insert_button', true), 'messageSubmitButtonCaption' => $this->options->getEncodedOption('message_submit_button_caption', 'Send'), 'showUsersList' => $this->options->isOptionEnabled('show_users'), 'usersList' => $this->options->isOptionEnabled('show_users') ? $this->renderer->getRenderedUsersList($channel) : '', 'showUsersCounter' => $this->options->isOptionEnabled('show_users_counter'), 'channelUsersLimit' => $this->options->getIntegerOption('channel_users_limit', 0), 'totalUsers' => $this->channelUsersDAO->getAmountOfUsersInChannel($channel->getId()), 'showUserName' => $this->options->isOptionEnabled('show_user_name'), 'currentUserName' => htmlentities($this->authentication->getUserNameOrEmptyString(), ENT_QUOTES, 'UTF-8'), 'isCurrentUserNameNotEmpty' => $this->authentication->isAuthenticated(), 'inputControlsTopLocation' => $this->options->getEncodedOption('input_controls_location') == 'top', 'inputControlsBottomLocation' => $this->options->getEncodedOption('input_controls_location') == '', 'showCustomizationsPanel' => $this->options->isOptionEnabled('allow_change_user_name') && !$this->usersDAO->isWpUserLogged() || $this->options->isOptionEnabled('allow_mute_sound') && strlen($this->options->getEncodedOption('sound_notification')) > 0 || $this->options->isOptionEnabled('allow_change_text_color'), 'allowChangeUserName' => $this->options->isOptionEnabled('allow_change_user_name') && !$this->usersDAO->isWpUserLogged(), 'allowMuteSound' => $this->options->isOptionEnabled('allow_mute_sound') && strlen($this->options->getEncodedOption('sound_notification')) > 0, 'allowChangeTextColor' => $this->options->isOptionEnabled('allow_change_text_color'), 'allowToSendMessages' => !$this->options->isOptionEnabled('read_only_for_anonymous', false) || $this->usersDAO->isWpUserLogged(), 'messageCustomize' => $this->options->getEncodedOption('message_customize', 'Customize'), 'messageName' => $this->options->getEncodedOption('message_name', 'Name'), 'messageSave' => $this->options->getEncodedOption('message_save', 'Save'), 'messageReset' => $this->options->getEncodedOption('message_reset', 'Reset'), 'messageMuteSounds' => $this->options->getEncodedOption('message_mute_sounds', 'Mute sounds'), 'messageTextColor' => $this->options->getEncodedOption('message_text_color', 'Text color'), 'messageTotalUsers' => $this->options->getEncodedOption('message_total_users', 'Total users'), 'messagePictureUploadHint' => $this->options->getEncodedOption('message_picture_upload_hint', 'Upload a picture'), 'messageAttachFileHint' => $this->options->getEncodedOption('message_attach_file_hint', 'Attach a file'), 'messageInsertEmoticon' => $this->options->getEncodedOption('message_insert_emoticon', 'Insert an emoticon'), 'windowTitle' => $this->options->getEncodedOption('window_title', ''), 'enableAttachmentsPanel' => $this->options->isOptionEnabled('enable_images_uploader') || $this->options->isOptionEnabled('enable_attachments_uploader'), 'enableImagesUploader' => $this->options->isOptionEnabled('enable_images_uploader'), 'enableAttachmentsUploader' => $this->options->isOptionEnabled('enable_attachments_uploader'), 'attachmentsExtensionsList' => $this->attachmentsService->getAllowedExtensionsList(), 'multilineSupport' => $this->options->isOptionEnabled('multiline_support'), 'hintMessage' => $this->options->getEncodedOption('hint_message'), 'messageMaxLength' => $this->options->getIntegerOption('message_max_length', 100), 'jsOptions' => json_encode($jsOptions), 'messagesOrder' => $this->options->getEncodedOption('messages_order', '') == 'descending' ? 'descending' : 'ascending', 'cssDefinitions' => $this->cssRenderer->getCssDefinition($chatId), 'customCssDefinitions' => $this->cssRenderer->getCustomCssDefinition());
     $data = array_merge($data, $this->userSettingsDAO->getAll());
     if ($this->authentication->isAuthenticated()) {
         $data = array_merge($data, $this->authentication->getUser()->getData());
     }
     return $templater->render($data);
 }