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]); } }