Exemple #1
0
 /**
  * Статистика просмотров поста:
  */
 public static function updatePostStats($board, $id, $writing = false)
 {
     $ip = $_SERVER['REMOTE_ADDR'];
     $cache = KVS::getInstance();
     if ($cache->exists(__CLASS__, $board . ':' . $id, 'stats')) {
         $stats = unserialize($cache->get(__CLASS__, $board . ':' . $id, 'stats'));
     } else {
         $stats = array('online' => array(), 'writers' => array());
     }
     $stats['online'][$ip] = time();
     $stats['online'] = array_filter($stats['online'], function ($value) {
         return time() - $value < 60 * 2;
     });
     if (array_key_exists($ip, $stats['writers']) && !$writing) {
         unset($stats['writers'][$ip]);
     } elseif ($writing) {
         $stats['writers'][$ip] = time();
     }
     foreach ($stats['writers'] as $ip => $time) {
         if (time() - $time > 20) {
             unset($stats['writers'][$ip]);
         }
     }
     $cache->set(__CLASS__, $board . ':' . $id, 'stats', serialize($stats));
     EventModel::getInstance()->Broadcast('board_stats_updated', array($board, $id));
     return true;
 }
Exemple #2
0
 /**
  * Poo chan:
  */
 public function pooAjaxAction(Application $application)
 {
     $cache = KVS::getInstance();
     if ($cache->exists(__CLASS__, 'poo', $_SERVER['REMOTE_ADDR'])) {
         return false;
     }
     EventModel::getInstance()->ClientBroadcast('page_' . $_POST['target'], "poo", array('top' => $_POST['top'], 'left' => $_POST['left']));
     $cache->set(__CLASS__, 'poo', $_SERVER['REMOTE_ADDR'], 1);
     $cache->expire(__CLASS__, 'poo', $_SERVER['REMOTE_ADDR'], 1);
     return true;
 }
 static function deleteEvent($id)
 {
     // retrieve model instance
     $model = EventModel::getInstance();
     // delegate deletion to the model
     $result = $model->delete($id);
     // reload events list
     $id = $_SESSION['activation_id'];
     //use if present
     EventsController::listRows($id);
 }
 /**
  * Удаление комментария:
  */
 public static function RemoveComment($id)
 {
     $comment = self::GetComment($id);
     $kvs = KVS::getInstance();
     $cache = KVS::getInstance();
     if ($comment) {
         if ($kvs->exists('ControlModel', 'timeblock', $comment['ip'])) {
             $kvs->set('ControlModel', 'timeban', $comment['ip'], true);
             $kvs->expire('ControlModel', 'timeban', $comment['ip'], 60 * 60);
         }
         if ($kvs->exists('ControlModel', 'timeban', $comment['ip'])) {
             $life = $kvs->lifetime('ControlModel', 'timeban', $comment['ip']);
             $kvs->expire('ControlModel', 'timeban', $comment['ip'], $life + 60 * 60);
         }
         $kvs->set('ControlModel', 'timeblock', $comment['ip'], true);
         $kvs->expire('ControlModel', 'timeblock', $comment['ip'], 60 * 60);
         $dbh = PDOQuery::getInstance();
         $dbh->update_insecure('1chan_post', array('comments' => '`comments`-1'), 'id = ' . $dbh->q($comment['post_id']), 1, true);
         $cache->listRemove(__CLASS__, null, 'lastComments', $id);
         EventModel::getInstance()->Broadcast('remove_comment', array('id' => $id, 'post_id' => $comment['post_id']));
         return $dbh->delete('1chan_comment', 'id = ' . $dbh->q($id), 1);
     }
     return false;
 }
Exemple #5
0
 /**
  * Установка количества участников в комнате:
  */
 public static function SetRoomOnline($id)
 {
     $ip = $_SERVER['REMOTE_ADDR'];
     $cache = KVS::getInstance();
     if ($cache->exists(__CLASS__, $id, 'stats')) {
         $stats = unserialize($cache->get(__CLASS__, $id, 'stats'));
     } else {
         $stats = array('online' => 0, 'visitors' => array());
     }
     $online_cache = $stats['online'];
     foreach ($stats['visitors'] as $is => $time) {
         if (time() - $time > 60 * 4) {
             unset($stats['visitors'][$is]);
             $stats['online']--;
         }
     }
     if (!array_key_exists($ip, $stats['visitors'])) {
         $stats['visitors'][$ip] = time();
         $stats['online']++;
     }
     $cache->set(__CLASS__, $id, 'stats', serialize($stats));
     if ($stats['online'] != $online_cache) {
         EventModel::getInstance()->Broadcast('room_stats_updated', array('room_id' => $id, 'stats' => $stats));
     }
     return true;
 }
