From 24273db8dd0d0eba53ae8717a03ce14c9655ce7d Mon Sep 17 00:00:00 2001 From: commie Date: Mon, 13 Apr 2026 20:00:32 +0800 Subject: [PATCH] 11 --- app/api/middleware/Auth.php | 4 +- app/command/MigrateMessages.php | 872 +++++++++++++++++++++ app/command/Openim.php | 4 +- app/command/User.php | 8 +- app/controller/HookController.php | 8 +- config/openim.php | 6 + plugin/admin/app/controller/OpenimBase.php | 4 +- plugin/admin/app/middleware/Config.php | 4 +- support/OpenImSdk/Api/Auth.php | 15 +- support/OpenImSdk/Api/Conversation.php | 12 +- support/OpenImSdk/Api/Friend.php | 56 +- support/OpenImSdk/Api/Group.php | 95 +-- support/OpenImSdk/Api/Message.php | 34 +- support/OpenImSdk/Api/User.php | 88 +-- support/OpenImSdk/Core/Utils.php | 19 +- 15 files changed, 992 insertions(+), 237 deletions(-) create mode 100644 app/command/MigrateMessages.php create mode 100644 config/openim.php diff --git a/app/api/middleware/Auth.php b/app/api/middleware/Auth.php index 0b17fbf..3aba6c7 100755 --- a/app/api/middleware/Auth.php +++ b/app/api/middleware/Auth.php @@ -122,8 +122,8 @@ class Auth implements MiddlewareInterface 'config' => $config ]); $IM = new \support\OpenImSdk\Client([ - 'host' => 'http://127.0.0.1:10002', // OpenIM API地址 - 'secret' => 'n1e5a6s6m7', // OpenIM密钥 + 'host' => config('openim.server'), // OpenIM API地址 + 'secret' => config('openim.secret'), // OpenIM密钥 ]); $request->IM = $IM; $response = $next($request); diff --git a/app/command/MigrateMessages.php b/app/command/MigrateMessages.php new file mode 100644 index 0000000..3f98c19 --- /dev/null +++ b/app/command/MigrateMessages.php @@ -0,0 +1,872 @@ + ['total' => 0, 'success' => 0, 'failed' => 0], + 'groups' => ['total' => 0, 'success' => 0, 'failed' => 0], + 'members' => ['total' => 0, 'success' => 0, 'failed' => 0], + 'messages' => ['total' => 0, 'success' => 0, 'failed' => 0, 'skipped' => 0], + ]; + + protected function configure(): void + { + $this->addOption('step', 's', InputOption::VALUE_OPTIONAL, '执行步骤: users/groups/members/messages/all', 'all'); + $this->addOption('skip-users', null, InputOption::VALUE_OPTIONAL, '跳过的用户ID(逗号分隔)'); + $this->addOption('skip-groups', null, InputOption::VALUE_OPTIONAL, '跳过的群ID(逗号分隔)'); + $this->addOption('clean', null, InputOption::VALUE_NONE, '清空现有数据后再迁移'); + $this->addOption('retry', 'r', InputOption::VALUE_OPTIONAL, '失败重试次数', 3); + } + + protected function execute(InputInterface $input, OutputInterface $output): int + { + $step = $input->getOption('step'); + $skipUsers = $input->getOption('skip-users') ? explode(',', $input->getOption('skip-users')) : []; + $skipGroups = $input->getOption('skip-groups') ? explode(',', $input->getOption('skip-groups')) : []; + $clean = $input->getOption('clean'); + $retry = (int)$input->getOption('retry'); + + // 自动忽略特殊用户 + $defaultSkipUsers = ['group_bot', 'official_team', 'system','imAdmin']; + $skipUsers = array_merge($skipUsers, $defaultSkipUsers); + $this->skipUsers = array_unique($skipUsers); + $this->skipGroups = array_unique($skipGroups); + $this->retry = $retry; + + $this->log($output, "╔════════════════════════════════════════════════════════════╗"); + $this->log($output, "║ OpenIM 数据迁移工具 v2.0 ║"); + $this->log($output, "╚════════════════════════════════════════════════════════════╝"); + $this->log($output, ""); + + if ($clean) { + $this->log($output, "🗑️ 清理模式:会清空现有数据"); + } + $this->log($output, "📍 执行步骤: {$step}"); + $this->log($output, ""); + if($step == 'restore'){ + $this->restoreMongoDB($output, '/vol3/1000/code/im/admin/backup/openim_v3_groups_20260413141105.json'); + return 0; + } + $this->cleanExistingData($output,[]); + try { + $this->initConnections($output); + //return 0 ; + if ($clean) { + $this->cleanExistingData($output,[ + 'conversation', 'conversation_version', // 会话相关集合 + 'data_version', // 数据版本集合 + 'friend', 'friend_request', 'friend_version', // 好友关系相关集合 + 'group', 'group_join_version','group_member','group_member_version','group_request', // 群组相关集合 + 'msg','seq','seq_user' // 消息和序列号相关集合 + ]); + return 0; + } + + cache('admin_token_imAdmin',null); + $steps = $step === 'all' ? [ + 'users', + 'friends', + 'groups', + //'members', + 'messages' + ] : [$step]; + + foreach ($steps as $s) { + // 备份数据 + $backupFile = $this->backupMongoDB($output, $s); + + try { + switch ($s) { + case 'users': + $this->migrateUsers($output); + break; + case 'friends': + $this->migrateFriends($output); + break; + case 'groups': + $this->migrateGroups($output); + break; + case 'members': + $this->migrateGroupMembers($output); + break; + case 'messages': + $this->migrateMessages($output); + break; + } + } catch (\Exception $e) { + // 遇到错误,回滚数据 + if (!empty($backupFile)) { + $this->restoreMongoDB($output, $backupFile); + } + throw $e; + } + } + + $this->printStats($output); + return self::SUCCESS; + } catch (\Exception $e) { + $this->log($output, "❌ 错误: " . $e->getMessage()); + //$this->log($output, $e->getTraceAsString()); + return self::FAILURE; + } + } + private function migrateUsers(OutputInterface $output): void + { + //之前残留了一部分数据,是单向好友,这里没做删除,所以数据大小和之前的不一样,用户重新删除一次就好了 + $this->log($output, ""); + $this->log($output, "═════════════════ 步骤1: 迁移用户 ═════════════════"); + $this->log($output, "清理旧的数据"); + + $this->cleanExistingData($output,[ + 'user' + ]); + $user_list = (new \app\model\Openim\User())->setOption('connection','tettt') + ->whereNotIn('user_id',$this->skipUsers) + ->field('user_id,nickname,face_url') + ->select(); + $user_list = $user_list->toArray(); + + // 1. 创建进度条(内置核心方法) + $progressBar = new ProgressBar($output, count($user_list)); + + // 可选:设置进度条样式(字符、长度等) + $progressBar->setBarCharacter('█'); + $progressBar->setEmptyBarCharacter('░'); + $progressBar->setProgressCharacter('▶'); + $progressBar->setBarWidth(400); + + // 2. 开始显示 + $progressBar->start(); + echo sprintf("\r"); + while(count($user_list) > 0){ + $step = 100; + $user = array_slice($user_list,0,$step); + $user_list = array_slice($user_list,$step); + $this->sdk->user->userRegister($user); + $progressBar->advance($step); + } + // 4. 结束进度条 + $progressBar->finish(); + + } + private function migrateFriends(OutputInterface $output): void + { + //之前残留了一部分数据,是单向好友,这里没做删除,所以数据大小和之前的不一样,用户重新删除一次就好了 + $this->log($output, ""); + $this->log($output, "═════════════════ 步骤3: 迁移好友 ═════════════════"); + $this->log($output, "清理旧的数据"); + + // $this->cleanExistingData($output,[ + // 'conversation', 'conversation_version', // 会话相关集合 + // 'data_version', // 数据版本集合 + // 'friend', 'friend_request', 'friend_version', // 好友关系相关集合 + // 'group', 'group_join_version','group_member','group_member_version','group_request', // 群组相关集合 + // 'msg','seq','seq_user' // 消息和序列号相关集合 + // ]); + $user_list = (new \app\model\Openim\User())->setOption('connection','tettt') + ->whereNotNull('user_id') + ->column('user_id'); + + // 1. 创建进度条(内置核心方法) + $progressBar = new ProgressBar($output, count($user_list)); + + // 可选:设置进度条样式(字符、长度等) + $progressBar->setBarCharacter('█'); + $progressBar->setEmptyBarCharacter('░'); + $progressBar->setProgressCharacter('▶'); + $progressBar->setBarWidth(400); + + // 2. 开始显示 + $progressBar->start(); + foreach($user_list as $userID){ + $friend_list = (new \app\model\Openim\Friend())->setOption('connection','tettt') + ->where('owner_user_id',$userID) + ->column('friend_user_id'); + if(count($friend_list)){ + while(count($friend_list)){ + $_friend_list = array_slice($friend_list, 0, 500); + $friend_list = array_slice($friend_list, 500); + $this->sdk->friend->importFriend($userID,$_friend_list); + } + } + $progressBar->advance(); + } + // 4. 结束进度条 + $progressBar->finish(); + + } + private function migrateGroups(OutputInterface $output): void + { + $this->log($output, ""); + $this->log($output, "═════════════════ 步骤2: 迁移群组 ═════════════════"); + $this->log($output, ""); + + $options = []; + + $groups = $this->queryOldDb('group', [], $options); + $this->stats['groups']['total'] = count($groups); + $this->log($output, "📊 找到 {$this->stats['groups']['total']} 个群组"); + + $processed = 0; + // 1. 创建进度条(内置核心方法) + $progressBar = new ProgressBar($output, count($groups)); + + // 可选:设置进度条样式(字符、长度等) + $progressBar->setBarCharacter('█'); + $progressBar->setEmptyBarCharacter('░'); + $progressBar->setProgressCharacter('▶'); + $progressBar->setBarWidth(400); + + // 2. 开始显示 + $progressBar->start(); + foreach ($groups as $group) { + $processed++; + $groupID = (string)($group['group_id'] ?? $group['groupID'] ?? ''); + + if (empty($groupID) || in_array($groupID, $this->skipGroups)) { + $this->stats['groups']['failed']++; + continue; + } + + $ownerUserID = (string)($group['owner_user_id'] ?? $group['ownerUserID'] ?? $group['creator_user_id'] ?? $group['creatorUserID'] ?? ''); + if (empty($ownerUserID)) { + $this->stats['groups']['failed']++; + continue; + } + + $groupName = (string)($group['group_name'] ?? $group['groupName'] ?? ''); + $faceURL = (string)($group['face_url'] ?? $group['faceURL'] ?? ''); + $introduction = (string)($group['introduction'] ?? ''); + $notification = (string)($group['notification'] ?? ''); + $ex = (string)($group['ex'] ?? ''); + + // 群组设置字段 + $groupType = (int)($group['group_type'] ?? $group['groupType'] ?? 2); + $needVerification = (int)($group['need_verification'] ?? $group['needVerification'] ?? 0); + $lookMemberInfo = (int)($group['look_member_info'] ?? $group['lookMemberInfo'] ?? 0); + $applyMemberFriend = (int)($group['apply_member_friend'] ?? $group['applyMemberFriend'] ?? 0); + + $progress = sprintf("[群组 %d/%d]", $processed, $this->stats['groups']['total']); + + if ($processed % 20 == 0 || $processed == 1) { + $this->log($output, "{$progress} 处理中..."); + } + $this->log($output, "{$progress} 尝试创建群组: {$groupID}, 群主: {$ownerUserID}"); + // 管理员信息 + $adminUserIDs = (new \app\model\Openim\GroupMember())->setOption('connection','tettt') + ->where('group_id',$groupID) + ->where('role_level',60) + ->column('user_id'); + //cp($adminUserIDs ); + // 成员信息 + $memberUserIDs = (new \app\model\Openim\GroupMember())->setOption('connection','tettt') + ->where('group_id',$groupID) + ->where('role_level',20) + ->column('user_id'); + //cp($memberUserIDs ); + $memberUserIDs = array_unique($memberUserIDs); + $_memberUserIDs = array_slice($memberUserIDs, 0, 10); + $memberUserIDs = array_slice($memberUserIDs, 10); + try { + $this->sdk->group->createGroup( + $ownerUserID, + $_memberUserIDs, + $adminUserIDs, + $groupName, + $groupID, + $faceURL, + $introduction, + $notification, + $ex, + $groupType, + $needVerification, + $lookMemberInfo, + $applyMemberFriend + ); + while(count($memberUserIDs)){ + $_memberUserIDs = array_slice($memberUserIDs, 0, 10); + $memberUserIDs = array_slice($memberUserIDs, 10); + try{ + $this->sdk->group->inviteUserToGroup($groupID, $_memberUserIDs); + } catch (\Exception $e) { + $this->log($output, "{$progress} ❌ 邀请成员失败: " . $e->getMessage()); + } + } + $this->stats['groups']['success']++; + //$this->log($output, "{$progress} ✅ 创建成功"); + } catch (\Exception $e) { + $this->stats['groups']['failed']++; + if ($e->getCode() == 1202 || strpos($e->getMessage(), 'GroupIDExisted') !== false) { + $this->log($output, "{$progress} ℹ️ 群组已存在,跳过创建"); + $this->stats['groups']['success']++; + continue; + } else { + $this->log($output, "{$progress} ❌ 创建失败: " . $e->getMessage()); + } + } + $progressBar->advance(); + } + // 4. 结束进度条 + $progressBar->finish(); + } + + private function migrateGroupMembers(OutputInterface $output): void + { + $this->log($output, ""); + $this->log($output, "═════════════════ 步骤3: 迁移群成员 ═════════════════"); + $this->log($output, ""); + + $groups = $this->queryOldDb('group', [], ['projection' => ['group_id' => 1, 'groupID' => 1]]); + $groupIDs = []; + foreach ($groups as $g) { + $gid = (string)($g['group_id'] ?? $g['groupID'] ?? ''); + if (!empty($gid) && !in_array($gid, $this->skipGroups)) { + $groupIDs[] = $gid; + } + } + + $totalMembers = 0; + foreach ($groupIDs as $groupID) { + $members = $this->queryOldDb('group_member', ['group_id' => $groupID]); + $ownerUserID = null; + $adminUserIDs = []; + $memberUserIDs = []; + + foreach ($members as $member) { + $userID = (string)($member['user_id'] ?? $member['userID'] ?? ''); + if (empty($userID)) continue; + + $roleLevel = (int)($member['role_level'] ?? $member['roleLevel'] ?? 0); + if ($roleLevel == 100) { + $ownerUserID = $userID; + } elseif ($roleLevel == 60) { + $adminUserIDs[] = $userID; + } else { + $memberUserIDs[] = $userID; + } + } + + if (empty($memberUserIDs) && empty($adminUserIDs)) { + continue; + } + + $totalMembers += count($memberUserIDs); + $this->stats['members']['total'] += count($memberUserIDs); + + $progress = sprintf("[群 %s 成员 %d]", $groupID, count($memberUserIDs)); + $this->log($output, "{$progress} 处理中..."); + + // 分批邀请,每批最多50人 + $batches = array_chunk($memberUserIDs, 50); + foreach ($batches as $batch) { + if (empty($batch)) { + continue; + } + + $attempts = 0; + while ($attempts < $this->retry) { + try { + $this->log($output, "{$progress} 邀请成员: " . implode(', ', array_slice($batch, 0, 5)) . (count($batch) > 5 ? '...' : '')); + $result = $this->sdk->group->inviteUserToGroup($groupID, $ownerUserID ?? 'admin', $batch); + $this->log($output, "{$progress} API返回: " . json_encode($result, JSON_UNESCAPED_UNICODE)); + + if (isset($result['errCode']) && $result['errCode'] != 0) { + // 检查是否是重复键错误 + if (strpos($result['errMsg'] ?? '', 'duplicate key') !== false || strpos($result['errMsg'] ?? '', 'DuplicateKey') !== false) { + $this->log($output, "{$progress} ℹ️ 部分成员已存在,跳过"); + $this->stats['members']['success'] += count($batch); + } else { + $this->stats['members']['failed'] += count($batch); + $this->log($output, "{$progress} ❌ 邀请失败: " . ($result['errMsg'] ?? '未知错误')); + } + } else { + $this->stats['members']['success'] += count($batch); + $this->log($output, "{$progress} ✅ 邀请成功"); + } + break; + } catch (\Exception $e) { + $attempts++; + // 检查是否是重复键错误 + if (strpos($e->getMessage(), 'duplicate key') !== false || strpos($e->getMessage(), 'DuplicateKey') !== false) { + $this->log($output, "{$progress} ℹ️ 部分成员已存在,跳过"); + $this->stats['members']['success'] += count($batch); + break; + } elseif ($attempts >= $this->retry) { + $this->stats['members']['failed'] += count($batch); + $this->log($output, "{$progress} ❌ 邀请异常: " . $e->getMessage()); + } else { + $this->log($output, "{$progress} ⚠️ 邀请失败,第 {$attempts}/{$this->retry} 次重试..."); + usleep(100000); + } + } + } + usleep(10000); + } + } + + $this->log($output, "📊 共处理 {$totalMembers} 个群成员"); + } + + private function migrateMessages(OutputInterface $output): void + { + $this->log($output, ""); + $this->log($output, "═════════════════ 步骤4: 迁移消息 ═════════════════"); + $this->log($output, ""); + + $pipeline = [ + ['$unwind' => '$msgs'], + ['$match' => ['msgs.msg' => ['$ne' => null]]], + ['$sort' => ['msgs.msg.send_time' => 1]], + ]; + + $pipeline[] = ['$project' => ['doc_id' => 1, 'msg' => '$msgs.msg']]; + + $command = new \MongoDB\Driver\Command([ + 'aggregate' => 'msg', + 'pipeline' => $pipeline, + 'cursor' => new \stdClass + ]); + $cursor = $this->oldManager->executeCommand('tettt', $command); + + $messages = []; + foreach ($cursor as $doc) { + $messages[] = $this->bsonToArray($doc); + } + + $this->stats['messages']['total'] = count($messages); + $this->log($output, "📊 找到 {$this->stats['messages']['total']} 条消息"); + + $processed = 0; + foreach ($messages as $doc) { + $processed++; + $msg = $doc['msg'] ?? []; + + if (empty($msg)) { + $this->stats['messages']['skipped']++; + continue; + } + + $sendID = (string)($msg['send_id'] ?? $msg['sendID'] ?? ''); + $recvID = (string)($msg['recv_id'] ?? $msg['recvID'] ?? ''); + $groupID = (string)($msg['group_id'] ?? $msg['groupID'] ?? ''); + $contentType = (int)($msg['content_type'] ?? $msg['contentType'] ?? 101); + $sessionType = (int)($msg['session_type'] ?? $msg['sessionType'] ?? 1); + + if (in_array($sendID, $this->skipUsers)) { + $this->stats['messages']['skipped']++; + continue; + } + if ($sessionType == 3 && in_array($groupID, $this->skipGroups)) { + $this->stats['messages']['skipped']++; + continue; + } + + // 跳过特殊消息类型(如系统通知等) + if (in_array($contentType, [200, 201, 202, 203, 204, 205])) { + $this->stats['messages']['skipped']++; + continue; + } + + $progress = sprintf("[消息 %d/%d]", $processed, $this->stats['messages']['total']); + + if ($processed % 100 == 0 || $processed == 1) { + $this->log($output, "{$progress} 处理中..."); + } + + try { + $this->log($output, "{$progress} 发送消息: sendID={$sendID}, recvID={$recvID}, groupID={$groupID}, contentType={$contentType}, sessionType={$sessionType}"); + $result = $this->sendMessage($msg); + $this->log($output, "{$progress} API返回: " . json_encode($result, JSON_UNESCAPED_UNICODE)); + + if ($result['success'] ?? false) { + $this->stats['messages']['success']++; + if ($processed % 100 == 0) { + $this->log($output, "{$progress} ✅ 发送成功"); + } + } else { + $this->stats['messages']['failed']++; + $this->log($output, "{$progress} ❌ 发送失败: " . ($result['errMsg'] ?? '未知错误')); + // 遇到NotInGroupYetError时跳过,继续迁移其他消息 + if (strpos(($result['errMsg'] ?? ''), 'NotInGroupYetError') === false) { + // 遇到其他错误时退出 + throw new \Exception("消息发送失败: " . ($result['errMsg'] ?? '未知错误')); + } else { + $this->log($output, "{$progress} ℹ️ 跳过NotInGroupYetError错误,继续迁移"); + } + } + } catch (\Exception $e) { + $this->stats['messages']['failed']++; + $this->log($output, "{$progress} ❌ 发送异常: " . $e->getMessage()); + // 遇到NotInGroupYetError异常时跳过,继续迁移其他消息 + if (strpos($e->getMessage(), 'NotInGroupYetError') === false) { + // 遇到其他异常时退出 + throw $e; + } else { + $this->log($output, "{$progress} ℹ️ 跳过NotInGroupYetError异常,继续迁移"); + } + } + if ($this->delay > 0) { + usleep($this->delay * 1000); + } + } + } + + private function sendMessage(array $msg): array + { + $sendID = (string)($msg['send_id'] ?? $msg['sendID'] ?? ''); + $recvID = (string)($msg['recv_id'] ?? $msg['recvID'] ?? ''); + $groupID = (string)($msg['group_id'] ?? $msg['groupID'] ?? ''); + $contentType = (int)($msg['content_type'] ?? $msg['contentType'] ?? 101); + $sessionType = (int)($msg['session_type'] ?? $msg['sessionType'] ?? 1); + $sendTime = (int)($msg['send_time'] ?? $msg['sendTime'] ?? 0); + $content = $msg['content'] ?? ''; + $ex = (string)($msg['ex'] ?? ''); + + if (empty($sendID)) { + return ['success' => false, 'errMsg' => 'sendID为空']; + } + + $contentData = $this->parseContent($content, $contentType); + + // 构建消息数据 + $messageData = [ + 'content' => $contentData, + 'contentType' => $contentType, + 'sendTime' => $sendTime, + 'ex' => $ex, + 'isOnlineOnly' => false, + 'notOfflinePush' => true + ]; + + // 根据会话类型调用不同的发送方法 + if ($sessionType == 1 && !empty($recvID)) { + // 单聊 + $result = $this->sdk->message->sendSingleMessage($sendID, $recvID, $messageData); + } elseif (!empty($groupID)) { + // 群聊 + $result = $this->sdk->message->sendGroupMessage($sendID, $groupID, $messageData); + } else { + return ['success' => false, 'errMsg' => '缺少必要的参数']; + } + + return [ + 'success' => !($result['errCode'] ?? 0), + 'errMsg' => $result['errMsg'] ?? '' + ]; + } + + private function parseContent($content, int $contentType): array + { + if (is_string($content)) { + $decoded = json_decode($content, true); + if (json_last_error() === JSON_ERROR_NONE && is_array($decoded)) { + return $decoded; + } + return ['content' => $content, 'text' => $content]; + } + if (is_array($content)) { + return $content; + } + return ['content' => '', 'text' => '']; + } + + private function bsonToArray($data): array + { + if ($data instanceof \MongoDB\Model\BSONArray) { + return $data->getArrayCopy(); + } + if ($data instanceof \MongoDB\Model\BSONDocument) { + return $data->getArrayCopy(); + } + if (is_object($data)) { + return json_decode(json_encode($data), true); + } + return is_array($data) ? $data : []; + } + + private function printStats(OutputInterface $output): void + { + $this->log($output, ""); + $this->log($output, "╔════════════════════════════════════════════════════════════╗"); + $this->log($output, "║ 迁移统计报告 ║"); + $this->log($output, "╠════════════════════════════════════════════════════════════╣"); + $this->log($output, "║ 用户: 总数 {$this->stats['users']['total']}, 成功 {$this->stats['users']['success']}, 失败 {$this->stats['users']['failed']}"); + $this->log($output, "║ 群组: 总数 {$this->stats['groups']['total']}, 成功 {$this->stats['groups']['success']}, 失败 {$this->stats['groups']['failed']}"); + $this->log($output, "║ 成员: 总数 {$this->stats['members']['total']}, 成功 {$this->stats['members']['success']}, 失败 {$this->stats['members']['failed']}"); + $this->log($output, "║ 消息: 总数 {$this->stats['messages']['total']}, 成功 {$this->stats['messages']['success']}, 失败 {$this->stats['messages']['failed']}, 跳过 {$this->stats['messages']['skipped']}"); + $this->log($output, "╚════════════════════════════════════════════════════════════╝"); + } + + private function log(OutputInterface $output, string $message): void + { + $output->writeln($message); + } + /** + * 获取OpenIM SDK实例 + * + * @return object + */ + function getSdk() + { + if ($this->sdk) { + return $this->sdk; + } + + $this->sdk = new \support\OpenImSdk\Client([ + 'host' => config('openim.server'), + 'secret' => config('openim.secret'), + ]); + + return $this->sdk; + } + + private function initConnections(OutputInterface $output): void + { + $this->log($output, "正在初始化连接..."); + + $this->getSdk(); + + $uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/tettt?authSource=admin'; + $this->oldManager = new \MongoDB\Driver\Manager($uri); + + $this->log($output, "✅ 连接成功"); + } + + private function cleanExistingData(OutputInterface $output,$collections=[]): void + { + // 记录开始清理数据的日志信息 + $this->log($output, "\n═════════════════ 清理现有数据 ═════════════════"); + $this->log($output, ""); + + // 构建新数据库(OpenIM v3)的MongoDB连接URI + $uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/openim_v3?authSource=admin'; + // 创建MongoDB驱动管理器实例,用于操作新数据库 + $this->newManager = new \MongoDB\Driver\Manager($uri); + try { + // 记录开始清理数据的状态 + $this->log($output, "正在清理mongodb数据..."); + // 定义需要清空的数据集合列表(保留user集合,清空其他所有业务数据) + // 遍历所有需要清理的集合,逐个执行清空操作 + foreach ($collections as $collection) { + try { + // 创建批量写入操作对象 + $bulk = new \MongoDB\Driver\BulkWrite; + // 添加删除所有文档的操作(空条件表示删除全部) + $bulk->delete([]); + // 执行批量删除操作,指定数据库和集合名称 + $this->newManager->executeBulkWrite('openim_v3.' . $collection, $bulk); + // 记录该集合清空成功的日志 + $this->log($output, "已清空集合: {$collection}"); + } catch (\Exception $e) { + // 单个集合清空失败时记录警告信息,不影响其他集合的清理 + $this->log($output, "⚠️ 清空集合 {$collection} 失败: " . $e->getMessage()); + } + } + $this->log($output, "正在清理redis数据..."); + $redis = new \Redis(); + $host = '127.0.0.1'; + $port = 16379; + $password = 'n1e5a6s6m7'; + + $output->writeln("连接 Redis: {$host}:{$port}"); + + if ($redis->connect($host, $port)) { + if (!empty($password)) { + $redis->auth($password); + } + + $result = $redis->flushAll(); + + if ($result) { + $output->writeln("✅ Redis 清空成功"); + } else { + $output->writeln("❌ Redis 清空失败"); + } + } else { + $output->writeln("❌ 无法连接到 Redis"); + } + // 记录所有数据清理完成的日志 + $this->log($output, "✅ 数据清理完成"); + } catch (\Exception $e) { + // 捕获整体清理过程中的异常,记录错误但不抛出,确保程序继续执行 + $this->log($output, "❌ 清理数据失败: " . $e->getMessage()); + // 不抛出异常,继续执行 + } + } + + private function queryOldDb(string $collection, array $filter = [], array $options = []): array + { + $query = new \MongoDB\Driver\Query($filter, $options); + $cursor = $this->oldManager->executeQuery('tettt.' . $collection, $query); + $result = []; + foreach ($cursor as $doc) { + $result[] = $this->bsonToArray($doc); + } + return $result; + } + + /** + * 备份MongoDB数据 + * @param OutputInterface $output + * @param string $step + * @return string + */ + private function backupMongoDB(OutputInterface $output, string $step): string + { + $this->log($output, "═════════════════ 备份MongoDB数据 ═════════════════"); + + // 确保备份目录存在 + if (!is_dir($this->backupDir)) { + mkdir($this->backupDir, 0755, true); + } + + // 生成备份文件名 + $timestamp = date('YmdHis'); + $backupFile = "{$this->backupDir}/openim_v3_{$step}_{$timestamp}.json"; + + try { + // 使用现有的新数据库连接 + if (!$this->newManager) { + $uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/openim_v3?authSource=admin'; + $this->newManager = new \MongoDB\Driver\Manager($uri); + } + + // 获取所有集合 + $command = new \MongoDB\Driver\Command(['listCollections' => 1]); + $cursor = $this->newManager->executeCommand('openim_v3', $command); + $collections = $cursor->toArray(); + + //$this->log($output, "找到 " . count($collections) . " 个集合"); + + $backupData = []; + + // 备份每个集合 + foreach ($collections as $collection) { + $collectionName = $collection->name; + if (in_array($collectionName, ['system.indexes', 'system.profile'])) { + continue; + } + + //$this->log($output, "备份集合: {$collectionName}"); + + $query = new \MongoDB\Driver\Query([]); + $cursor = $this->newManager->executeQuery('openim_v3.' . $collectionName, $query); + + $documents = []; + foreach ($cursor as $doc) { + $document = $this->bsonToArray($doc); + // 处理ObjectId + if (isset($document['_id']) && is_array($document['_id']) && isset($document['_id']['$oid'])) { + $document['_id'] = $document['_id']['$oid']; + } + $documents[] = $document; + } + + if (!empty($documents)) { + $backupData[$collectionName] = $documents; + //$this->log($output, " - 备份了 " . count($documents) . " 条记录"); + } + } + + // 保存备份文件 + file_put_contents($backupFile, json_encode($backupData, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); + + $this->log($output, "✅ 备份成功: {$backupFile} (" . filesize($backupFile) . " 字节)"); + $this->currentBackup = $backupFile; + return $backupFile; + } catch (\Exception $e) { + $this->log($output, "❌ 备份失败: " . $e->getMessage()); + return ''; + } + } + + /** + * 回滚MongoDB数据 + * @param OutputInterface $output + * @param string $backupFile + * @return bool + */ + private function restoreMongoDB(OutputInterface $output, string $backupFile): bool + { + $this->log($output, "═════════════════ 回滚MongoDB数据 ═════════════════"); + + if (!file_exists($backupFile)) { + $this->log($output, "❌ 备份文件不存在: {$backupFile}"); + return false; + } + + try { + // 读取备份文件 + $backupData = json_decode(file_get_contents($backupFile), true); + if (empty($backupData)) { + $this->log($output, "❌ 备份文件为空"); + return false; + } + + // 连接到新数据库 + $uri = 'mongodb://commie:n1e5a6s6m7@127.0.0.1:37017/openim_v3?authSource=admin'; + $manager = new \MongoDB\Driver\Manager($uri); + + // 清空所有集合 + $this->log($output, "清空现有数据..."); + foreach (array_keys($backupData) as $collectionName) { + $bulk = new \MongoDB\Driver\BulkWrite; + $bulk->delete([]); + $manager->executeBulkWrite('openim_v3.' . $collectionName, $bulk); + } + + // 恢复数据 + foreach ($backupData as $collectionName => $documents) { + $documentCount = count($documents); + $this->log($output, "恢复集合: {$collectionName} ({$documentCount} 条记录)"); + + $bulk = new \MongoDB\Driver\BulkWrite; + foreach ($documents as $document) { + // 处理_id字段 + if (isset($document['_id']) && is_string($document['_id'])) { + // 尝试创建ObjectId + try { + $document['_id'] = new \MongoDB\BSON\ObjectId($document['_id']); + } catch (\Exception $e) { + // 如果不是有效的ObjectId格式,保持原样 + } + } + $bulk->insert($document); + } + + $result = $manager->executeBulkWrite('openim_v3.' . $collectionName, $bulk); + $this->log($output, "恢复成功: {$result->getInsertedCount()} 条记录"); + } + + $this->log($output, "✅ 回滚成功"); + return true; + } catch (\Exception $e) { + $this->log($output, "❌ 回滚失败: " . $e->getMessage()); + return false; + } + } + +} diff --git a/app/command/Openim.php b/app/command/Openim.php index 9b8ad62..26d43b9 100755 --- a/app/command/Openim.php +++ b/app/command/Openim.php @@ -1575,8 +1575,8 @@ class Openim extends Command } $this->sdk = new \support\OpenImSdk\Client([ - 'host' => 'http://127.0.0.1:10002', - 'secret' => 'n1e5a6s6m7', + 'host' => config('openim.server'), + 'secret' => config('openim.secret'), ]); return $this->sdk; diff --git a/app/command/User.php b/app/command/User.php index 8c2fbe0..bcccc45 100755 --- a/app/command/User.php +++ b/app/command/User.php @@ -49,10 +49,6 @@ class User extends Command return 0; } function login(InputInterface $input, OutputInterface $output){ - // $IM = new \support\OpenImSdk\Client([ - // 'host' => 'http://127.0.0.1:10002', // OpenIM API地址 - // 'secret' => 'n1e5a6s6m7', // OpenIM密钥 - // ]); $user_id = $input->getOption('user_id'); if(!$user_id){ return false; @@ -133,8 +129,8 @@ class User extends Command return $this->sdk; } $this->sdk = new \support\OpenImSdk\Client([ - 'host' => 'http://127.0.0.1:10002', // OpenIM API地址 - 'secret' => 'n1e5a6s6m7', // OpenIM密钥 + 'host' => config('openim.server'), // OpenIM API地址 + 'secret' => config('openim.secret'), // OpenIM密钥 ]); return $this->sdk; } diff --git a/app/controller/HookController.php b/app/controller/HookController.php index 9fc0b68..60608ec 100755 --- a/app/controller/HookController.php +++ b/app/controller/HookController.php @@ -21,8 +21,8 @@ class HookController{ $nickname= Input('nickname'); $users = Input('users'); $im = new \support\OpenImSdk\Client([ - 'host' => 'http://127.0.0.1:10002', // OpenIM API地址 - 'secret' => 'n1e5a6s6m7', // OpenIM密钥 + 'host' => config('openim.server'), // OpenIM API地址 + 'secret' => config('openim.secret'), // OpenIM密钥 ]); foreach($users as $k=>$v){ @@ -374,8 +374,8 @@ class HookController{ return $this->sdk; } $this->sdk = new \support\OpenImSdk\Client([ - 'host' => 'http://127.0.0.1:10002', // OpenIM API地址 - 'secret' => 'n1e5a6s6m7', // OpenIM密钥 + 'host' => config('openim.server'), // OpenIM API地址 + 'secret' => config('openim.secret'), // OpenIM密钥 ]); return $this->sdk; } diff --git a/config/openim.php b/config/openim.php new file mode 100644 index 0000000..df2a369 --- /dev/null +++ b/config/openim.php @@ -0,0 +1,6 @@ + 'http://127.0.0.1:10002', + 'admin' => 'imAdmin', + 'secret' => 'n1e5a6s6m7', +]; \ No newline at end of file diff --git a/plugin/admin/app/controller/OpenimBase.php b/plugin/admin/app/controller/OpenimBase.php index 569263f..992f804 100644 --- a/plugin/admin/app/controller/OpenimBase.php +++ b/plugin/admin/app/controller/OpenimBase.php @@ -24,8 +24,8 @@ class OpenimBase extends Crud return $this->sdk; } $this->sdk = new \support\OpenImSdk\Client([ - 'host' => 'http://127.0.0.1:10002', // OpenIM API地址 - 'secret' => 'n1e5a6s6m7', // OpenIM密钥 + 'host' => config('openim.server'), // OpenIM API地址 + 'secret' => config('openim.secret'), // OpenIM密钥 ]); return $this->sdk; } diff --git a/plugin/admin/app/middleware/Config.php b/plugin/admin/app/middleware/Config.php index 8c90781..f163eee 100755 --- a/plugin/admin/app/middleware/Config.php +++ b/plugin/admin/app/middleware/Config.php @@ -35,8 +35,8 @@ class Config implements MiddlewareInterface 'config' => $config ]); $IM = new \support\OpenImSdk\Client([ - 'host' => 'http://127.0.0.1:10002', // OpenIM API地址 - 'secret' => 'n1e5a6s6m7', // OpenIM密钥 + 'host' => config('openim.server'), // OpenIM API地址 + 'secret' => config('openim.secret'), // OpenIM密钥 ]); $request->IM = $IM; return $handler($request); diff --git a/support/OpenImSdk/Api/Auth.php b/support/OpenImSdk/Api/Auth.php index 78ede62..002bb12 100755 --- a/support/OpenImSdk/Api/Auth.php +++ b/support/OpenImSdk/Api/Auth.php @@ -20,7 +20,7 @@ class Auth 'userID' => $userID, 'secret' => Config::getSecret() ]; - return Utils::send(Url::$getAdminToken, $data, '获取管理员token错误'); + return Utils::send(Url::$getAdminToken, $data); } /** @@ -34,7 +34,7 @@ class Auth { // 获取管理员token $platformID = Utils::getPlatformId( $platformID ); - return Utils::send(Url::$getUserToken, ['userID' => $userID, 'platformID' => $platformID], '获取用户token错误'); + return Utils::send(Url::$getUserToken, ['userID' => $userID, 'platformID' => $platformID]); } /** @@ -45,13 +45,10 @@ class Auth */ public function forceLogout(string $userID, string $platformID = 'android'): array|bool { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - // 清除本地缓存的用户token Utils::clearToken($userID); $platformID = Utils::getPlatformId( $platformID ); - return Utils::send(Url::$forceLogout, ['userID' => $userID, 'platformID' => $platformID], '强制登出错误', $adminToken); + return Utils::send(Url::$forceLogout, ['userID' => $userID, 'platformID' => $platformID]); } /** @@ -61,7 +58,7 @@ class Auth */ public function parseToken(string $token): array { - return Utils::send(Url::$parseToken, [], '解析当前用户token错误', $token); + return Utils::send(Url::$parseToken, []); } @@ -72,8 +69,6 @@ class Auth */ public function userToken(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$userToken, ['userID' => $userID], '用户登录错误', $adminToken); + return Utils::send(Url::$userToken, ['userID' => $userID]); } } diff --git a/support/OpenImSdk/Api/Conversation.php b/support/OpenImSdk/Api/Conversation.php index a7f7f89..a37bb6e 100755 --- a/support/OpenImSdk/Api/Conversation.php +++ b/support/OpenImSdk/Api/Conversation.php @@ -16,8 +16,6 @@ class Conversation */ public function getOwnerConversation(string $userID, int $pageNumber = 1, int $showNumber = 20): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'userID' => $userID, 'pagination' => [ @@ -25,7 +23,7 @@ class Conversation 'showNumber' => $showNumber ] ]; - return Utils::send(Url::$getOwnerConversation, $data, '获取当前用户分页会话列表失败', $adminToken); + return Utils::send(Url::$getOwnerConversation, $data); } /** @@ -35,8 +33,6 @@ class Conversation */ public function getSortedConversationList(string $userID,$conversationIDs='',int $page=1,int $pagesize=10): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); return Utils::send(Url::$getSortedConversationList, [ 'userID' => $userID, 'conversationIDs' => $conversationIDs, @@ -44,7 +40,7 @@ class Conversation 'pageNumber' => $page, 'showNumber' => $pagesize ] - ], '获取排序的会话列表失败', $adminToken); + ]); } /** @@ -63,8 +59,6 @@ class Conversation */ public function setConversations(string $conversationID, array $userIDs, int $recvMsgOpt = 0, bool $isPinned = false, bool $isPrivateChat = false, int $groupAtType = 0, string $ex = '', bool $isMsgDestruct = false, int $msgDestructTime = 0, int $burnDuration = 0): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'conversationID' => $conversationID, 'userIDs' => $userIDs, @@ -79,6 +73,6 @@ class Conversation 'burnDuration' => $burnDuration ] ]; - return Utils::send(Url::$setConversations, $data, '为多个用户设置相同会话ID的字段失败', $adminToken); + return Utils::send(Url::$setConversations, $data); } } diff --git a/support/OpenImSdk/Api/Friend.php b/support/OpenImSdk/Api/Friend.php index 87cb9dc..67bfb87 100755 --- a/support/OpenImSdk/Api/Friend.php +++ b/support/OpenImSdk/Api/Friend.php @@ -15,10 +15,8 @@ class Friend */ public function addBlack(string $ownerUserID, string $blackUserID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['ownerUserID' => $ownerUserID, 'blackUserID' => $blackUserID]; - return Utils::send(Url::$addBlack, $data, '添加黑名单错误', $adminToken); + return Utils::send(Url::$addBlack, $data); } /** @@ -30,12 +28,12 @@ class Friend */ public function addFriend(string $fromUserID, string $toUserID, string $reqMsg): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['fromUserID' => $fromUserID, 'toUserID' => $toUserID, 'reqMsg' => $reqMsg]; - return Utils::send(Url::$addFriend, $data, '添加好友错误', $adminToken); + return Utils::send(Url::$addFriend, $data); } + + /** * 同意/拒绝好友请求 * @param string $ownerUserID 处理者ID @@ -46,15 +44,13 @@ class Friend */ public function addFriendResponse(string $ownerUserID, string $friendUserID, string $handleMsg, int $handleResult): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'ownerUserID' => $ownerUserID, 'friendUserID' => $friendUserID, 'handleMsg' => $handleMsg, 'handleResult' => $handleResult ]; - return Utils::send(Url::$addFriendResponse, $data, '同意/拒绝好友请求错误', $adminToken); + return Utils::send(Url::$addFriendResponse, $data); } /** @@ -65,10 +61,8 @@ class Friend */ public function deleteFriend(string $ownerUserID, string $friendUserID): array|bool { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['ownerUserID' => $ownerUserID, 'friendUserID' => $friendUserID]; - return Utils::send(Url::$deleteFriend, $data, '删除好友错误', $adminToken); + return Utils::send(Url::$deleteFriend, $data); } /** @@ -78,9 +72,7 @@ class Friend */ public function getBlackList(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getBlackList, ['userID' => $userID], '获取黑名单列表错误', $adminToken); + return Utils::send(Url::$getBlackList, ['userID' => $userID]); } /** @@ -90,9 +82,7 @@ class Friend */ public function getFriendApplyList(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getFriendApplyList, ['userID' => $userID], '获取好友申请列表错误', $adminToken); + return Utils::send(Url::$getFriendApplyList, ['userID' => $userID]); } /** @@ -102,15 +92,13 @@ class Friend */ public function getFriendList(string $userID,$page=1,$pagesize=1000): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); return Utils::send(Url::$getFriendList, [ 'userID' => $userID, "pagination" => [ "pageNumber" => $page, "showNumber" => $pagesize ] - ], '获取用户的好友列表错误', $adminToken); + ]); } /** @@ -120,9 +108,7 @@ class Friend */ public function getSelfFriendApplyList(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getSelfFriendApplyList, ['userID' => $userID], '获取自己的好友申请列表错误', $adminToken); + return Utils::send(Url::$getSelfFriendApplyList, ['userID' => $userID]); } /** @@ -131,12 +117,10 @@ class Friend * @param array $friendUserIDs 好友ID列表 * @return array */ - public function importFriend(string $ownerUserID, array $friendUserIDs = []): array + public function importFriend(string $ownerUserID, array $friendUserIDs = []): array|bool { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['ownerUserID' => $ownerUserID, 'friendUserIDs' => $friendUserIDs]; - return Utils::send(Url::$importFriend, $data, '批量导入好友错误', $adminToken); + return Utils::send(Url::$importFriend, $data); } /** @@ -147,10 +131,8 @@ class Friend */ public function isFriend(string $userID1, string $userID2): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['userID1' => $userID1, 'userID2' => $userID2]; - return Utils::send(Url::$isFriend, $data, '检查用户之间是否为好友错误', $adminToken); + return Utils::send(Url::$isFriend, $data); } /** @@ -161,10 +143,8 @@ class Friend */ public function removeBlack(string $ownerUserID, string $blackUserID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['ownerUserID' => $ownerUserID, 'blackUserID' => $blackUserID]; - return Utils::send(Url::$removeBlack, $data, '把用户移除黑名单错误', $adminToken); + return Utils::send(Url::$removeBlack, $data); } /** @@ -176,10 +156,8 @@ class Friend */ public function setFriendRemark(string $fromUserID, string $toUserID, string $remark): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['fromUserID' => $fromUserID, 'toUserID' => $toUserID, 'remark' => $remark]; - return Utils::send(Url::$setFriendRemark, $data, '设置好友备注错误', $adminToken); + return Utils::send(Url::$setFriendRemark, $data); } /** @@ -193,8 +171,6 @@ class Friend */ public function updateFriends(string $ownerUserID, string $friendUserID, string $remark = '', bool $isPinned = false, string $ex = ''): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'ownerUserID' => $ownerUserID, 'friendUserID' => $friendUserID @@ -213,6 +189,6 @@ class Friend $data['ex'] = $ex; } - return Utils::send(Url::$updateFriends, $data, '更新好友信息失败', $adminToken); + return Utils::send(Url::$updateFriends, $data); } } diff --git a/support/OpenImSdk/Api/Group.php b/support/OpenImSdk/Api/Group.php index 33b12ff..be66934 100755 --- a/support/OpenImSdk/Api/Group.php +++ b/support/OpenImSdk/Api/Group.php @@ -31,8 +31,6 @@ class Group string $groupID = '', string $faceURL = '', string $introduction = '', string $notification = '', string $ex = '', int $groupType = 2, int $needVerification = 0, int $lookMemberInfo = 0, int $applyMemberFriend = 0): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'ownerUserID' => $ownerUserID, 'memberUserIDs' => $memberUserIDs, @@ -50,25 +48,26 @@ class Group 'applyMemberFriend' => $applyMemberFriend ] ]; - return Utils::send(Url::$createGroup, $data, '创建群组失败', $adminToken); + return Utils::send(Url::$createGroup, $data); } /** * 申请加入群组 - * @param string $token 用户token + * @param string $inviterUserID 用户ID * @param string $groupID 群组ID * @param string $reqMsg 申请消息 * @param int $joinSource 加入来源 * @return array */ - public function joinGroup(string $token, string $groupID, string $reqMsg = '', int $joinSource = 0): array + public function joinGroup(string $inviterUserID, string $groupID, string $reqMsg = '', int $joinSource = 0): array { $data = [ + 'inviterUserID' => $inviterUserID, 'groupID' => $groupID, - 'reqMsg' => $reqMsg, + 'reqMessage' => $reqMsg, 'joinSource' => $joinSource ]; - return Utils::send(Url::$joinGroup, $data, '申请加入群组失败', $token); + return Utils::send(Url::$joinGroup, $data); } /** @@ -79,7 +78,7 @@ class Group */ public function quitGroup(string $token, string $groupID): array { - return Utils::send(Url::$quitGroup, ['groupID' => $groupID], '退出群组失败', $token); + return Utils::send(Url::$quitGroup, ['groupID' => $groupID]); } /** @@ -89,9 +88,7 @@ class Group */ public function getGroupsInfo(array $groupIDs): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getGroupsInfo, ['groupIDs' => $groupIDs], '获取群组信息失败', $adminToken); + return Utils::send(Url::$getGroupsInfo, ['groupIDs' => $groupIDs]); } /** @@ -113,7 +110,7 @@ class Group 'showNumber' => $pagesize ] ]; - return Utils::send(Url::$getGroupMemberList, $data, '获取群成员列表失败'); + return Utils::send(Url::$getGroupMemberList, $data); } /** @@ -124,34 +121,28 @@ class Group */ public function getGroupMembersInfo(string $groupID, array $userIDs): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, 'userIDs' => $userIDs ]; - return Utils::send(Url::$getGroupMembersInfo, $data, '获取指定群成员信息失败', $adminToken); + return Utils::send(Url::$getGroupMembersInfo, $data); } /** * 将用户拉入群组 * @param string $groupID 群组ID - * @param string $inviterUserID 邀请者ID * @param array $invitedUserIDList 被邀请的用户ID列表 * @param string $reason 邀请原因 * @return array */ - public function inviteUserToGroup(string $groupID, string $inviterUserID, array $invitedUserIDList, string $reason = ''): array + public function inviteUserToGroup(string $groupID, array $invitedUserIDList, string $reason = ''): array|bool { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, - 'inviterUserID' => $inviterUserID, - 'invitedUserIDList' => $invitedUserIDList, + 'invitedUserIDs' => $invitedUserIDList, 'reason' => $reason, ]; - return Utils::send(Url::$inviteUserToGroup, $data, '将用户拉入群组失败', $adminToken); + return Utils::send(Url::$inviteUserToGroup, $data); } /** @@ -164,15 +155,13 @@ class Group */ public function kickGroupMember(string $groupID, string $kickUserID, array $kickedUserIDs, string $reason = ''): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, 'kickUserID' => $kickUserID, 'kickedUserIDs' => $kickedUserIDs, 'reason' => $reason ]; - return Utils::send(Url::$kickGroupMember, $data, '踢出群成员失败', $adminToken); + return Utils::send(Url::$kickGroupMember, $data); } /** @@ -184,14 +173,12 @@ class Group */ public function transferGroupOwner(string $groupID, string $oldOwnerUserID, string $newOwnerUserID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, 'oldOwnerUserID' => $oldOwnerUserID, 'newOwnerUserID' => $newOwnerUserID ]; - return Utils::send(Url::$transferGroupOwner, $data, '转让群主失败', $adminToken); + return Utils::send(Url::$transferGroupOwner, $data); } /** @@ -201,9 +188,7 @@ class Group */ public function getJoinedGroupList(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getJoinedGroupList, ['userID' => $userID], '获取用户加入的群组列表失败', $adminToken); + return Utils::send(Url::$getJoinedGroupList, ['userID' => $userID]); } /** @@ -213,9 +198,7 @@ class Group */ public function dismissGroup(string $groupID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$dismissGroup, ['groupID' => $groupID], '解散群组失败', $adminToken); + return Utils::send(Url::$dismissGroup, ['groupID' => $groupID]); } /** @@ -227,14 +210,12 @@ class Group */ public function setGroupMemberNickname(string $groupID, string $userID, string $nickname): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, 'userID' => $userID, 'nickname' => $nickname ]; - return Utils::send(Url::$setGroupMemberNickname, $data, '设置群成员昵称失败', $adminToken); + return Utils::send(Url::$setGroupMemberNickname, $data); } /** @@ -246,13 +227,11 @@ class Group */ public function setGroupMemberInfo(string $groupID, string $userID, array $data): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = array_merge([ 'groupID' => $groupID, 'userID' => $userID ], $data); - return Utils::send(Url::$setGroupMemberInfo, $data, '设置群成员信息失败', $adminToken); + return Utils::send(Url::$setGroupMemberInfo, $data); } /** @@ -262,9 +241,7 @@ class Group */ public function getGroupMemberUserIDs(string $groupID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getGroupMemberUserIDs, ['groupID' => $groupID], '获取群成员用户ID列表失败', $adminToken); + return Utils::send(Url::$getGroupMemberUserIDs, ['groupID' => $groupID]); } /** @@ -276,8 +253,6 @@ class Group */ public function getGroupAllMemberList(string $groupID, int $offset = 0, int $count = 100): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, 'pagination' => [ @@ -285,7 +260,7 @@ class Group 'showNumber' => $count ] ]; - return Utils::send(Url::$getGroupAllMemberList, $data, '获取群成员列表失败', $adminToken); + return Utils::send(Url::$getGroupAllMemberList, $data); } /** @@ -295,9 +270,7 @@ class Group */ public function getUserReqGroupApplicationList(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getUserReqGroupApplicationList, ['userID' => $userID], '获取用户加群申请列表失败', $adminToken); + return Utils::send(Url::$getUserReqGroupApplicationList, ['userID' => $userID]); } /** @@ -308,13 +281,11 @@ class Group */ public function getGroupApplicationListByUserID(string $groupID, array $userIDs): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, 'userIDs' => $userIDs ]; - return Utils::send(Url::$getGroupUsersReqApplicationList, $data, '获取指定用户对指定群组的加群请求失败', $adminToken); + return Utils::send(Url::$getGroupUsersReqApplicationList, $data); } /** @@ -328,8 +299,6 @@ class Group */ public function groupApplicationResponse(string $groupID, string $fromUserID, string $handledUserID, int $handleResult, string $handleMsg = ''): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'groupID' => $groupID, 'fromUserID' => $fromUserID, @@ -337,7 +306,7 @@ class Group 'handleResult' => $handleResult, 'handleMsg' => $handleMsg ]; - return Utils::send(Url::$groupApplicationResponse, $data, '处理群组申请失败', $adminToken); + return Utils::send(Url::$groupApplicationResponse, $data); } /** @@ -347,9 +316,7 @@ class Group */ public function muteGroup(string $groupID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$muteGroup, ['groupID' => $groupID], '禁言群组失败', $adminToken); + return Utils::send(Url::$muteGroup, ['groupID' => $groupID]); } /** @@ -359,9 +326,7 @@ class Group */ public function cancelMuteGroup(string $groupID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$cancelMuteGroup, ['groupID' => $groupID], '取消禁言群组失败', $adminToken); + return Utils::send(Url::$cancelMuteGroup, ['groupID' => $groupID]); } /** @@ -373,10 +338,8 @@ class Group */ public function muteGroupMember(string $groupID, string $userID, int $mutedSeconds = 0): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['groupID' => $groupID, 'userID' => $userID, 'mutedSeconds' => $mutedSeconds]; - return Utils::send(Url::$muteGroupMember, $data, '禁言群成员失败', $adminToken); + return Utils::send(Url::$muteGroupMember, $data); } /** @@ -387,9 +350,7 @@ class Group */ public function cancelMuteGroupMember(string $groupID, string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = ['groupID' => $groupID, 'userID' => $userID]; - return Utils::send(Url::$cancelMuteGroupMember, $data, '取消禁言群成员失败', $adminToken); + return Utils::send(Url::$cancelMuteGroupMember, $data); } } diff --git a/support/OpenImSdk/Api/Message.php b/support/OpenImSdk/Api/Message.php index cbe26bb..2f2e4e0 100755 --- a/support/OpenImSdk/Api/Message.php +++ b/support/OpenImSdk/Api/Message.php @@ -68,8 +68,6 @@ class Message */ public function sendMsg(string $sendID, string $recvID = '', string $groupID = '', string $senderNickname = '', string $senderFaceURL = '', int $senderPlatformID = 1, array $content = [], int $contentType = 101, int $sessionType = 1, bool $isOnlineOnly = false, bool $notOfflinePush = false, int $sendTime = 0, array $offlinePushInfo = [], string $ex = ''): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'sendID' => $sendID, 'senderNickname' => $senderNickname, @@ -106,7 +104,7 @@ class Message $data['offlinePushInfo'] = $offlinePushInfo; } - return Utils::send(Url::$sendMsg, $data, '发送消息失败', $adminToken); + return Utils::send(Url::$sendMsg, $data); } /** @@ -121,8 +119,6 @@ class Message */ public function batchSendMsg(string $sendID, string $senderNickname, string $senderFaceURL, int $sessionType, int $contentType, string $content): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'senderPlatformID' => 0, 'sendID' => $sendID, @@ -132,7 +128,7 @@ class Message 'contentType' => $contentType, 'content' => ['text' => $content] ]; - return Utils::send(Url::$batchSendMsg, $data, '批量发送消息失败', $adminToken); + return Utils::send(Url::$batchSendMsg, $data); } /** @@ -142,9 +138,7 @@ class Message */ public function clearMsg(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$clearMsg, ['userID' => $userID], '清空用户消息失败', $adminToken); + return Utils::send(Url::$clearMsg, ['userID' => $userID]); } /** @@ -156,14 +150,12 @@ class Message */ public function delMsg(string $userID, string $conversationID, array $seqs): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'userID' => $userID, 'conversationID' => $conversationID, 'seqs' => $seqs ]; - return Utils::send(Url::$delMsg, $data, '删除消息失败', $adminToken); + return Utils::send(Url::$delMsg, $data); } /** @@ -175,14 +167,12 @@ class Message */ public function revokeMessage(string $conversationID, string $seq, string $userID): array|bool { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'conversationID' => $conversationID, 'seq' => intval($seq), 'userID' => $userID ]; - return Utils::send(Url::$revokeMessage, $data, '撤回消息失败', $adminToken); + return Utils::send(Url::$revokeMessage, $data); } /** @@ -233,7 +223,7 @@ class Message 'reliabilityLevel' => 1, ]; //log_alert($data); - return Utils::send(Url::$sendBusinessNotification, $data, '发送业务通知失败'); + return Utils::send(Url::$sendBusinessNotification, $data); } /** @@ -243,9 +233,7 @@ class Message */ public function getAllConversations(string $userID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getAllConversations, ['userID' => $userID], '获取用户所有会话失败', $adminToken); + return Utils::send(Url::$getAllConversations, ['userID' => $userID]); } /** @@ -256,13 +244,11 @@ class Message */ public function getConversation(string $userID, string $conversationID): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'userID' => $userID, 'conversationID' => $conversationID ]; - return Utils::send(Url::$getConversation, $data, '获取会话失败', $adminToken); + return Utils::send(Url::$getConversation, $data); } /** @@ -273,12 +259,10 @@ class Message */ public function getConversations(string $userID, array $conversationIDs): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'userID' => $userID, 'conversationIDs' => $conversationIDs ]; - return Utils::send(Url::$getConversations, $data, '获取会话列表失败', $adminToken); + return Utils::send(Url::$getConversations, $data); } } diff --git a/support/OpenImSdk/Api/User.php b/support/OpenImSdk/Api/User.php index 319f8c7..375b7da 100755 --- a/support/OpenImSdk/Api/User.php +++ b/support/OpenImSdk/Api/User.php @@ -15,15 +15,13 @@ class User */ public function getUsers(int $pagination = 1, int $showNumber = 20): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = [ 'pagination' => [ 'pageNumber' => $pagination, 'showNumber' => $showNumber ] ]; - return Utils::send(Url::$getUsers, $data, '获取用户列表错误', $adminToken); + return Utils::send(Url::$getUsers, $data); } /** @@ -33,9 +31,7 @@ class User */ public function getUsersOnlineStatus(array $userIDList): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getUsersOnlineStatus, ['userIDList' => $userIDList], '获取用户在线状态错误', $adminToken); + return Utils::send(Url::$getUsersOnlineStatus, ['userIDList' => $userIDList]); } /** @@ -45,9 +41,7 @@ class User */ public function getUsersOnlineTokenDetail(array $userIDList): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getUsersOnlineTokenDetail, ['userIDList' => $userIDList], '获取用户在线token详情错误', $adminToken); + return Utils::send(Url::$getUsersOnlineTokenDetail, ['userIDList' => $userIDList]); } /** @@ -56,22 +50,17 @@ class User */ public function getSubscribeUsersStatus(): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getSubscribeUsersStatus, [], '获取订阅用户状态错误', $adminToken); + return Utils::send(Url::$getSubscribeUsersStatus, []); } /** * 订阅用户状态 - * @param string $token 管理员token * @param array $userIDList 用户ID列表 * @return array */ public function subscribeUsersStatus(array $userIDList): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$subscribeUsersStatus, ['userIDList' => $userIDList], '订阅用户状态错误', $adminToken); + return Utils::send(Url::$subscribeUsersStatus, ['userIDList' => $userIDList]); } /** @@ -81,9 +70,7 @@ class User */ public function setGlobalMsgRecvOpt(int $globalRecvMsgOpt): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$setGlobalMsgRecvOpt, ['globalRecvMsgOpt' => $globalRecvMsgOpt], '设置全局免打扰错误', $adminToken); + return Utils::send(Url::$setGlobalMsgRecvOpt, ['globalRecvMsgOpt' => $globalRecvMsgOpt]); } /** @@ -94,13 +81,11 @@ class User */ public function updateUserInfo(string $userID, array $data): array|bool { - // 获取管理员token - $adminToken = Utils::getAdminToken(); $data = array_merge(['userID' => $userID], $data); $data = [ 'userInfo' => $data ]; - return Utils::send(Url::$updateUserInfo, $data, '修改用户信息错误', $adminToken); + return Utils::send(Url::$updateUserInfo, $data); } /** @@ -119,7 +104,7 @@ class User 'showNumber' => $showNumber ] ]; - return Utils::send(Url::$searchNotificationAccount, $data, '搜索通知账号错误'); + return Utils::send(Url::$searchNotificationAccount, $data); } /** @@ -127,11 +112,7 @@ class User * @param string $userID 用户ID * @param string $nickname 昵称 * @param string $faceURL 头像 - * @param int $gender 性别 - * @param string $phoneNumber 手机号 - * @param string $birth 生日 - * @param string $email 邮箱 - * @param string $ex 扩展字段 + * @param \support\OpenImSdk\Enum\appMangerLevel $appMangerLevel 应用管理等级 * @return array */ public function addNotificationAccount(string $userID, string $nickname = '', string $faceURL = '', \support\OpenImSdk\Enum\appMangerLevel $appMangerLevel = \support\OpenImSdk\Enum\appMangerLevel::Notify): array @@ -142,7 +123,7 @@ class User 'faceURL' => $faceURL, 'appMangerLevel' => $appMangerLevel->value, ]; - return Utils::send(Url::$addNotificationAccount, $data, '添加通知账号错误'); + return Utils::send(Url::$addNotificationAccount, $data); } /** @@ -150,11 +131,6 @@ class User * @param string $userID 用户ID * @param string $nickname 昵称 * @param string $faceURL 头像 - * @param int $gender 性别 - * @param string $phoneNumber 手机号 - * @param string $birth 生日 - * @param string $email 邮箱 - * @param string $ex 扩展字段 * @return array */ public function updateNotificationAccount(string $userID, string $nickname = '', string $faceURL = ''): array @@ -165,7 +141,7 @@ class User 'nickname' => $nickname, 'faceURL' => $faceURL ]; - return Utils::send(Url::$updateNotificationAccount, $data, '更新通知账号错误'); + return Utils::send(Url::$updateNotificationAccount, $data); } /** @@ -175,9 +151,7 @@ class User */ public function accountCheck(array $checkUserIDList): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$accountCheck, ['checkUserIDList' => $checkUserIDList], '检查列表账户注册状态错误', $adminToken); + return Utils::send(Url::$accountCheck, ['checkUserIDList' => $checkUserIDList]); } /** @@ -186,9 +160,7 @@ class User */ public function getAllUsersUid($page=1,$limit=100): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getAllUsersUid, ['pagination'=>['pageNumber'=>$page,"showNumber"=>$limit]], '获取所有用户uid列表错误', $adminToken); + return Utils::send(Url::$getAllUsersUid, ['pagination'=>['pageNumber'=>$page,"showNumber"=>$limit]]); } /** @@ -198,9 +170,7 @@ class User */ public function getSelfUserInfo(string $userID): array { - // 获取管理员token - $userToken = Utils::getUserToken($userID); - return Utils::send(Url::$getSelfUserInfo, ['userID' => $userID], '获取自己的信息错误', $userToken); + return Utils::send(Url::$getSelfUserInfo, ['userID' => $userID]); } /** @@ -210,9 +180,7 @@ class User */ public function getUsersInfo(array $userIDList): array { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - return Utils::send(Url::$getUsersInfo, ['userIDList' => $userIDList], '获取用户信息错误', $adminToken); + return Utils::send(Url::$getUsersInfo, ['userIDList' => $userIDList]); } //Header @@ -233,19 +201,21 @@ class User * @param string $faceURL 头像地址 * @return array */ - public function userRegister(string $userID, string $nickname = '', string $faceURL = ''): array|bool + public function userRegister(string|array $userID, string $nickname = '', string $faceURL = ''): array|bool { - // 获取管理员token - $adminToken = Utils::getAdminToken(); - $data = [ - 'users' => [ - [ - 'userID' => $userID, - 'nickname' => $nickname, - 'faceURL' => $faceURL + if(is_array($userID)){ + $data['users'] = $userID; + }else{ + $data = [ + 'users' => [ + [ + 'userID' => $userID, + 'nickname' => $nickname, + 'faceURL' => $faceURL + ] ] - ] - ]; - return Utils::send(Url::$userRegister, $data, '注册IM错误', $adminToken); + ]; + } + return Utils::send(Url::$userRegister, $data); } } diff --git a/support/OpenImSdk/Core/Utils.php b/support/OpenImSdk/Core/Utils.php index 80d23d3..3b5c16a 100755 --- a/support/OpenImSdk/Core/Utils.php +++ b/support/OpenImSdk/Core/Utils.php @@ -80,23 +80,24 @@ class Utils * 发送API请求 * @param string $path API路径 * @param array $data 请求数据 - * @param string $errMsg 错误信息 - * @param string $token 认证令牌 * @return array 响应数据 */ - public static function send(string $path, array $data, string $errMsg='', string $token = ''): array|bool + public static function send(string $path, array $data): array|bool { if($path != Url::$getAdminToken){ - $token = $token ? $token : Utils::getAdminToken(); + $token = Utils::getAdminToken(); } $url = Url::buildUrl($path); - //cp($url); - //cp($data); $res = self::request($url, $data, $token); - //cp($res); $res = json_decode($res, true); if($res['errCode'] !==0 ){ + cp('=============================调试信息====================================='); + cp($url); + cp(json_encode($data)); + cp($res); + cp('=============================end====================================='); + throw new \Exception($res['errMsg'],$res['errCode']); //throw new \Exception($res['errDlt'],$res['errCode']); } @@ -132,7 +133,7 @@ class Utils $result = self::send(Url::$getAdminToken, [ 'userID' => $userID, 'secret' => Config::getSecret() - ], '获取管理员Token失败'); + ]); $token = $result['token']; // 使用API返回的过期时间 $expireTimeSeconds = $result['expireTimeSeconds'] ?? null; @@ -167,7 +168,7 @@ class Utils $result = self::send(Url::$getUserToken, [ 'userID' => $userID, 'platformID' => self::getPlatformId($platformID) - ], '获取用户Token失败', $adminToken); + ]); $token = $result['token'];