123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259 |
- <?php
- namespace App\Services;
- use App\Exceptions\TencentImException;
- use App\Exceptions\TencentImGroupException;
- use App\Models\TencentImGroup;
- use App\Traits\TencentIm;
- use Carbon\Carbon;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- class TencentImGroupService
- {
- use TencentIm;
- public const TENCENT_REST_APIS = [
- 'createGroup' => 'v4/group_open_http_svc/create_group', // 创建群组 支持同时创建多个
- 'getGroupList' => 'v4/group_open_http_svc/get_appid_group_list', // 获取app中所有群组
- ];
- public const IM_GROUP_RAW_TYPE_PUBLIC = 'Public'; // 陌生人社交群
- public const IM_GROUP_RAW_TYPE_Private = 'Private'; // 即 Work,好友工作群
- public const IM_GROUP_RAW_TYPE_ChatRoom = 'ChatRoom'; // 即 Meeting,会议群
- public const IM_GROUP_RAW_TYPE_AVChatRoom = 'AVChatRoom'; // 直播群
- public const IM_GROUP_RAW_TYPE_TIPS = [
- self::IM_GROUP_RAW_TYPE_PUBLIC => '陌生人交友群',
- self::IM_GROUP_RAW_TYPE_Private => '好友工作群',
- self::IM_GROUP_RAW_TYPE_ChatRoom => '会议群',
- self::IM_GROUP_RAW_TYPE_AVChatRoom => '直播群',
- ];
- /**
- * 获取所有 APP 中的群组.
- *
- * @return \Psr\Http\Message\ResponseInterface
- *
- * @throws \App\Exceptions\TencentImAccountException
- * @throws \App\Exceptions\TencentImException
- * @throws \GuzzleHttp\Exception\GuzzleException
- */
- public function getGroupList(int $limit = 10000, int $next = 0)
- {
- $this->restApiName = self::TENCENT_REST_APIS['getGroupList'];
- $baseApiHost = $this->getTencentImRestApiBaseHost();
- $params = [
- 'Limit' => $limit,
- 'Next' => $next,
- ];
- $apiResult = $this->requestApi($baseApiHost, $params);
- self::verifyApiResult($apiResult);
- return $apiResult;
- }
- /**
- * 验证类型是否存在.
- *
- * @return bool
- *
- * @throws TencentImGroupException
- */
- public static function verifyImGroupType(string $groupType)
- {
- if (!array_key_exists($groupType, TencentImGroup::IM_GROUP_RAW_TYPE_TIPS)) {
- throw new TencentImGroupException('群类型不存在');
- }
- return true;
- }
- /**
- * 验证当日建群上限,并返回当前可以添加的数量.
- *
- * @return int
- *
- * @throws TencentImGroupException
- */
- public static function verifyToDayCreateCount()
- {
- if (TencentImGroup::getToDayCreateCount() >= TencentImGroup::IM_GROUP_CREATE_DAY_MAX) {
- throw new TencentImGroupException('单日新建群组上限为: ' . TencentImGroup::IM_GROUP_CREATE_DAY_MAX);
- }
- return TencentImGroup::IM_GROUP_CREATE_DAY_MAX - TencentImGroup::getToDayCreateCount();
- }
- /**
- * 验证当月建群上限,并返回可以添加的数量.
- *
- * @return int
- *
- * @throws TencentImGroupException
- */
- public static function verifyMonthCreateCount()
- {
- if (TencentImGroup::getMonthCreateCount() >= TencentImGroup::IM_GROUP_CREATE_MONTH_MAX) {
- throw new TencentImGroupException('单月新建群组上限为: ' . TencentImGroup::IM_GROUP_CREATE_MONTH_MAX);
- }
- return TencentImGroup::IM_GROUP_CREATE_MONTH_MAX - TencentImGroup::getMonthCreateCount();
- }
- /**
- * 验证是否可以添加群.
- *
- * @throws TencentImGroupException
- */
- public static function verifyIsCreateGroup(int $groupCount)
- {
- // 验证单次最低
- if ($groupCount < TencentImGroup::IM_GROUP_ONCE_CREATE_MIN) {
- throw new TencentImGroupException('单次添加最低' . TencentImGroup::IM_GROUP_ONCE_CREATE_MIN . ' 个群');
- }
- // 验证单次最多
- if ($groupCount > TencentImGroup::IM_GROUP_ONCE_CREATE_MAX) {
- throw new TencentImGroupException('单次添加最多' . TencentImGroup::IM_GROUP_ONCE_CREATE_MAX . ' 个群');
- }
- // 验证当天添加群数量
- $canToDayCount = self::verifyToDayCreateCount();
- // 验证当月添加上限
- $canMonthCount = self::verifyMonthCreateCount();
- if ($groupCount > $canToDayCount) {
- throw new TencentImGroupException('当前创建数量超过日上限,当日还可创建 ' . $canToDayCount . '个');
- }
- if ($groupCount > $canMonthCount) {
- throw new TencentImGroupException('当前创建数量超过月上限,当月还可创建 ' . $canMonthCount . '个');
- }
- return true;
- }
- /**
- * @throws TencentImGroupException
- * @throws \App\Exceptions\TencentImException
- */
- public function createGroups(int $groupCount, string $groupType = TencentImGroup::DEFAULT_IM_RAW_GROUP_TYPE)
- {
- try {
- // 验证群类型是否存在
- self::verifyImGroupType($groupType);
- // 是否可以创建群
- self::verifyIsCreateGroup($groupCount);
- DB::beginTransaction();
- $this->restApiName = self::TENCENT_REST_APIS['createGroup'];
- $baseApiHost = $this->getTencentImRestApiBaseHost();
- // TODO 做单点登录,避免并发
- $groupStartIndex = TencentImGroup::getGroupIndex();
- $groupEndIndex = $groupStartIndex + $groupCount;
- for ($i = $groupStartIndex; $i < $groupEndIndex; $i++) {
- $item = [
- // TODO 新建群默认群主为APP管理员
- 'Owner_Account' => config('im.identifier'),
- 'Type' => TencentImGroup::IM_GROUP_RAW_TYPE_ChatRoom,
- 'Name' => (string) $i,
- ];
- $apiResult = $this->requestApi($baseApiHost, $item);
- self::verifyApiResult($apiResult);
- $item['GroupId'] = $apiResult['GroupId'];
- $item['groupIndex'] = $i;
- $params[] = $item;
- }
- unset($item);
- if (count($params) != $groupCount) {
- throw new TencentImGroupException('添加群组失败!');
- }
- $params = array_map(function ($value) {
- return [
- 'group_name' => $value['Name'],
- 'im_group_raw_id' => $value['GroupId'] ?? $value['groupIndex'],
- 'group_owner_user_id' => null,
- 'im_group_owner_raw_user_id' => $value['Owner_Account'],
- 'group_type' => null,
- 'im_group_raw_type' => $value['Type'],
- 'is_use' => TencentImGroup::UN_USE,
- 'bind_system_im_group_id' => null,
- 'group_index' => $value['groupIndex'] ?? 0,
- 'created_at' => Carbon::now(),
- 'updated_at' => Carbon::now(),
- ];
- }, $params);
- if (!TencentImGroup::insert($params)) {
- Log::log(date('Y-m-d H:i:s', time()) . '创建IM群组,写入系统记录失败', $params);
- throw new TencentImGroupException('创建IM群写入系统记录失败,请联系管理员检查');
- }
- DB::commit();
- return true;
- } catch (TencentImGroupException $e) {
- DB::rollBack();
- return ['error' => $e->getMessage()];
- } catch (TencentImException $e) {
- DB::rollBack();
- dd($e);
- return ['error' => $e->getMessage()];
- } catch (\Exception $e) {
- DB::rollBack();
- dd($e);
- return ['error' => $e->getMessage()];
- }
- }
- public function createGroup(array $createData)
- {
- $this->restApiName = self::TENCENT_REST_APIS['createGroup'];
- $baseApiHost = $this->getTencentImRestApiBaseHost();
- // TODO 做单点登录,避免并发
- $params = [
- // TODO 新建群默认群主为APP管理员
- 'Owner_Account' => config('im.identifier'),
- 'Type' => TencentImGroup::IM_GROUP_RAW_TYPE_ChatRoom,
- 'Name' => TencentImGroup::getGroupIndex(),
- ];
- $apiResult = $this->requestApi($baseApiHost, $params);
- dd($apiResult);
- }
- /**
- * 构建添加群数组.
- */
- private function generateCreateGroupData(int $groupCount)
- {
- $groupStartIndex = TencentImGroup::getGroupIndex();
- $groupEndIndex = $groupStartIndex + $groupCount;
- for ($i = $groupStartIndex; $i < $groupEndIndex; $i++) {
- $item = [
- // TODO 新建群默认群主为APP管理员
- 'Owner_Account' => config('im.identifier'),
- 'Type' => TencentImGroup::IM_GROUP_RAW_TYPE_ChatRoom,
- 'Name' => $i,
- ];
- $this->createGroup($item);
- $params[] = $item;
- }
- unset($item);
- return $params;
- }
- }
|