Exemple #6
0
function counterString()
{
    // rows to be listed
    $datamap = $_SESSION['event_datamap'];
    $partial = count($datamap);
    // total rows
    include_once 'model.php';
    $model = EventModel::getInstance();
    $total = $model->countRows();
    // display counter
    $string = $partial . " of " . $total . " records";
    return $string;
}
Exemple #7
0
 /**
  * Отправка информационного сообщения в канал:
  */
 public static function AddInfoMessage($id, $message, $password = false)
 {
     $channel = self::GetChatChannel($id, $password);
     EventModel::getInstance()->ClientBroadcast('chat_' . $channel, 'message', array('type' => 'info', 'message' => $message));
     return true;
 }
Exemple #8
0
 /**
  * Функция счетчика переходов:
  */
 public static function Click($id)
 {
     $cache = KVS::getInstance();
     $link = unserialize($cache->get(__CLASS__, 'links', $id));
     if (!in_array($_SERVER['REMOTE_ADDR'], $link['visitors'])) {
         $link['visitors'][] = $_SERVER['REMOTE_ADDR'];
         $link['clicks']++;
         $ttl = $cache->lifetime(__CLASS__, 'links', $id);
         $cache->set(__CLASS__, 'links', $id, serialize($link));
         $cache->expire(__CLASS__, 'links', $id, $ttl);
         EventModel::getInstance()->Broadcast('visit_online_link', array('id' => $id, 'clicks' => $link['clicks']));
     }
     return true;
 }
Exemple #9
0
 /**
  * Скрытие поста:
  */
 public static function HidePost($id, $hidden = true, $comment = '')
 {
     $dbh = PDOQuery::getInstance();
     EventModel::getInstance()->Broadcast('info_post', array($id, $comment));
     return $dbh->update('1chan_post', array('hidden' => $hidden), 'id = ' . $dbh->q($id));
 }
