1
0
Fork 0
mirror of https://github.com/Oreolek/ifhub.club.git synced 2024-07-03 06:55:03 +03:00
ifhub.club/classes/actions/ActionTalk.class.php

560 lines
17 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*-------------------------------------------------------
*
* LiveStreet Engine Social Networking
* Copyright © 2008 Mzhelskiy Maxim
*
*--------------------------------------------------------
*
* Official site: www.livestreet.ru
* Contact e-mail: rus.engine@gmail.com
*
* GNU General Public License, version 2:
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
---------------------------------------------------------
*/
/**
* Обрабатывает разговоры(почту)
*
*/
class ActionTalk extends Action {
/**
* Текущий юзер
*
* @var unknown_type
*/
protected $oUserCurrent=null;
/**
* Массив ID юзеров адресатов
*
* @var unknown_type
*/
protected $aUsersId=array();
/**
* Инициализация
*
* @return unknown
*/
public function Init() {
/**
* Проверяем авторизован ли юзер
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('not_access'));
return Router::Action('error');
}
/**
* Получаем текущего юзера
*/
$this->oUserCurrent=$this->User_GetUserCurrent();
$this->SetDefaultEvent('inbox');
$this->Viewer_AddHtmlTitle($this->Lang_Get('talk_menu_inbox'));
}
protected function RegisterEvent() {
$this->AddEvent('inbox','EventInbox');
$this->AddEvent('add','EventAdd');
$this->AddEvent('read','EventRead');
$this->AddEvent('delete','EventDelete');
$this->AddEvent('ajaxaddcomment','AjaxAddComment');
$this->AddEvent('ajaxresponsecomment','AjaxResponseComment');
$this->AddEvent('favourites','EventFavourites');
}
/**********************************************************************************
************************ РЕАЛИЗАЦИЯ ЭКШЕНА ***************************************
**********************************************************************************
*/
protected function EventDelete() {
$this->Security_ValidateSendForm();
/**
* Получаем номер сообщения из УРЛ и проверяем существует ли оно
*/
$sTalkId=$this->GetParam(0);
if (!($oTalk=$this->Talk_GetTalkById($sTalkId))) {
return parent::EventNotFound();
}
if (!($oTalkUser=$this->Talk_GetTalkUser($oTalk->getId(),$this->oUserCurrent->getId()))) {
return parent::EventNotFound();
}
/**
* Обработка удаления сообщения
*/
$this->Talk_DeleteTalkUserByArray($sTalkId,$this->oUserCurrent->getId());
func_header_location(Router::GetPath('talk'));
}
protected function EventInbox() {
/**
* Обработка удаления сообщений
*/
if (isset($_REQUEST['submit_talk_del'])) {
$this->Security_ValidateSendForm();
$aTalksIdDel=getRequest('talk_del');
if (is_array($aTalksIdDel)) {
$this->Talk_DeleteTalkUserByArray(array_keys($aTalksIdDel),$this->oUserCurrent->getId());
}
}
// Составляем фильтр для просмотра писем
$aFilter=$this->BuildFilter();
/**
* Передан ли номер страницы
*/
$iPage=preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch) ? $aMatch[1] : 1;
/**
* Получаем список писем
*/
$aResult=$this->Talk_GetTalksByFilter(
$aFilter,$iPage,Config::Get('module.talk.per_page')
);
$aTalks=$aResult['collection'];
/**
* Формируем постраничность
*/
$aPaging=$this->Viewer_MakePaging(
$aResult['count'],$iPage,Config::Get('module.talk.per_page'),4,
Router::GetPath('talk').$this->sCurrentEvent,
array_intersect_key(
$_REQUEST,
array_fill_keys(
array('start','end','keyword','sender'),
''
)
)
);
if(count($aFilter)>1) {
$this->Message_AddNotice(
($aResult['count'])
? $this->Lang_Get('talk_filter_result_count',array('count'=>$aResult['count']))
: $this->Lang_Get('talk_filter_result_empty')
);
}
$aUsersBlacklist=$this->Talk_GetBlacklistByUserId($this->oUserCurrent->getId());
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('aUsersBlacklist',$aUsersBlacklist);
$this->Viewer_AddBlocks(
'right',
array(
'actions/ActionTalk/filter.tpl',
'actions/ActionTalk/blacklist.tpl'
)
);
$this->Viewer_Assign('aPaging',$aPaging);
$this->Viewer_Assign('aTalks',$aTalks);
}
protected function BuildFilter() {
$aFilter = array(
'user_id'=>$this->oUserCurrent->getId(),
);
if($start=getRequest('start')) {
if(func_check($start,'text',6,10) && substr_count($start,'.')==2) {
list($d,$m,$y)=explode('.',$start);
if(@checkdate($m,$d,$y)) {
$aFilter['date_min']="{$y}-{$m}-{$d}";
} else {
$this->Message_AddError(
$this->Lang_Get('talk_filter_error_date_format'),
$this->Lang_Get('talk_filter_error')
);
unset($_REQUEST['start']);
}
} else {
$this->Message_AddError(
$this->Lang_Get('talk_filter_error_date_format'),
$this->Lang_Get('talk_filter_error')
);
unset($_REQUEST['start']);
}
}
if($end=getRequest('end')) {
if(func_check($end,'text',6,10) && substr_count($end,'.')==2) {
list($d,$m,$y)=explode('.',$end);
if(@checkdate($m,$d,$y)) {
$aFilter['date_max']="{$y}-{$m}-{$d}";
} else {
$this->Message_AddError(
$this->Lang_Get('talk_filter_error_date_format'),
$this->Lang_Get('talk_filter_error')
);
unset($_REQUEST['end']);
}
} else {
$this->Message_AddError(
$this->Lang_Get('talk_filter_error_date_format'),
$this->Lang_Get('talk_filter_error')
);
unset($_REQUEST['end']);
}
}
if($sKeyRequest=getRequest('keyword')){
$sKeyRequest=urldecode($sKeyRequest);
$aWords= (1===preg_match('##u', $sKeyRequest))
? preg_split('#[0-9\W_]+#Disu', $sKeyRequest, -1, PREG_SPLIT_NO_EMPTY)
: preg_split('#[0-9\W_]+#Dis', $sKeyRequest, -1, PREG_SPLIT_NO_EMPTY);
$aFilter['keyword']='%'.implode('%',(array)$aWords).'%';
}
if($sender=getRequest('sender')){
$aFilter['user_login']=urldecode($sender);
}
return $aFilter;
}
protected function EventFavourites() {
/**
* Передан ли номер страницы
*/
$iPage=preg_match("/^page(\d+)$/i",$this->getParam(0),$aMatch) ? $aMatch[1] : 1;
/**
* Получаем список писем
*/
$aResult=$this->Talk_GetTalksFavouriteByUserId(
$this->oUserCurrent->getId(),
$iPage,Config::Get('module.talk.per_page')
);
$aTalks=$aResult['collection'];
/**
* Формируем постраничность
*/
$aPaging=$this->Viewer_MakePaging(
$aResult['count'],$iPage,Config::Get('module.talk.per_page'),4,
Router::GetPath('talk').$this->sCurrentEvent
);
/**
* Загружаем переменные в шаблон
*/
$this->Viewer_Assign('aPaging',$aPaging);
$this->Viewer_Assign('aTalks',$aTalks);
}
protected function EventAdd() {
$this->Viewer_AddHtmlTitle($this->Lang_Get('talk_menu_inbox_create'));
/**
* Получаем список друзей
*/
if($aUsersFriend=$this->User_GetUsersFriend($this->oUserCurrent->getId())) {
$this->Viewer_Assign('aUsersFriend',$aUsersFriend);
}
$this->Viewer_AddBlocks('right',array('actions/ActionTalk/friends.tpl'));
/**
* Проверяем отправлена ли форма с данными
*/
if (!isset($_REQUEST['submit_talk_add'])) {
return false;
}
$this->Security_ValidateSendForm();
/**
* Проверка корректности полей формы
*/
if (!$this->checkTalkFields()) {
return false;
}
if ($oTalk=$this->Talk_SendTalk($this->Text_Parser(getRequest('talk_title')),$this->Text_Parser(getRequest('talk_text')),$this->oUserCurrent,$this->aUsersId)) {
func_header_location(Router::GetPath('talk').'read/'.$oTalk->getId().'/');
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'));
return Router::Action('error');
}
}
protected function EventRead() {
/**
* Получаем номер сообщения из УРЛ и проверяем существует ли оно
*/
$sTalkId=$this->GetParam(0);
if (!($oTalk=$this->Talk_GetTalkById($sTalkId))) {
return parent::EventNotFound();
}
if (!($oTalkUser=$this->Talk_GetTalkUser($oTalk->getId(),$this->oUserCurrent->getId()))) {
return parent::EventNotFound();
}
if($oTalkUser->getUserActive()!=LsTalk::TALK_USER_ACTIVE){
return parent::EventNotFound();
}
/**
* Обрабатываем добавление коммента
*/
if (isset($_REQUEST['submit_comment'])) {
$this->SubmitComment();
}
/**
* Достаём комменты к сообщению
*/
$aReturn=$this->Comment_GetCommentsByTargetId($oTalk->getId(),'talk');
$iMaxIdComment=$aReturn['iMaxIdComment'];
$aComments=$aReturn['comments'];
/**
* Помечаем дату последнего просмотра
*/
$oTalkUser->setDateLast(date("Y-m-d H:i:s"));
$oTalkUser->setCommentIdLast($iMaxIdComment);
$oTalkUser->setCommentCountNew(0);
$this->Talk_UpdateTalkUser($oTalkUser);
$this->Viewer_AddHtmlTitle($oTalk->getTitle());
$this->Viewer_Assign('oTalk',$oTalk);
$this->Viewer_Assign('aComments',$aComments);
$this->Viewer_Assign('iMaxIdComment',$iMaxIdComment);
if($oTalk->getUserId()==$this->oUserCurrent->getId()) {
$this->Viewer_AddBlocks('right',array('actions/ActionTalk/speakers.tpl'));
}
}
protected function checkTalkFields() {
$bOk=true;
/**
* Проверяем есть ли заголовок
*/
if (!func_check(getRequest('talk_title'),'text',2,200)) {
$this->Message_AddError($this->Lang_Get('talk_create_title_error'),$this->Lang_Get('error'));
$bOk=false;
}
/**
* Проверяем есть ли содержание топика
*/
if (!func_check(getRequest('talk_text'),'text',2,3000)) {
$this->Message_AddError($this->Lang_Get('talk_create_text_error'),$this->Lang_Get('error'));
$bOk=false;
}
/**
* проверяем адресатов
*/
$sUsers=getRequest('talk_users');
$aUsers=explode(',',$sUsers);
$aUsersNew=array();
$aUserInBlacklist = $this->Talk_GetBlacklistByTargetId($this->oUserCurrent->getId());
$this->aUsersId=array();
foreach ($aUsers as $sUser) {
$sUser=trim($sUser);
if ($sUser=='' or strtolower($sUser)==strtolower($this->oUserCurrent->getLogin())) {
continue;
}
if ($oUser=$this->User_GetUserByLogin($sUser) and $oUser->getActivate()==1) {
// Проверяем, попал ли отправиль в блек лист
if(!in_array($oUser->getId(),$aUserInBlacklist)) {
$this->aUsersId[]=$oUser->getId();
} else {
$this->Message_AddError(
str_replace(
'login',
$oUser->getLogin(),
$this->Lang_Get('talk_user_in_blacklist',array('login'=>$oUser->getLogin()))
),
$this->Lang_Get('error')
);
$bOk=false;
continue;
}
} else {
$this->Message_AddError($this->Lang_Get('talk_create_users_error_not_found').' «'.htmlspecialchars($sUser).'»',$this->Lang_Get('error'));
$bOk=false;
}
$aUsersNew[]=$sUser;
}
if (!count($aUsersNew)) {
$this->Message_AddError($this->Lang_Get('talk_create_users_error'),$this->Lang_Get('error'));
$_REQUEST['talk_users']='';
$bOk=false;
} else {
$_REQUEST['talk_users']=join(',',$aUsersNew);
}
//$bOk=false;
return $bOk;
}
/**
* Получение новых комментариев
*
*/
protected function AjaxResponseComment() {
$this->Viewer_SetResponseAjax();
$idCommentLast=getRequest('idCommentLast');
/**
* Проверям авторизован ли пользователь
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'),$this->Lang_Get('error'));
return;
}
/**
* Проверяем разговор
*/
if (!($oTalk=$this->Talk_GetTalkById(getRequest('idTarget')))) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
if (!($oTalkUser=$this->Talk_GetTalkUser($oTalk->getId(),$this->oUserCurrent->getId()))) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
$aReturn=$this->Comment_GetCommentsNewByTargetId($oTalk->getId(),'talk',$idCommentLast);
$iMaxIdComment=$aReturn['iMaxIdComment'];
$oTalkUser->setDateLast(date("Y-m-d H:i:s"));
if ($iMaxIdComment!=0) {
$oTalkUser->setCommentIdLast($iMaxIdComment);
}
$oTalkUser->setCommentCountNew(0);
$this->Talk_UpdateTalkUser($oTalkUser);
$aComments=array();
$aCmts=$aReturn['comments'];
if ($aCmts and is_array($aCmts)) {
foreach ($aCmts as $aCmt) {
$aComments[]=array(
'html' => $aCmt['html'],
'idParent' => $aCmt['obj']->getPid(),
'id' => $aCmt['obj']->getId(),
);
}
}
$this->Viewer_AssingAjax('aComments',$aComments);
$this->Viewer_AssingAjax('iMaxIdComment',$iMaxIdComment);
}
/**
* Обработка добавление комментария к топику через ajax
*
*/
protected function AjaxAddComment() {
$this->Viewer_SetResponseAjax();
$this->SubmitComment();
}
/**
* Обработка добавление комментария к топику
*
* @return unknown
*/
protected function SubmitComment() {
/**
* Проверям авторизован ли пользователь
*/
if (!$this->User_IsAuthorization()) {
$this->Message_AddErrorSingle($this->Lang_Get('need_authorization'),$this->Lang_Get('error'));
return;
}
/**
* Проверяем разговор
*/
if (!($oTalk=$this->Talk_GetTalkById(getRequest('cmt_target_id')))) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
if (!($oTalkUser=$this->Talk_GetTalkUser($oTalk->getId(),$this->oUserCurrent->getId()))) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
/**
* Проверяем текст комментария
*/
$sText=$this->Text_Parser(getRequest('comment_text'));
if (!func_check($sText,'text',2,3000)) {
$this->Message_AddErrorSingle($this->Lang_Get('talk_comment_add_text_error'),$this->Lang_Get('error'));
return;
}
/**
* Проверям на какой коммент отвечаем
*/
$sParentId=(int)getRequest('reply');
if (!func_check($sParentId,'id')) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
$oCommentParent=null;
if ($sParentId!=0) {
/**
* Проверяем существует ли комментарий на который отвечаем
*/
if (!($oCommentParent=$this->Comment_GetCommentById($sParentId))) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
/**
* Проверяем из одного топика ли новый коммент и тот на который отвечаем
*/
if ($oCommentParent->getTargetId()!=$oTalk->getId()) {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
return;
}
} else {
/**
* Корневой комментарий
*/
$sParentId=null;
}
/**
* Проверка на дублирующий коммент
*/
if ($this->Comment_GetCommentUnique($oTalk->getId(),'talk',$this->oUserCurrent->getId(),$sParentId,md5($sText))) {
$this->Message_AddErrorSingle($this->Lang_Get('topic_comment_spam'),$this->Lang_Get('error'));
return;
}
/**
* Создаём коммент
*/
$oCommentNew=new CommentEntity_Comment();
$oCommentNew->setTargetId($oTalk->getId());
$oCommentNew->setTargetType('talk');
$oCommentNew->setUserId($this->oUserCurrent->getId());
$oCommentNew->setText($sText);
$oCommentNew->setDate(date("Y-m-d H:i:s"));
$oCommentNew->setUserIp(func_getIp());
$oCommentNew->setPid($sParentId);
$oCommentNew->setTextHash(md5($sText));
/**
* Добавляем коммент
*/
if ($this->Comment_AddComment($oCommentNew)) {
$this->Viewer_AssingAjax('sCommentId',$oCommentNew->getId());
$oTalk->setDateLast(date("Y-m-d H:i:s"));
$oTalk->setCountComment($oTalk->getCountComment()+1);
$this->Talk_UpdateTalk($oTalk);
/**
* Отсылаем уведомления всем адресатам
*/
$aUsersTalk=$this->Talk_GetUsersTalk($oTalk->getId());
foreach ($aUsersTalk as $oUserTalk) {
if ($oUserTalk->getId()!=$oCommentNew->getUserId()) {
$this->Notify_SendTalkCommentNew($oUserTalk,$this->oUserCurrent,$oTalk,$oCommentNew);
}
}
/**
* Увеличиваем число новых комментов
*/
$this->Talk_increaseCountCommentNew($oTalk->getId(),$oCommentNew->getUserId());
} else {
$this->Message_AddErrorSingle($this->Lang_Get('system_error'),$this->Lang_Get('error'));
}
}
public function EventShutdown()
{
if (!$this->oUserCurrent) {
return ;
}
$iCountTalkFavourite=$this->Talk_GetCountTalksFavouriteByUserId($this->oUserCurrent->getId());
$this->Viewer_Assign('iCountTalkFavourite',$iCountTalkFavourite);
}
}
?>