301 行
9.9 KiB
PHP
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
|
|
]);
|
|
}
|
|
?>
|