Exemple #10
0
    /**
     * Операции с чатом (ajax):
     */
    public function chatAjaxAction(Application $application)
    {
        $session = Session::getInstance();
        if ($_SERVER['REQUEST_METHOD'] == 'GET') {
            switch (@$_GET['command']) {
                case 'enter':
                    return Chat_ChatModel::TestChatChannel($_GET['id']);
                case 'ping':
                    EventModel::getInstance()->Broadcast('view_chat', $_GET['id']);
                    return true;
                case 'welcome':
                    $room = Chat_ChatRoomsModel::GetRoom($_GET['id']);
                    $info = Chat_ChatRoomsModel::GetInfo($_GET['id']);
                    EventModel::getInstance()->Broadcast('view_chat', $_GET['id']);
                    return array('title' => $room['title'], 'description' => $room['description'], 'info' => $info);
            }
        } else {
            switch (@$_POST['command']) {
                case 'checkpassword':
                    return Chat_ChatModel::TestChatChannel($_GET['id'], $_POST['password']);
                case 'message':
                    if (($room = Chat_ChatRoomsModel::GetRoom($_GET['id'])) == false) {
                        return array('error' => true, 'errors' => 'Комнаты чата больше не существует.');
                    }
                    if (strpos($_POST['message'], '/') === 0) {
                        switch (true) {
                            case strpos($_POST['message'], '/help') === 0:
                                return array('error' => true, 'errors' => '
                                    <p> 
						                Доступные команды:
						            </p> 
						            <dl> 
							            <dt>Изменение названия комнаты:</dt> 
							            <dd> 
								            <p>/change_title <em>пароль_управления</em> <em>новое название</em></p> 
							            </dd> 
							            <dt>Изменение описания комнаты:</dt> 
							            <dd> 
								            <p>/change_description <em>пароль_управления</em> <em>новое описание</em></p> 
							            </dd> 
							            <dt>Изменение информационного сообщения:</dt> 
							            <dd> 
								            <p>/set_info <em>пароль_управления</em> <em>сообщение</em></p> 
							            </dd> 
							            <dt>«Девойс» (лишение права голоса):</dt> 
							            <dd> 
								            <p>/devoice <em>пароль_управления</em> <em>номер сообщения</em></p> 
							            </dd> 
							            <dt>«Энвойс» (разблокировка):</dt> 
							            <dd> 
								            <p>/envoice <em>пароль_управления</em> <em>хеш (выводится при девойсе)</em></p> 
							            </dd> 
							            <dt>Очистка блокировок:</dt> 
							            <dd> 
								            <p>/envoice <em>пароль_управления</em></p> 
							            </dd> 
							            <dt>Блокировка слова:</dt> 
							            <dd> 
								            <p>/blockword <em>пароль_управления</em> <em>слово или фраза</em></p> 
							            </dd> 
							            <dt>Просмотр блокированых слов:</dt> 
							            <dd> 
								            <p>/ls_blockwords <em>пароль_управления</em></p> 
							            </dd> 
							            <dt>Разблокировка слова:</dt> 
							            <dd> 
								            <p>/rm_blockword <em>пароль_управления</em> <em>номер_слова (из списка слов)</em></p> 
							            </dd> 
							            <dt>Статус публичности:</dt> 
							            <dd> 
								            <p>/set_public <em>пароль_управления</em> 0/1<em>(0 - скрытая, 1 - публичная)</em></p> 
							            </dd>
							            <dt>Удаление комнаты:</dt> 
							            <dd> 
								            <p>/remove_room <em>пароль_управления</em></p> 
							            </dd> 
					                </dl> 
					        ');
                            case strpos($_POST['message'], '/get_controlword') === 0:
                                if ($session->isAdminSession()) {
                                    return array('error' => true, 'errors' => 'Пароль управления: ' . $room['controlword']);
                                }
                                return array('error' => true, 'errors' => 'Неверная команда.');
                            case strpos($_POST['message'], '/devoice') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $message_id = preg_replace("/[^0-9]/", '', array_shift($parts));
                                $key = Chat_ChatModel::deVoice($_GET['id'], $message_id);
                                if ($key !== false) {
                                    Chat_ChatModel::AddInfoMessage($_GET['id'], 'Автор сообщения >>' . $message_id . ' (' . $key . ') был лишен голоса.', $room['password']);
                                } else {
                                    return array('error' => true, 'errors' => 'Сообщение слишком старое.');
                                }
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/envoice') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $key = array_shift($parts);
                                if ($key) {
                                    Chat_ChatModel::enVoice($_GET['id'], $key);
                                } else {
                                    Chat_ChatModel::clearVoice($_GET['id']);
                                }
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/set_alias') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $alias = $parts[0];
                                if (!preg_match('/^[0-9A-z\\-]{4,20}$/i', $alias)) {
                                    return array('error' => true, 'errors' => 'Запрещенные символы в алиасе.');
                                }
                                if (Chat_ChatRoomsModel::SetAlias($_GET['id'], $alias)) {
                                    Chat_ChatRoomsModel::EditRoom($_GET['id'], array('alias' => $alias));
                                    Chat_ChatModel::AddInfoMessage($_GET['id'], 'Установлен новый алиас, теперь комната доступна по адресу http://' . TemplateHelper::getSiteUrl() . '/chat/' . $alias . '/');
                                    return array('error' => false, 'id' => -1);
                                }
                                return array('error' => true, 'errors' => 'Не удалось установить алиас (возможно он уже занят?).');
                            case strpos($_POST['message'], '/remove_alias') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                Chat_ChatRoomsModel::RemoveAlias($room['alias']);
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('alias' => null));
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/blockword') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $blocked = implode(' ', $parts);
                                Chat_ChatModel::blockWord($_GET['id'], $blocked);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/ls_blockwords') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $result = array();
                                foreach (Chat_ChatModel::getBlockList($_GET['id']) as $num => $value) {
                                    $result[] = $num . ': ' . $value;
                                }
                                return array('error' => true, 'errors' => sizeof($result) ? 'Запрещенные слова:<br />' . implode('<br />', $result) : 'Нет слов в блокировке.');
                            case strpos($_POST['message'], '/rm_blockword') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $blocked = array_shift($parts);
                                Chat_ChatModel::unblockWord($_GET['id'], $blocked);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/change_title') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $title = implode(' ', $parts);
                                if (mb_strlen($title, 'UTF-8') > 25) {
                                    return array('error' => true, 'errors' => 'Слишком длинное название.');
                                }
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('title' => $title));
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Название комнаты изменено с «' . $room['title'] . '» на «' . $title . '»', $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/change_description') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $description = implode(' ', $parts);
                                if (mb_strlen($description, 'UTF-8') > 75) {
                                    return array('error' => true, 'errors' => 'Слишком длинное описание.');
                                }
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('description' => $description));
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Описание комнаты изменено с «' . $room['description'] . '» на «' . $description . '»', $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/a') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                $symbol = array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $message = '<span style="color:orange">' . $symbol . '</span> ' . implode(' ', $parts);
                                $id = Chat_ChatModel::AddMessage($_GET['id'], $message, $_POST['password']);
                                return array('error' => false, 'id' => $id);
                            case strpos($_POST['message'], '/set_info') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $info = implode(' ', $parts);
                                if (mb_strlen($info, 'UTF-8') > 612) {
                                    return array('error' => true, 'errors' => 'Слишком длинное информационное сообщение.');
                                }
                                $info = Chat_ChatRoomsModel::SetInfo($_GET['id'], $info);
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Новое информационное сообщение:' . $info, $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/set_public') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $state = array_shift($parts);
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('public' => (bool) $state));
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Изменен статус комнаты: ' . ((bool) $state ? 'Публичная' : 'Приватная'), $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/remove_room') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                Chat_ChatModel::AddErrorMessage($_GET['id'], 'Комната была удалена.', $room['password']);
                                Chat_ChatRoomsModel::RemoveRoom($_GET['id']);
                                return array('error' => false, 'id' => -1);
                            default:
                                return array('error' => true, 'errors' => 'Неверная команда.');
                        }
                    }
                    $validator = new ValidatorHelper($_POST);
                    $validator->assertExists('message', 'Не введено сообщение');
                    $validator->assertLength('message', 1024, 'Сообщение слишком длинное');
                    EventModel::getInstance()->Broadcast('view_chat', $_GET['id']);
                    if ($validator->isValid()) {
                        if (!Chat_ChatModel::hasVoice($_GET['id'], $_SERVER['REMOTE_ADDR'])) {
                            return array('error' => true, 'errors' => 'Вам запрещено отправлять сообщения в этот чат.');
                        }
                        $blocked_words = Chat_ChatModel::getBlockList($_GET['id']);
                        $messagefilter = htmlspecialchars_decode(strtr($_POST['message'], array('*' => '', '_' => '', '=' => '', '-' => '')));
                        foreach ($blocked_words as $word) {
                            if (preg_match('~' . str_replace('~', '\\~', $word) . '~ui', $messagefilter) == true) {
                                return array('error' => true, 'errors' => 'Запрещенное слово из вордфильтра.');
                            }
                        }
                        similar_text(trim($session->persistenceGet('last_chat_text', '')), trim($_POST['message']), $percent);
                        if ($percent < 90) {
                            Chat_ChatRoomsModel::TouchRoom($_GET['id']);
                            $session->persistenceSet('last_chat_text', $_POST['message']);
                            $id = Chat_ChatModel::AddMessage($_GET['id'], $_POST['message'], $_POST['password']);
                            return array('error' => false, 'id' => $id);
                        }
                        return array('error' => true, 'errors' => 'Флуд контроль, сообщение проигнорировано.');
                    } else {
                        return array('error' => true, 'errors' => implode(', ', $validator->getValidationResults()));
                    }
            }
        }
    }
