GIF89a;
| Direktori : /home/serb/www/livechat/php/controller/ |
| Current File : /home/serb/www/livechat/php/controller/MessageController.php |
<?php
class MessageController extends Controller
{
// Get new messages for the logged-in guest
public function getNewAction()
{
$userId = $this->get('guest')->getId();
$messages = null;
if($userId)
{
$db = $this->get('db');
$messages = MessageModel::repo()->findBy(array(
'to_id' => $userId, 'is_new' => 'y',
'datetime' => array('>=', date('Y-m-d H:i:s', time() - MessageModel::NEW_TALK_TIME_DELAY))
));
}
return $this->json($messages ? $messages : array());
}
// Confirm that the given messages were received by the guest
public function markMessagesReadAction()
{
$userId = $this->get('guest')->getId();
if($userId)
{
$request = $this->get('request');
$firstId = $request->postVar('firstId');
$lastId = $request->postVar('lastId');
// Mark messages as read
MessageModel::repo()->archiveMessagesBy($userId, $firstId, $lastId);
return $this->json(array('success' => true));
}
return $this->json(array('success' => false));
}
// Get last messages for the logged-in guest
public function getLastAction()
{
$guest = $this->get('guest');
$guestId = $guest->getId();
if(!$guestId) return $this->json(array('success' => false));
$lastMsgId = $this->get('request')->postVar('lastMsgId');
$query = array('datetime' => array('>=', date('Y-m-d H:i:s', time() - MessageModel::LAST_MESSAGES_TIME_DELAY)));
if(!empty($lastMsgId))
{
$query['id'] = array('<', $lastMsgId);
}
$messages = MessageModel::repo()->findBy($query);
// Filter messages for the talk
$result = array();
if(!empty($messages))
{
foreach($messages as $message)
{
if($message->from_id == $guest->getId() || $message->to_id == $guest->getId()) $result[] = $message;
}
}
return $this->json(array('success' => true, 'messages' => $result));
}
// Get new messages from guests
public function operatorGetNewAction()
{
$user = $this->get('user');
$messages = MessageModel::repo()->findBy(array(
'is_new' => 'y',
'datetime' => array('>=', date('Y-m-d H:i:s', time() - MessageModel::NEW_TALK_TIME_DELAY))
));
// Filter messages from guests
$result = array();
if(!empty($messages))
{
foreach($messages as $message)
{
if($message->to_user_info == MessageModel::USER_INFO_ALL || $message->to_id == $user->getId())
{
$result[] = $message;
}
}
}
// Mark any outdated messages as read
MessageModel::repo()->archiveOutdatedMessages();
return $this->json(array('success' => true, 'messages' => $result));
}
// Get last messages between operator and a given guest
public function operatorGuestGetLastAction()
{
$operator = $this->get('user');
$request = $this->get('request');
$guestId = $request->postVar('guestId');
$lastMsgId = $request->postVar('lastMsgId');
$query = array('datetime' => array('>=', date('Y-m-d H:i:s', time() - MessageModel::LAST_MESSAGES_TIME_DELAY)));
if(!empty($lastMsgId))
{
$query['id'] = array('<', $lastMsgId);
}
$messages = MessageModel::repo()->findBy($query);
// Filter messages for the talk
$result = array();
if(!empty($messages))
{
foreach($messages as $message)
{
if(
($message->from_id == $operator->getId() && $message->to_id == $guestId) ||
($message->to_id == $operator->getId() && $message->from_id == $guestId)
)
{
$result[] = $message;
}
}
}
return $this->json(array('success' => true, 'messages' => $result));
}
// Send message globally (only for guests)
public function broadcastAction()
{
$request = $this->get('request');
$validators = $this->get('model_validation');
// Get the input
$from = $this->get('guest')->getId();
$body = $request->postVar('body');
$to = -1; // Special value used for broadcasting
$talkId = 0;
// Validate the input
$errors = $validators->validateMessage(array(
'from' => $from,
'to' => $to,
'body' => $body
));
if(count($errors) === 0)
{
// Get the users data (to_user_info is initially set to broadcast info)
$fromUser = UserModel::repo()->find($from);
if(empty($fromUser))
{
return $this->json(array('success' => false));
}
// Create the message
$msg = new MessageModel(array(
'from_id' => $from,
'to_id' => $to,
'body' => $body,
'talk_id' => $talkId,
'from_user_info' => $fromUser->getData()
));
$msg->save();
// Return a successful response
return $this->json(array('success' => true, 'talkId' => $msg->talk_id));
}
// Return an error response
return $this->json(array('success' => false, 'errors' => $errors));
}
// Send message from the logged-in user/guest to another one
public function sendAction()
{
$request = $this->get('request');
$validators = $this->get('model_validation');
// Get the input
$from = $this->get('user')->getId();
$to = $request->postVar('to');
$body = $request->postVar('body');
$talkId = 0;
// Validate the input
$errors = $validators->validateMessage(array(
'from' => $from,
'to' => $to,
'body' => $body
));
if(count($errors) === 0)
{
// Get the users data (to_user_info is initially set to broadcast info)
$fromUser = UserModel::repo()->find($from);
$toUser = UserModel::repo()->find($to);
if(empty($fromUser) || empty($toUser))
{
return $this->json(array('success' => false));
}
// Create the message
$msg = new MessageModel(array(
'from_id' => $from,
'to_id' => $to,
'body' => $body,
'talk_id' => $talkId,
'from_user_info' => $fromUser->getData(),
'to_user_info' => $toUser->getData()
));
$msg->save();
// Return a successful response
return $this->json(array('success' => true, 'to' => $to, 'message' => $msg));
}
// Return an error response
return $this->json(array('success' => false, 'errors' => $errors));
}
// Get logged-in user messages history
public function getHistoryAction()
{
$userId = $this->get('user')->getId();
$messages = null;
if($userId)
{
$messages = MessageModel::repo()->findBy(array('to_id' => $userId, 'from_id' => $userId), 'OR');
}
return $this->json($messages ? $messages : array());
}
// Get history of the given user
public function getUserHistoryAction()
{
$request = $this->get('request');
$userId = $request->postVar('id');
$messages = MessageModel::repo()->findBy(array('to_id' => $userId, 'from_id' => $userId), 'OR');
return $this->json($messages ? $messages : array());
}
// Search through history
public function queryHistoryAction()
{
$request = $this->get('request');
$queryData = $request->postVar('query', false);
$query = json_decode($queryData, true);
// Handle date filtering
$fromDate = !empty($query['fromDate']) ? new DateTime($query['fromDate']) : new DateTime('01/01/1900');
$toDate = !empty($query['toDate']) ? new DateTime($query['toDate']) : new DateTime('+ 100 years');
$fromDate = $fromDate->format('Y-m-d H:i:s');
$toDate = $toDate->format('Y-m-d H:i:s');
unset($query['fromDate']);
unset($query['toDate']);
$query['datetime'] = array('BETWEEN', $fromDate, $toDate);
$results = MessageModel::repo()->queryHistory($query);
return $this->json($results ? $results : array());
}
// Clear history
public function clearHistoryAction()
{
$request = $this->get('request');
// Force POST requests
if(!$request->isPost()) return $this->json(array('success' => false));
// Clear the history
$success = MessageModel::repo()->clearHistory();
return $this->json(array('success' => $success));
}
}
?>