文件
2026-06-04 22:42:27 +08:00

301 行
9.9 KiB
PHP

<?php
// 引入数据库模块和用户模块
require_once __DIR__ . '/../db.php';
require_once __DIR__ . '/user.php';
// 格式化时间(好友模块)
function friendFormatTime($timestamp) {
return date('H:i', $timestamp);
}
// 添加好友(发送好友请求)
function addFriend($userId, $friendUsername) {
$db = Database::getInstance();
// 检查用户邮箱是否已验证
if (!isEmailVerified($userId)) {
return false; // 邮箱未验证,不能发送好友请求
}
// 获取好友用户
$friendUser = getUserByUsername($friendUsername);
if (!$friendUser) {
return false;
}
// 不能添加自己为好友
if ($friendUser['id'] === $userId) {
return false;
}
// 检查是否已经是好友或有未处理的请求
$result = $db->query("SELECT * FROM friends WHERE (user_id = :user_id AND friend_id = :friend_id) OR (user_id = :friend_id2 AND friend_id = :user_id2)", [
'user_id' => $userId,
'friend_id' => $friendUser['id'],
'friend_id2' => $friendUser['id'],
'user_id2' => $userId
]);
if (!empty($result)) {
return true; // 已经是好友或有未处理的请求
}
// 创建好友请求
$newFriendship = [
'id' => generateId(),
'user_id' => $userId, // 发送请求的用户
'friend_id' => $friendUser['id'], // 接收请求的用户
'created_at' => getCurrentTimestamp(),
'status' => 'pending'
];
// 插入好友关系
$sql = "INSERT INTO friends (id, user_id, friend_id, created_at, status)
VALUES (:id, :user_id, :friend_id, :created_at, :status)";
$db->execute($sql, $newFriendship);
return true;
}
// 接受好友请求
function acceptFriendRequest($requestId) {
$db = Database::getInstance();
$sql = "UPDATE friends SET status = 'accepted' WHERE id = :id AND status = 'pending'";
return $db->execute($sql, ['id' => $requestId]);
}
// 拒绝好友请求
function rejectFriendRequest($requestId) {
$db = Database::getInstance();
$sql = "DELETE FROM friends WHERE id = :id";
return $db->execute($sql, ['id' => $requestId]);
}
// 获取用户的好友请求列表
function getFriendRequests($userId) {
$db = Database::getInstance();
$requests = [];
$result = $db->query("SELECT * FROM friends WHERE friend_id = :userId AND status = 'pending'", ['userId' => $userId]);
foreach ($result as $friendship) {
// 获取发送请求的用户信息
$requester = getUserById($friendship['user_id']);
if ($requester) {
$requests[] = [
'id' => $friendship['id'],
'requester_id' => $friendship['user_id'],
'requester_username' => $requester['username'],
'requester_avatar' => isset($requester['avatar']) ? $requester['avatar'] : '',
'created_at' => $friendship['created_at']
];
}
}
return $requests;
}
// 获取用户的好友列表(只返回已接受的好友)
function getFriends($userId) {
$db = Database::getInstance();
$userFriends = [];
// 获取所有已接受的好友关系
$result = $db->query("SELECT * FROM friends WHERE (user_id = :userId OR friend_id = :userId) AND status = 'accepted'", ['userId' => $userId]);
foreach ($result as $friendship) {
if ($friendship['user_id'] === $userId) {
$userFriends[] = $friendship['friend_id'];
} else {
$userFriends[] = $friendship['user_id'];
}
}
if (empty($userFriends)) {
return [];
}
// 批量获取好友详细信息
$params = [];
$placeholders = [];
foreach ($userFriends as $index => $friendId) {
$key = 'id' . $index;
$placeholders[] = ':' . $key;
$params[$key] = $friendId;
}
$sql = "SELECT * FROM users WHERE id IN (" . implode(',', $placeholders) . ")";
$friendsData = $db->query($sql, $params);
// 构建好友ID到信息的映射
$friendsMap = [];
foreach ($friendsData as $friend) {
$friendsMap[$friend['id']] = $friend;
}
// 批量获取最后一条消息
$lastMessages = [];
foreach ($userFriends as $friendId) {
$msgResult = $db->query("SELECT * FROM messages WHERE (sender_id = :userId1 AND receiver_id = :userId2) OR (sender_id = :userId2 AND receiver_id = :userId1) ORDER BY timestamp DESC LIMIT 1", [
'userId1' => $userId,
'userId2' => $friendId
]);
if (!empty($msgResult)) {
$lastMessages[$friendId] = [
'content' => $msgResult[0]['content'],
'time' => friendFormatTime($msgResult[0]['timestamp'])
];
}
}
// 批量获取好友备注
$notes = [];
// 确保notes表存在
$db->query("CREATE TABLE IF NOT EXISTS notes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id TEXT NOT NULL,
target_id TEXT NOT NULL,
target_type TEXT NOT NULL,
note TEXT DEFAULT '',
created_at INTEGER NOT NULL,
updated_at INTEGER NOT NULL,
UNIQUE(user_id, target_id, target_type)
)");
// 使用单个查询批量获取所有备注
if (!empty($userFriends)) {
// 获取当前用户的所有好友备注
$noteResults = $db->query("SELECT target_id, note FROM notes WHERE user_id = :user_id AND target_type = 'friend'", [
'user_id' => $userId
]);
// 调试:记录查询结果
error_log("=== 备注查询调试 ===");
error_log("当前用户ID: " . $userId);
error_log("好友列表: " . print_r($userFriends, true));
error_log("备注查询结果: " . print_r($noteResults, true));
if (!empty($noteResults)) {
foreach ($noteResults as $noteRow) {
if (!empty($noteRow['note'])) {
$notes[$noteRow['target_id']] = $noteRow['note'];
}
}
}
// 调试:记录最终备注数组
error_log("最终备注数组: " . print_r($notes, true));
}
// 构建好友列表
$friendsList = [];
foreach ($userFriends as $friendId) {
if (isset($friendsMap[$friendId])) {
$friend = $friendsMap[$friendId];
$friendsList[] = [
'id' => $friend['id'],
'username' => $friend['username'],
'note' => $notes[$friendId] ?? '',
'avatar' => isset($friend['avatar']) ? $friend['avatar'] : '',
'online' => isset($friend['online']) ? ($friend['online'] === 1) : false,
'lastMessage' => $lastMessages[$friendId]['content'] ?? '',
'lastMessageTime' => $lastMessages[$friendId]['time'] ?? ''
];
}
}
// 添加系统账户(Parlz官方)
$systemAccountId = 100000;
$systemAccountName = 'Parlz官方';
// 检查系统账户是否已经在好友列表中
$systemAccountExists = false;
foreach ($friendsList as $friend) {
if ($friend['id'] === $systemAccountId) {
$systemAccountExists = true;
break;
}
}
if (!$systemAccountExists) {
// 获取与系统账户的最后一条消息
$systemLastMessage = [];
$msgResult = $db->query("SELECT * FROM messages WHERE (sender_id = :userId1 AND receiver_id = :userId2) OR (sender_id = :userId2 AND receiver_id = :userId1) ORDER BY timestamp DESC LIMIT 1", [
'userId1' => $userId,
'userId2' => $systemAccountId
]);
if (!empty($msgResult)) {
$systemLastMessage = [
'content' => $msgResult[0]['content'],
'time' => friendFormatTime($msgResult[0]['timestamp'])
];
}
// 添加系统账户到好友列表
$friendsList[] = [
'id' => $systemAccountId,
'username' => $systemAccountName,
'avatar' => '', // 系统账户没有头像,前端会显示机器人图标
'online' => true, // 系统账户始终显示为在线
'lastMessage' => $systemLastMessage['content'] ?? '',
'lastMessageTime' => $systemLastMessage['time'] ?? ''
];
}
return $friendsList;
}
// 检查是否是好友(只检查已接受的关系)
function isFriend($userId, $friendId) {
$db = Database::getInstance();
$result = $db->query("SELECT * FROM friends WHERE ((user_id = :userId AND friend_id = :friendId) OR (user_id = :friendId2 AND friend_id = :userId2)) AND status = 'accepted'", [
'userId' => $userId,
'friendId' => $friendId,
'friendId2' => $friendId,
'userId2' => $userId
]);
return !empty($result);
}
// 获取两个用户之间的最后一条消息
function getLastMessage($userId1, $userId2) {
$db = Database::getInstance();
$result = $db->query("SELECT * FROM messages WHERE (sender_id = :userId1 AND receiver_id = :userId2) OR (sender_id = :userId2 AND receiver_id = :userId1) ORDER BY timestamp DESC LIMIT 1", [
'userId1' => $userId1,
'userId2' => $userId2
]);
// 如果没有消息,返回空数组
if (empty($result)) {
return [];
}
// 返回最后一条消息
return [
'content' => $result[0]['content'],
'time' => friendFormatTime($result[0]['timestamp'])
];
}
// 删除好友
function removeFriend($userId, $friendId) {
$db = Database::getInstance();
$sql = "DELETE FROM friends WHERE (user_id = :userId AND friend_id = :friendId) OR (user_id = :friendId2 AND friend_id = :userId2)";
return $db->execute($sql, [
'userId' => $userId,
'friendId' => $friendId,
'friendId2' => $friendId,
'userId2' => $userId
]);
}
?>