Exemple #11
0
 /**
  * Удаление категории:
  */
 public static function RemoveCategory($id)
 {
     $dbh = PDOQuery::getInstance();
     EventModel::getInstance()->Broadcast('remove_category', $id);
     return $dbh->delete('1chan_category', 'id = ' . $id, 1);
 }
Exemple #12
0
 /**
  * Действие просмотр rss ленты всех постов:
  */
 public function rssAllAction(Application $application, Template $template)
 {
     $posts = Blog_BlogPostsModel::GetAllPosts(0, 20, false);
     if ($posts) {
         $rss = new rss('utf-8');
         $rss->channel('Первый канал - Все', 'http://1chan.ru/', 'Новости имиджборд и не только.');
         $rss->language('ru-ru');
         $rss->copyright('Все права пренадлежат вам © 2010');
         $rss->managingEditor('*****@*****.**');
         $rss->category('Все');
         $rss->startRSS();
         foreach ($posts as $key => $post) {
             $title = $post['category'] ? TemplateHelper::BlogCategory($post['category'], 'title') . ' — ' . $post['title'] : $post['title'];
             $rss->itemTitle($title);
             $rss->itemLink('http://' . TemplateHelper::getSiteUrl() . '/news/res/' . $post['id'] . '/');
             $rss->itemDescription($post['link'] ? '<a href="' . $post['link'] . '">' . $post['link'] . '</a><br />' . $post['text'] : $post['text']);
             $rss->itemAuthor('anonymous');
             $rss->itemGuid('http://' . TemplateHelper::getSiteUrl() . '/news/res/' . $post['id'] . '/', true);
             $rss->itemPubDate(date('D, d M Y H:i:s O', $post['created_at']));
             $rss->addItem();
         }
         $result = $rss->RSSdone();
     }
     EventModel::getInstance()->Broadcast('view_rss_all_post');
     $template->headerOk();
     $template->headerContentType('application/rss+xml', 'UTF-8');
     echo $result;
     return false;
 }
Exemple #13
0
 /**
  * Просмотр избранных тредов:
  */
 public function viewFavoritesAction(Application $application, Template $template)
 {
     $session = Session::getInstance();
     $template->setParameter('title', 'Избранные треды');
     $template->setParameter('description', 'Список постов, отмеченных вами');
     $template->setParameter('board_id', 'fav');
     $this['posts'] = Board_FavoritesModel::GetFavoritePosts();
     $session->instantSet('captcha_board_comment', true);
     EventModel::getInstance()->Broadcast('view_board_favorites');
     return true;
 }