/** * Статистика просмотров поста: */ 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; }
/** * 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; }
/** * Установка количества участников в комнате: */ 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; }
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; }
/** * Отправка информационного сообщения в канал: */ 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; }
/** * Функция счетчика переходов: */ 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; }
/** * Скрытие поста: */ 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)); }
/** * Операции с чатом (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())); } } } }
/** * Удаление категории: */ public static function RemoveCategory($id) { $dbh = PDOQuery::getInstance(); EventModel::getInstance()->Broadcast('remove_category', $id); return $dbh->delete('1chan_category', 'id = ' . $id, 1); }
/** * Действие просмотр 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; }
/** * Просмотр избранных тредов: */ 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; }