380 lines
14 KiB
PHP
380 lines
14 KiB
PHP
<?php
|
|
|
|
class MessageController extends Controller
|
|
{
|
|
public function __construct()
|
|
{
|
|
parent::__construct();
|
|
|
|
// Require login for all message features
|
|
Auth::checkAuthentication();
|
|
}
|
|
|
|
/**
|
|
* Check if the request is an AJAX request
|
|
*/
|
|
private function isAjaxRequest()
|
|
{
|
|
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
|
|
strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
|
|
}
|
|
|
|
/**
|
|
* Send a message to a specific user via URL parameters
|
|
* URL format: message/send/{receiver_id}/{subject}/{message}
|
|
*/
|
|
public function send()
|
|
{
|
|
// Handle POST request
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$receiver_id = isset($_POST['receiver_id']) ? $_POST['receiver_id'] : null;
|
|
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'No Subject';
|
|
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
|
|
|
if (!$receiver_id || !$message) {
|
|
// Return JSON for AJAX requests
|
|
if ($this->isAjaxRequest()) {
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => false, 'message' => 'Receiver and message are required']);
|
|
return;
|
|
}
|
|
|
|
Session::add('feedback_negative', 'Receiver and message are required');
|
|
Redirect::to('message');
|
|
return;
|
|
}
|
|
|
|
// Send the message
|
|
$sender_id = Session::get('user_id');
|
|
$success = MessageModel::sendToUser($sender_id, $receiver_id, $subject, $message);
|
|
|
|
// Return JSON for AJAX requests
|
|
if ($this->isAjaxRequest()) {
|
|
header('Content-Type: application/json');
|
|
if ($success) {
|
|
echo json_encode(['success' => true, 'message' => 'Message sent successfully']);
|
|
} else {
|
|
echo json_encode(['success' => false, 'message' => 'Failed to send message']);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Regular request handling
|
|
if ($success) {
|
|
Session::add('feedback_positive', 'Message sent successfully');
|
|
} else {
|
|
Session::add('feedback_negative', 'Failed to send message');
|
|
}
|
|
|
|
// If coming from conversation view, return there
|
|
if (isset($_SERVER['HTTP_REFERER']) && strpos($_SERVER['HTTP_REFERER'], 'conversation') !== false) {
|
|
Redirect::to('message/conversation/' . $receiver_id);
|
|
} else {
|
|
Redirect::to('message');
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Handle GET request
|
|
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
|
$receiver_id = isset($url_parts[2]) ? $url_parts[2] : null;
|
|
$subject = isset($url_parts[3]) ? urldecode($url_parts[3]) : null;
|
|
$message = isset($url_parts[4]) ? urldecode($url_parts[4]) : null;
|
|
|
|
if (!$receiver_id || !$subject || !$message) {
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => false, 'message' => 'Missing parameters. Use: message/send/{receiver_id}/{subject}/{message}']);
|
|
return;
|
|
}
|
|
|
|
// Verify receiver exists
|
|
$receiver = UserModel::getPublicProfileOfUser($receiver_id);
|
|
if (!$receiver) {
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => false, 'message' => 'Receiver not found']);
|
|
return;
|
|
}
|
|
|
|
// Send the message
|
|
$sender_id = Session::get('user_id');
|
|
$success = MessageModel::sendToUser($sender_id, $receiver_id, $subject, $message);
|
|
|
|
header('Content-Type: application/json');
|
|
if ($success) {
|
|
echo json_encode(['success' => true, 'message' => 'Message sent successfully']);
|
|
} else {
|
|
echo json_encode(['success' => false, 'message' => 'Failed to send message']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Send a message to a group via URL parameters
|
|
* URL format: message/sendgroup/{group_type}/{subject}/{message}
|
|
* group_type can be: admins, moderators, all_users
|
|
*/
|
|
public function sendgroup()
|
|
{
|
|
// Handle POST request
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$group_type = isset($_POST['group_type']) ? $_POST['group_type'] : null;
|
|
$subject = isset($_POST['subject']) ? $_POST['subject'] : 'No Subject';
|
|
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
|
|
|
if (!$group_type || !$message) {
|
|
Session::add('feedback_negative', 'Group type and message are required');
|
|
Redirect::to('message');
|
|
return;
|
|
}
|
|
|
|
// Validate group type
|
|
if (!in_array($group_type, ['admins', 'moderators', 'all_users'])) {
|
|
Session::add('feedback_negative', 'Invalid group type');
|
|
Redirect::to('message');
|
|
return;
|
|
}
|
|
|
|
// Send the message
|
|
$sender_id = Session::get('user_id');
|
|
$success = MessageModel::sendToGroup($sender_id, $group_type, $subject, $message);
|
|
|
|
if ($success) {
|
|
Session::add('feedback_positive', 'Message sent to group successfully');
|
|
} else {
|
|
Session::add('feedback_negative', 'Failed to send message to group');
|
|
}
|
|
|
|
Redirect::to('message');
|
|
return;
|
|
}
|
|
|
|
// Handle GET request
|
|
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
|
$group_type = isset($url_parts[2]) ? $url_parts[2] : null;
|
|
$subject = isset($url_parts[3]) ? urldecode($url_parts[3]) : null;
|
|
$message = isset($url_parts[4]) ? urldecode($url_parts[4]) : null;
|
|
|
|
if (!$group_type || !$subject || !$message) {
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => false, 'message' => 'Missing parameters. Use: message/sendgroup/{group_type}/{subject}/{message}']);
|
|
return;
|
|
}
|
|
|
|
// Validate group type
|
|
if (!in_array($group_type, ['admins', 'moderators', 'all_users'])) {
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => false, 'message' => 'Invalid group type. Must be: admins, moderators, or all_users']);
|
|
return;
|
|
}
|
|
|
|
// Send the message
|
|
$sender_id = Session::get('user_id');
|
|
$success = MessageModel::sendToGroup($sender_id, $group_type, $subject, $message);
|
|
|
|
header('Content-Type: application/json');
|
|
if ($success) {
|
|
echo json_encode(['success' => true, 'message' => 'Message sent to group successfully']);
|
|
} else {
|
|
echo json_encode(['success' => false, 'message' => 'Failed to send message to group']);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Handle reply to a message
|
|
*/
|
|
public function reply()
|
|
{
|
|
// Always return JSON for this endpoint
|
|
header('Content-Type: application/json');
|
|
|
|
// Start output buffering to catch any accidental output
|
|
ob_start();
|
|
|
|
try {
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
echo json_encode(['success' => false, 'message' => 'Invalid request method']);
|
|
exit();
|
|
}
|
|
|
|
$receiver_id = isset($_POST['receiver_id']) ? $_POST['receiver_id'] : null;
|
|
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
|
|
|
if (!$receiver_id || !$message) {
|
|
echo json_encode(['success' => false, 'message' => 'Receiver and message are required']);
|
|
exit();
|
|
}
|
|
|
|
$sender_id = Session::get('user_id');
|
|
if (!$sender_id) {
|
|
echo json_encode(['success' => false, 'message' => 'Not logged in']);
|
|
exit();
|
|
}
|
|
|
|
// Send the message (using sendToUser without subject)
|
|
$success = MessageModel::sendToUser($sender_id, $receiver_id, 'Re: Message', $message);
|
|
|
|
if ($success) {
|
|
echo json_encode(['success' => true, 'message' => 'Reply sent successfully']);
|
|
} else {
|
|
echo json_encode(['success' => false, 'message' => 'Failed to send reply']);
|
|
}
|
|
} catch (Exception $e) {
|
|
// Catch any PHP errors
|
|
echo json_encode(['success' => false, 'message' => 'Server error: ' . $e->getMessage()]);
|
|
}
|
|
|
|
// Clean any output buffer and exit
|
|
ob_end_clean();
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* Show global chat interface
|
|
*/
|
|
public function global()
|
|
{
|
|
// Redirect to main messages page with global chat hash
|
|
Redirect::to('message#load-global');
|
|
}
|
|
|
|
/**
|
|
* Show the messenger interface
|
|
*/
|
|
public function index()
|
|
{
|
|
$user_id = Session::get('user_id');
|
|
|
|
// Get conversations and unread count
|
|
$conversations = MessageModel::getConversations($user_id);
|
|
$unread_count = MessageModel::getUnreadCount($user_id);
|
|
|
|
$this->View->render('message/index', array(
|
|
'conversations' => $conversations,
|
|
'unread_count' => $unread_count,
|
|
'all_users' => MessageModel::getAllUsers($user_id)
|
|
));
|
|
}
|
|
|
|
/**
|
|
* Show conversation with a specific user
|
|
*/
|
|
public function conversation()
|
|
{
|
|
$user_id = Session::get('user_id');
|
|
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
|
$other_user_id = isset($url_parts[2]) ? $url_parts[2] : null;
|
|
|
|
if (!$other_user_id) {
|
|
Redirect::to('message');
|
|
return;
|
|
}
|
|
|
|
// Get user info for the other person
|
|
$other_user = UserModel::getPublicProfileOfUser($other_user_id);
|
|
if (!$other_user) {
|
|
Redirect::to('message');
|
|
return;
|
|
}
|
|
|
|
// Redirect to main messages page with conversation hash
|
|
Redirect::to('message#load-conversation-' . $other_user_id);
|
|
}
|
|
|
|
/**
|
|
* Get conversation messages as JSON (AJAX endpoint)
|
|
*/
|
|
public function getConversationMessages()
|
|
{
|
|
$user_id = Session::get('user_id');
|
|
$url_parts = explode('/', trim($_SERVER['REQUEST_URI'], '/'));
|
|
$other_user_id = isset($url_parts[2]) ? $url_parts[2] : null;
|
|
|
|
if (!$other_user_id) {
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => false, 'message' => 'Missing user ID']);
|
|
return;
|
|
}
|
|
|
|
// Get messages
|
|
$messages = MessageModel::getMessagesWithUser($user_id, $other_user_id);
|
|
|
|
// Mark messages as read when loading the conversation
|
|
MessageModel::markAsRead($user_id, $other_user_id);
|
|
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['success' => true, 'messages' => $messages]);
|
|
}
|
|
|
|
/**
|
|
* Get global chat messages as JSON (AJAX endpoint)
|
|
*/
|
|
public function getGlobalMessages()
|
|
{
|
|
// Always return JSON for this endpoint
|
|
header('Content-Type: application/json');
|
|
|
|
$messages = MessageModel::getGlobalMessages();
|
|
echo json_encode(['success' => true, 'messages' => $messages]);
|
|
|
|
// Stop any further execution
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* Send message to global chat
|
|
*/
|
|
public function sendToGlobal()
|
|
{
|
|
// Always return JSON for this endpoint
|
|
header('Content-Type: application/json');
|
|
|
|
// Start output buffering to catch any accidental output
|
|
ob_start();
|
|
|
|
try {
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
echo json_encode(['success' => false, 'message' => 'Invalid request method']);
|
|
exit();
|
|
}
|
|
|
|
$message = isset($_POST['message']) ? $_POST['message'] : null;
|
|
$sender_id = Session::get('user_id');
|
|
|
|
if (!$message) {
|
|
echo json_encode(['success' => false, 'message' => 'Message is required']);
|
|
exit();
|
|
}
|
|
|
|
if (!$sender_id) {
|
|
echo json_encode(['success' => false, 'message' => 'Not logged in']);
|
|
exit();
|
|
}
|
|
|
|
$success = MessageModel::sendToGlobal($sender_id, $message);
|
|
|
|
if ($success) {
|
|
echo json_encode(['success' => true, 'message' => 'Message sent to global chat']);
|
|
} else {
|
|
echo json_encode(['success' => false, 'message' => 'Failed to send message']);
|
|
}
|
|
} catch (Exception $e) {
|
|
// Catch any PHP errors
|
|
echo json_encode(['success' => false, 'message' => 'Server error: ' . $e->getMessage()]);
|
|
}
|
|
|
|
// Clean any output buffer and exit
|
|
ob_end_clean();
|
|
exit();
|
|
}
|
|
|
|
/**
|
|
* Get unread count as JSON
|
|
*/
|
|
public function unreadcount()
|
|
{
|
|
$user_id = Session::get('user_id');
|
|
$unread_count = MessageModel::getUnreadCount($user_id);
|
|
|
|
header('Content-Type: application/json');
|
|
echo json_encode(['unread_count' => $unread_count]);
|
|
}
|
|
} |