GetDiscussDetailRequest   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 57
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 8

Importance

Changes 0
Metric Value
dl 0
loc 57
rs 10
c 0
b 0
f 0
wmc 8
lcom 0
cbo 8

2 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 8 1
B parseResponse() 0 34 7
1
<?php
2
/*
3
 * This file is part of the slince/smartqq package.
4
 *
5
 * (c) Slince <[email protected]>
6
 *
7
 * For the full copyright and license information, please view the LICENSE
8
 * file that was distributed with this source code.
9
 */
10
11
namespace Slince\SmartQQ\Request;
12
13
use Cake\Collection\Collection;
14
use GuzzleHttp\Psr7\Response;
15
use Slince\SmartQQ\Credential;
16
use Slince\SmartQQ\Entity\Discuss;
17
use Slince\SmartQQ\Entity\DiscussDetail;
18
use Slince\SmartQQ\Entity\DiscussMember;
19
use Slince\SmartQQ\EntityCollection;
20
use Slince\SmartQQ\EntityFactory;
21
use Slince\SmartQQ\Exception\ResponseException;
22
23
class GetDiscussDetailRequest extends Request
24
{
25
    protected $uri = 'http://d1.web2.qq.com/channel/get_discu_info?did={discussId}&psessionid={psessionid}&vfwebqq={vfwebqq}&clientid=53999199&t=0.1';
26
27
    protected $referer = 'http://d1.web2.qq.com/proxy.html?v=20151105001&callback=1&id=2';
28
29
    public function __construct(Discuss $discuss, Credential $credential)
30
    {
31
        $this->setTokens([
32
            'discussId' => $discuss->getId(),
33
            'psessionid' => $credential->getPSessionId(),
34
            'vfwebqq' => $credential->getVfWebQQ(),
35
        ]);
36
    }
37
38
    /**
39
     * 解析响应数据.
40
     *
41
     * @param Response $response
42
     *
43
     * @return DiscussDetail
44
     */
45
    public static function parseResponse(Response $response)
46
    {
47
        $jsonData = \GuzzleHttp\json_decode($response->getBody(), true);
48
        if ($jsonData && 0 == $jsonData['retcode']) {
49
            //成员在线状态
50
            $statuses = (new Collection($jsonData['result']['mem_status']))->combine('uin', function ($entity) {
51
                return $entity;
52
            })->toArray();
53
            //成员基本信息
54
            $ruins = (new Collection($jsonData['result']['info']['mem_list']))->combine('mem_uin', 'ruin')
55
                ->toArray();
56
            //讨论组基本详情
57
            $discussData = $jsonData['result']['info'];
58
            $discussDetailData = [
59
                'did' => $discussData['did'],
60
                'name' => $discussData['discu_name'],
61
            ];
62
            $members = [];
63
            foreach ($jsonData['result']['mem_info'] as $memberData) {
64
                $uin = $memberData['uin'];
65
                $members[] = EntityFactory::createEntity(DiscussMember::class, [
66
                   'uin' => $uin,
67
                   'nick' => $memberData['nick'],
68
                   'clientType' => isset($statuses[$uin]) ? $statuses[$uin]['client_type'] : null,
69
                   'status' => isset($statuses[$uin]) ? $statuses[$uin]['status'] : null,
70
                   'ruin' => isset($ruins[$uin]) ? $ruins[$uin] : null,
71
                ]);
72
            }
73
            $discussDetailData['members'] = new EntityCollection($members);
74
75
            return EntityFactory::createEntity(DiscussDetail::class, $discussDetailData);
76
        }
77
        throw new ResponseException($jsonData['retcode'], $response);
78
    }
79
}
80