<?php declare(strict_types=1); namespace App\Controller\Api\Notify; use App\Master\Enum\RedisKeyEnum; use App\Master\Framework\Library\Tencent\TencentIm; use App\Model\Arts\LiveRoomLogModel; use App\Model\Arts\LiveRoomModel; use App\Service\QueueService; use App\Utils\AppResult; use App\Utils\LogUtil; use App\Utils\RedisUtil; use Hyperf\Di\Annotation\Inject; use Hyperf\HttpServer\Contract\RequestInterface; use Hyperf\HttpServer\Contract\ResponseInterface; class TencentImController { // 日志模块名称 const LOG_MODULE = 'Notify/TencentImController'; #[Inject] protected QueueService $service; /** * im 回调通知 * @return \Psr\Http\Message\MessageInterface|\Psr\Http\Message\ResponseInterface */ public function callback(RequestInterface $request,ResponseInterface $response) { $params = $request->all(); $CallbackCommand = $params["CallbackCommand"] ?? ''; switch ($CallbackCommand) { case 'Group.CallbackAfterGroupDestroyed':// 群组解散之后回调 LogUtil::info('群组解散之后回调',self::LOG_MODULE,__FUNCTION__); $room_no = $params["GroupId"]; $model = new LiveRoomModel(); $room = $model->getDetail(params: ['room_no'=>$room_no]); if (!$room){ return AppResult::im_success('直播间不存在或已下播'); } $model = new LiveRoomModel(); if (!$model->closeRoom($room['id'])){ return AppResult::im_error($model->getMessage() ?? '操作失败'); } break; case 'Group.CallbackAfterMemberExit': // 成员离开 LogUtil::info('群成员离开之后回调',self::LOG_MODULE,__FUNCTION__); $room_no = $params["GroupId"]; $members = $params["ExitMemberList"]; $model = new LiveRoomModel(); $model->setIsStatusSearchValue(0); $room = $model->getDetail(params: ['room_no'=>$room_no]); if (!$room){ LogUtil::info('直播间不存在或已下播',self::LOG_MODULE,__FUNCTION__); } if($members) { foreach($members as $k => $v) { $gz_user_id = im_un_prefix($v["Member_Account"]); // 从原房间内移除此用户 RedisUtil::getInstance(RedisKeyEnum::ROOM_USER_LIST,$room_no)->zRem($gz_user_id); // 扣除在线用户在房间情况 RedisUtil::getInstance(RedisKeyEnum::ROOM_USER_IN)->hDel((string)$gz_user_id); if ($room){ $this->service->liveRoomDataPush(['session' => $room['session'], 'ccu' => -1]); if ($room['user_id'] == $gz_user_id){ // 如果是主播,则关闭直播间 $model = new LiveRoomModel(); $model->closeRoom($room['id']); // 腾讯直播解散群组 $im = new TencentIm(); $im->destroy_group($room_no); } } } } break; case 'Group.CallbackOnMemberStateChange': LogUtil::info('直播群成员在线状态回调',self::LOG_MODULE,__FUNCTION__); $type = $params['EventType']; $room_no = $params["GroupId"]; $members = $params["MemberList"]; $model = new LiveRoomModel(); $room = $model->where('room_no',$room_no)->whereIn('status',[1,2])->find(); if (!$room){ LogUtil::info('直播间不存在或已下播',self::LOG_MODULE,__FUNCTION__); } if ($type == 'Offline'){ LogUtil::info('直播群成员离线',self::LOG_MODULE,__FUNCTION__); if($members) { foreach($members as $k => $v) { $gz_user_id = im_un_prefix($v["Member_Account"]); // 从原房间内移除此用户 RedisUtil::getInstance(RedisKeyEnum::ROOM_USER_LIST,$room_no)->zrem($gz_user_id); // 扣除在线用户在房间情况 RedisUtil::getInstance(RedisKeyEnum::ROOM_USER_IN)->hDel($gz_user_id); if ($room){ $this->service->liveRoomDataPush(['session' => $room['session'], 'ccu' => -1]); if ($room['user_id'] == $gz_user_id){ // 如果是主播,则关闭直播间 $model = new LiveRoomModel(); $model->closeRoom($room['id']); // 腾讯直播解散群组 $im = new TencentIm(); $im->destroy_group($room_no); } } } } } break; } // 处理结果通知 return AppResult::im_success('处理成功'); } }