310 行
8.8 KiB
PHP
310 行
8.8 KiB
PHP
<?php
|
|
// 引入数据库模块和用户模块
|
|
require_once __DIR__ . '/../db.php';
|
|
require_once __DIR__ . '/user.php';
|
|
|
|
// 创建群组
|
|
function createGroup($creatorId, $groupName, $memberIds = []) {
|
|
$db = Database::getInstance();
|
|
|
|
// 检查用户邮箱是否已验证
|
|
if (!isEmailVerified($creatorId)) {
|
|
return false; // 邮箱未验证,不能创建群组
|
|
}
|
|
|
|
// 创建新群组
|
|
$newGroup = [
|
|
'id' => generateId(),
|
|
'group_id' => 'G' . strtoupper(substr(md5(generateId()), 0, 8)), // 生成群号
|
|
'name' => $groupName,
|
|
'creator_id' => $creatorId,
|
|
'created_at' => getCurrentTimestamp(),
|
|
'avatar' => '' // 默认群头像
|
|
];
|
|
|
|
// 插入新群组
|
|
$sql = "INSERT INTO groups (id, group_id, name, creator_id, created_at, avatar)
|
|
VALUES (:id, :group_id, :name, :creator_id, :created_at, :avatar)";
|
|
|
|
$db->execute($sql, [
|
|
'id' => $newGroup['id'],
|
|
'group_id' => $newGroup['group_id'],
|
|
'name' => $newGroup['name'],
|
|
'creator_id' => $newGroup['creator_id'],
|
|
'created_at' => $newGroup['created_at'],
|
|
'avatar' => $newGroup['avatar']
|
|
]);
|
|
|
|
// 添加创建者为群成员
|
|
$db->execute("INSERT INTO group_members (group_id, user_id, role, joined_at)
|
|
VALUES (:group_id, :user_id, :role, :joined_at)", [
|
|
'group_id' => $newGroup['id'],
|
|
'user_id' => $creatorId,
|
|
'role' => 'admin',
|
|
'joined_at' => getCurrentTimestamp()
|
|
]);
|
|
|
|
// 添加其他成员
|
|
foreach ($memberIds as $memberId) {
|
|
if ($memberId !== $creatorId) {
|
|
$db->execute("INSERT INTO group_members (group_id, user_id, role, joined_at)
|
|
VALUES (:group_id, :user_id, :role, :joined_at)", [
|
|
'group_id' => $newGroup['id'],
|
|
'user_id' => $memberId,
|
|
'role' => 'member',
|
|
'joined_at' => getCurrentTimestamp()
|
|
]);
|
|
}
|
|
}
|
|
|
|
return $newGroup;
|
|
}
|
|
|
|
// 获取用户加入的所有群组
|
|
function getUserGroups($userId) {
|
|
$db = Database::getInstance();
|
|
$userGroups = [];
|
|
|
|
// 筛选用户加入的群组
|
|
$result = $db->query("SELECT g.*, gm.role FROM groups g
|
|
JOIN group_members gm ON g.id = gm.group_id
|
|
WHERE gm.user_id = :userId", ['userId' => $userId]);
|
|
|
|
foreach ($result as $group) {
|
|
// 为每个群组添加成员信息
|
|
$members = getGroupMembers($group['id']);
|
|
$group['members'] = $members;
|
|
// 调试:记录群组成员数量
|
|
error_log("群组ID: {$group['id']}, 成员数量: " . count($members));
|
|
$userGroups[] = $group;
|
|
}
|
|
|
|
return $userGroups;
|
|
}
|
|
|
|
// 获取群组成员
|
|
function getGroupMembers($groupId) {
|
|
$db = Database::getInstance();
|
|
$members = [];
|
|
|
|
// 筛选群组成员
|
|
$result = $db->query("SELECT * FROM group_members WHERE group_id = :groupId", ['groupId' => $groupId]);
|
|
|
|
if (empty($result)) {
|
|
return [];
|
|
}
|
|
|
|
// 收集所有用户ID
|
|
$userIds = [];
|
|
foreach ($result as $member) {
|
|
$userIds[] = $member['user_id'];
|
|
}
|
|
|
|
// 批量获取用户信息
|
|
$userIds = array_unique($userIds);
|
|
$placeholders = [];
|
|
$params = [];
|
|
foreach ($userIds as $index => $id) {
|
|
$key = 'id' . $index;
|
|
$placeholders[] = ':' . $key;
|
|
$params[$key] = $id;
|
|
}
|
|
|
|
$sql = "SELECT * FROM users WHERE id IN (" . implode(',', $placeholders) . ")";
|
|
$users = $db->query($sql, $params);
|
|
|
|
// 构建用户ID到信息的映射
|
|
$usersMap = [];
|
|
foreach ($users as $user) {
|
|
$usersMap[$user['id']] = $user;
|
|
}
|
|
|
|
// 构建成员列表
|
|
foreach ($result as $member) {
|
|
if (isset($usersMap[$member['user_id']])) {
|
|
$user = $usersMap[$member['user_id']];
|
|
$memberInfo = [
|
|
'id' => $user['id'],
|
|
'username' => $user['username'],
|
|
'role' => $member['role'],
|
|
'joined_at' => $member['joined_at'],
|
|
'avatar' => isset($user['avatar']) ? $user['avatar'] : '',
|
|
'muted' => false // 默认不禁言
|
|
];
|
|
$members[] = $memberInfo;
|
|
}
|
|
}
|
|
|
|
return $members;
|
|
}
|
|
|
|
// 添加群成员
|
|
function addGroupMember($groupId, $userId, $role = 'member') {
|
|
$db = Database::getInstance();
|
|
|
|
// 检查用户是否已经是群成员
|
|
$result = $db->query("SELECT * FROM group_members WHERE group_id = :groupId AND user_id = :userId", [
|
|
'groupId' => $groupId,
|
|
'userId' => $userId
|
|
]);
|
|
|
|
if (!empty($result)) {
|
|
return false; // 已经是群成员
|
|
}
|
|
|
|
// 添加新成员
|
|
$sql = "INSERT INTO group_members (group_id, user_id, role, joined_at)
|
|
VALUES (:group_id, :user_id, :role, :joined_at)";
|
|
|
|
return $db->execute($sql, [
|
|
'group_id' => $groupId,
|
|
'user_id' => $userId,
|
|
'role' => $role,
|
|
'joined_at' => getCurrentTimestamp()
|
|
]);
|
|
}
|
|
|
|
// 移除群成员
|
|
function removeGroupMember($groupId, $userId) {
|
|
$db = Database::getInstance();
|
|
|
|
$sql = "DELETE FROM group_members WHERE group_id = :groupId AND user_id = :userId";
|
|
|
|
return $db->execute($sql, [
|
|
'groupId' => $groupId,
|
|
'userId' => $userId
|
|
]);
|
|
}
|
|
|
|
// 更新群组信息
|
|
function updateGroup($groupId, $groupData) {
|
|
$db = Database::getInstance();
|
|
|
|
// 构建更新语句
|
|
$setClause = [];
|
|
$params = ['groupId' => $groupId];
|
|
|
|
foreach ($groupData as $key => $value) {
|
|
$setClause[] = "$key = :$key";
|
|
$params[$key] = $value;
|
|
}
|
|
|
|
if (empty($setClause)) {
|
|
return false;
|
|
}
|
|
|
|
$setClause = implode(', ', $setClause);
|
|
$sql = "UPDATE groups SET $setClause WHERE id = :groupId";
|
|
|
|
return $db->execute($sql, $params);
|
|
}
|
|
|
|
// 删除群组
|
|
function deleteGroup($groupId) {
|
|
$db = Database::getInstance();
|
|
|
|
// 删除群组
|
|
$db->execute("DELETE FROM groups WHERE id = :groupId", ['groupId' => $groupId]);
|
|
|
|
// 移除群组成员
|
|
return $db->execute("DELETE FROM group_members WHERE group_id = :groupId", ['groupId' => $groupId]);
|
|
}
|
|
|
|
// 获取群组信息
|
|
function getGroupById($groupId) {
|
|
$db = Database::getInstance();
|
|
|
|
$result = $db->query("SELECT * FROM groups WHERE id = :groupId", ['groupId' => $groupId]);
|
|
|
|
return !empty($result) ? $result[0] : null;
|
|
}
|
|
|
|
// 检查用户是否是群成员
|
|
function isGroupMember($groupId, $userId) {
|
|
$db = Database::getInstance();
|
|
|
|
$result = $db->query("SELECT * FROM group_members WHERE group_id = :groupId AND user_id = :userId", [
|
|
'groupId' => $groupId,
|
|
'userId' => $userId
|
|
]);
|
|
|
|
return !empty($result);
|
|
}
|
|
|
|
// 获取用户在群组中的角色
|
|
function getUserGroupRole($groupId, $userId) {
|
|
$db = Database::getInstance();
|
|
|
|
$result = $db->query("SELECT role FROM group_members WHERE group_id = :groupId AND user_id = :userId", [
|
|
'groupId' => $groupId,
|
|
'userId' => $userId
|
|
]);
|
|
|
|
return !empty($result) ? $result[0]['role'] : null;
|
|
}
|
|
|
|
// 通过群号获取群组信息
|
|
function getGroupByGroupId($group_id) {
|
|
$db = Database::getInstance();
|
|
|
|
$result = $db->query("SELECT * FROM groups WHERE group_id = :group_id", ['group_id' => $group_id]);
|
|
|
|
return !empty($result) ? $result[0] : null;
|
|
}
|
|
|
|
// 通过群号加入群组
|
|
function joinGroupByGroupId($group_id, $userId) {
|
|
// 检查用户邮箱是否已验证
|
|
if (!isEmailVerified($userId)) {
|
|
return false; // 邮箱未验证,不能加入群组
|
|
}
|
|
|
|
// 查找群组
|
|
$group = getGroupByGroupId($group_id);
|
|
if (!$group) {
|
|
return false; // 群组不存在
|
|
}
|
|
|
|
// 检查用户是否已经是群成员
|
|
if (isGroupMember($group['id'], $userId)) {
|
|
return false; // 已经是群成员
|
|
}
|
|
|
|
// 添加用户为群成员
|
|
return addGroupMember($group['id'], $userId);
|
|
}
|
|
|
|
// 退出群组
|
|
function leaveGroup($groupId, $userId) {
|
|
// 检查用户是否是群成员
|
|
if (!isGroupMember($groupId, $userId)) {
|
|
return false; // 不是群成员
|
|
}
|
|
|
|
// 检查用户是否是管理员
|
|
$userRole = getUserGroupRole($groupId, $userId);
|
|
if ($userRole === 'admin') {
|
|
return false; // 管理员不能退出群组
|
|
}
|
|
|
|
// 移除用户作为群成员
|
|
return removeGroupMember($groupId, $userId);
|
|
}
|
|
|
|
// 禁言/解禁用户
|
|
function muteUser($groupId, $userId, $muted) {
|
|
// 检查用户是否是群成员
|
|
if (!isGroupMember($groupId, $userId)) {
|
|
return false; // 不是群成员
|
|
}
|
|
|
|
// 目前暂不支持禁言功能,返回false
|
|
return false;
|
|
}
|
|
|
|
// 检查用户是否在群组中被禁言
|
|
function isUserMuted($groupId, $userId) {
|
|
// 目前暂不支持禁言功能,返回false
|
|
return false;
|
|
}
|
|
?>
|