function getConversation($userId, $otherUserId) { $messages = readDB(DATA_PATH . '/direct_messages.json'); $conversationMessages = []; foreach ($messages as $message) { if (($message['sender_id'] === $userId && $message['receiver_id'] === $otherUserId) || ($message['sender_id'] === $otherUserId && $message['receiver_id'] === $userId)) { $conversationMessages[] = $message; } } // Sort by time usort($conversationMessages, fn($a, $b) => $a['created_at'] <=> $b['created_at']); return $conversationMessages; } function markAsRead($messageId, $userId) { $messages = readDB(DATA_PATH . '/direct_messages.json'); foreach ($messages as &$message) { if ($message['id'] === $messageId && $message['receiver_id'] === $userId) { $message['is_read'] = true; $message['read_at'] = time(); } } writeDB(DATA_PATH . '/direct_messages.json', $messages); } function markConversationAsRead($userId, $otherUserId) { $messages = readDB(DATA_PATH . '/direct_messages.json'); foreach ($messages as &$message) { if ($message['sender_id'] === $otherUserId && $message['receiver_id'] === $userId && !($message['is_read'] ?? false)) { $message['is_read'] = true; $message['read_at'] = time(); } } writeDB(DATA_PATH . '/direct_messages.json', $messages); } function getUnreadCount($userId) { $messages = readDB(DATA_PATH . '/direct_messages.json'); $unreadCount = 0; foreach ($messages as $message) { if ($message['receiver_id'] === $userId && !($message['is_read'] ?? false)) { $unreadCount++; } } return $unreadCount; } function deleteMessage($messageId, $userId) { $messages = readDB(DATA_PATH . '/direct_messages.json'); $messages = array_filter($messages, function($msg) use ($messageId, $userId) { return !($msg['id'] === $messageId && ($msg['sender_id'] === $userId || $msg['receiver_id'] === $userId)); }); writeDB(DATA_PATH . '/direct_messages.json', array_values($messages)); } function createNotification($userId, $type, $fromUserId, $relatedId = null) { $notifications = readDB(DATA_PATH . '/notifications.json'); $notification = [ 'id' => uniqid('notif_'), 'user_id' => $userId, 'type' => $type, // message, like, comment, follow, mention 'from_user_id' => $fromUserId, 'related_id' => $relatedId, 'is_read' => false, 'created_at' => time() ]; $notifications[] = $notification; writeDB(DATA_PATH . '/notifications.json', $notifications); return $notification; } function getUnreadNotificationCount($userId) { $notifications = getNotifications($userId, true); return count($notifications); } function initDirectMessages() { if (!file_exists(DATA_PATH . '/direct_messages.json') || filesize(DATA_PATH . '/direct_messages.json') < 2) { writeDB(DATA_PATH . '/direct_messages.json', []); } if (!file_exists(DATA_PATH . '/notifications.json') || filesize(DATA_PATH . '/notifications.json') < 2) { writeDB(DATA_PATH . '/notifications.json', []); } } function updateOnlineStatus($userId) { $statuses = readDB(DATA_PATH . '/online_status.json'); $found = false; foreach ($statuses as &$status) { if ($status['user_id'] === $userId) { $status['last_seen'] = time(); $found = true; break; } } if (!$found) { $statuses[] = [ 'user_id' => $userId, 'last_seen' => time() ]; } writeDB(DATA_PATH . '/online_status.json', $statuses); } function isUserOnline($userId) { $statuses = readDB(DATA_PATH . '/online_status.json'); foreach ($statuses as $status) { if ($status['user_id'] === $userId) { // Online if last seen within 5 minutes return (time() - $status['last_seen']) < 300; } } return false; } function getLastSeen($userId) { $statuses = readDB(DATA_PATH . '/online_status.json'); foreach ($statuses as $status) { if ($status['user_id'] === $userId) { return $status['last_seen']; } } return null; } function formatLastSeen($timestamp) { if (!$timestamp) return 'Mai visto'; $diff = time() - $timestamp; if ($diff < 60) return 'Online'; if ($diff < 3600) return floor($diff / 60) . ' min fa'; if ($diff < 86400) return floor($diff / 3600) . ' ore fa'; if ($diff < 604800) return floor($diff / 86400) . ' giorni fa'; return date('d/m/Y', $timestamp); }