Completed
Pull Request — master (#161)
by De Cramer
02:59
created

ManiaExchangeWindowFactory::__construct()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 37
Code Lines 32

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 1
Bugs 0 Features 1
Metric Value
c 1
b 0
f 1
dl 0
loc 37
rs 8.8571
ccs 0
cts 15
cp 0
cc 1
eloc 32
nc 1
nop 18
crap 2

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
3
namespace eXpansion\Bundle\Maps\Plugins\Gui;
4
5
use eXpansion\Bundle\Maps\Plugins\Jukebox;
6
use eXpansion\Bundle\Maps\Plugins\ManiaExchange;
7
use eXpansion\Bundle\Maps\Structure\MxInfo;
8
use eXpansion\Framework\Core\Helpers\Http;
9
use eXpansion\Framework\Core\Helpers\Structures\HttpResult;
10
use eXpansion\Framework\Core\Helpers\Time;
11
use eXpansion\Framework\Core\Helpers\TMString;
12
use eXpansion\Framework\Core\Model\Gui\Grid\DataCollection;
13
use eXpansion\Framework\Core\Model\Gui\Grid\DataCollectionFactory;
14
use eXpansion\Framework\Core\Model\Gui\Grid\GridBuilder;
15
use eXpansion\Framework\Core\Model\Gui\Grid\GridBuilderFactory;
16
use eXpansion\Framework\Core\Model\Gui\ManialinkInterface;
17
use eXpansion\Framework\Core\Model\Gui\WindowFactoryContext;
18
use eXpansion\Framework\Core\Plugins\Gui\GridWindowFactory;
19
use eXpansion\Framework\Gui\Components\uiButton;
20
use eXpansion\Framework\Gui\Components\uiDropdown;
21
use eXpansion\Framework\Gui\Components\uiLabel;
22
23
class ManiaExchangeWindowFactory extends GridWindowFactory
24
{
25
    /** @var  uiDropdown */
26
    public $lengthBox;
27
    /** @var  uiDropdown */
28
    public $stylebox;
29
    /** @var  uiDropdown */
30
    public $sitebox;
31
    /** @var  uiDropdown */
32
    public $difficultiesBox;
33
    /** @var  uiDropdown */
34
    public $tpackBox;
35
36
    public $tpack = [
37
        "All" => "",
38
        "Stadium" => "Stadium,TMStadium",
39
        "Canyon" => "Canyon,TmCanyon",
40
        "Valley" => "Valley,TmValley",
41
        "Lagoon" => "Lagoon,TmLagoon",
42
    ];
43
44
    /** @var  uiDropdown */
45
    private $orderbox;
46
    /** @var  uiDropdown */
47
    private $opbox;
48
    /** @var  uiDropdown */
49
    private $modebox;
50
51
    /** @var  array */
52
    private $tracksearch;
53
54
    /** @var GridBuilderFactory */
55
    protected $gridBuilderFactory;
56
57
    /** @var DataCollectionFactory */
58
    protected $dataCollectionFactory;
59
60
    /** @var Time */
61
62
    protected $timeFormatter;
63
    /**
64
     * @var  ManiaExchange $mxPlugin
65
     */
66
    private $mxPlugin;
67
    /**
68
     * @var array
69
     */
70
    private $order;
71
    /**
72
     * @var array
73
     */
74
    private $length;
75
    /**
76
     * @var array
77
     */
78
    private $mapStylesTm;
79
    /**
80
     * @var array
81
     */
82
    private $mapStylesSm;
83
    /**
84
     * @var array
85
     */
86
    private $difficulties;
87
    /**
88
     * @var array
89
     */
90
    private $operator;
91
92
    /**
93
     * @var Http
94
     */
95
    private $http;
96
97
    /**
98
     * ManiaExchangeWindowFactory constructor.
99
     *
100
     * @param $name
101
     * @param $sizeX
102
     * @param $sizeY
103
     * @param null $posX
104
     * @param null $posY
105
     * @param WindowFactoryContext $context
106
     * @param GridBuilderFactory $gridBuilderFactory
107
     * @param DataCollectionFactory $dataCollectionFactory
108
     * @param Time $time
109
     * @param ManiaExchange $mxPlugin
110
     * @param Http $http
111
     * @param $tracksearch
112
     * @param $order
113
     * @param $length
114
     * @param $mapStylesTm
115
     * @param $mapStylesSm
116
     * @param $difficulties
117
     * @param $operator
118
     */
119
    public function __construct(
120
        $name,
121
        $sizeX,
122
        $sizeY,
123
        $posX,
124
        $posY,
125
        WindowFactoryContext $context,
126
        GridBuilderFactory $gridBuilderFactory,
127
        DataCollectionFactory $dataCollectionFactory,
128
        Time $time,
129
        ManiaExchange $mxPlugin,
130
        Http $http,
131
        $tracksearch,
132
        $order,
133
        $length,
134
        $mapStylesTm,
135
        $mapStylesSm,
136
        $difficulties,
137
        $operator
138
139
    ) {
140
        parent::__construct($name, $sizeX, $sizeY, $posX, $posY, $context);
141
142
        $this->gridBuilderFactory = $gridBuilderFactory;
143
        $this->dataCollectionFactory = $dataCollectionFactory;
144
        $this->timeFormatter = $time;
145
        $this->mxPlugin = $mxPlugin;
146
        $this->tracksearch = array_flip($tracksearch);
147
148
        $this->order = array_flip($order);
149
        $this->length = array_flip($length);
150
        $this->mapStylesTm = array_flip($mapStylesTm);
151
        $this->mapStylesSm = array_flip($mapStylesSm);
152
        $this->difficulties = array_flip($difficulties);
153
        $this->operator = array_flip($operator);
154
        $this->http = $http;
155
    }
156
157
    /**
158
     * @param ManialinkInterface $manialink
159
     */
160
    protected function createGrid(ManialinkInterface $manialink)
161
    {
162
        $x = 0;
163
164
        $tooltip = $this->uiFactory->createTooltip();
165
        $manialink->addChild($tooltip);
166
167
        $this->modebox = $this->uiFactory->createDropdown("mode", $this->tracksearch, 0);
168
        $this->modebox->setPosition($x, -6, 2);
169
        $manialink->addChild($this->modebox);
170
171
        $label = $this->uiFactory->createLabel("Sort by", uiLabel::TYPE_HEADER);
172
        $label->setPosition($x, 0);
173
        $manialink->addChild($label);
174
175
        $x += 32;
176
        $this->orderbox = $this->uiFactory->createDropdown("order", $this->order, 0);
177
        $this->orderbox->setPosition($x, -6, 2);
178
        $manialink->addChild($this->orderbox);
179
180
        $label = $this->uiFactory->createLabel("Order", uiLabel::TYPE_HEADER);
181
        $label->setPosition($x, 0);
182
        $manialink->addChild($label);
183
184
        $x += 32;
185
        $this->opbox = $this->uiFactory->createDropdown("operator", $this->operator, 0);
186
        $this->opbox->setPosition($x, -6, 2);
187
        $manialink->addChild($this->opbox);
188
189
        $label = $this->uiFactory->createLabel("Operator", uiLabel::TYPE_HEADER);
190
        $label->setPosition($x, 0);
191
        $manialink->addChild($label);
192
193
        $x += 32;
194
        $this->lengthBox = $this->uiFactory->createDropdown("length", $this->length, 0);
195
        $this->lengthBox->setPosition($x, -6, 2);
196
        $manialink->addChild($this->lengthBox);
197
198
        $label = $this->uiFactory->createLabel("Length", uiLabel::TYPE_HEADER);
199
        $label->setPosition($x, 0);
200
        $manialink->addChild($label);
201
202
        $x += 32;
203
        $this->stylebox = $this->uiFactory->createDropdown("style", $this->mapStylesTm, 0);
204
        $this->stylebox->setPosition($x, -6, 2);
205
        $manialink->addChild($this->stylebox);
206
207
        $label = $this->uiFactory->createLabel("Style", uiLabel::TYPE_HEADER);
208
        $label->setPosition($x, 0);
209
        $manialink->addChild($label);
210
211
        $x += 32;
212
        $this->difficultiesBox = $this->uiFactory->createDropdown("difficulties", $this->difficulties, 0);
213
        $this->difficultiesBox->setPosition($x, -6, 2);
214
        $manialink->addChild($this->difficultiesBox);
215
216
        $label = $this->uiFactory->createLabel("Difficulty", uiLabel::TYPE_HEADER);
217
        $label->setPosition($x, 0);
218
        $manialink->addChild($label);
219
220
        /// second line
221
222
        $this->sitebox = $this->uiFactory->createDropdown("site", ["Trackmania" => "tm", "Storm" => "sm"], 0);
223
        $this->sitebox->setPosition(0, -14, 2);
224
        $manialink->addChild($this->sitebox);
225
226
        $this->tpackBox = $this->uiFactory->createDropdown("tpack", $this->tpack, 0);
227
        $this->tpackBox->setPosition(32, -14, 2);
228
        $manialink->addChild($this->tpackBox);
229
230
        $mapname = $this->uiFactory->createInput("map");
231
232
        $author = $this->uiFactory->createInput("author");
233
234
235
        $search = $this->uiFactory->createButton('🔍 Search', uiButton::TYPE_DECORATED);
236
        $search->setAction($this->actionFactory->createManialinkAction($manialink, [$this, 'callbackSearch'],
237
            ["ml" => $manialink]));
238
239
        $all = $this->uiFactory->createButton('Install view', uiButton::TYPE_DEFAULT);
240
        $tooltip->addTooltip($all, "Install all maps from the view");
241
        $all->setBackgroundColor("f00");
242
        $all->setAction($this->actionFactory->createManialinkAction($manialink, [$this, 'callbackInstallAll'],
243
            ["ml" => $manialink]));
244
245
        $line = $this->uiFactory->createLayoutLine(64, -14, [$mapname, $author, $search, $all], 2);
246
        $manialink->addChild($line);
247
248
        $addButton = $this->uiFactory->createButton('Install', uiButton::TYPE_DEFAULT);
249
        $addButton->setSize(20, 4);
250
251
        $gridBuilder = $this->gridBuilderFactory->create();
252
        $gridBuilder->setManialink($manialink)
253
            ->setDataCollection($manialink->getData('dataCollection'))
254
            ->setManialinkFactory($this)
255
            ->addTextColumn(
256
                'index',
257
                'expansion_mx.gui.mxsearch.column.index',
258
                1,
259
                true,
260
                false
261
            )->addTextColumn(
262
                'name',
263
                'expansion_mx.gui.mxsearch.column.name',
264
                5,
265
                true,
266
                false
267
            )->addTextColumn(
268
                'author',
269
                'expansion_mx.gui.mxsearch.column.author',
270
                3,
271
                true
272
            )->addTextColumn(
273
                'envir',
274
                'expansion_mx.gui.mxsearch.column.envir',
275
                2,
276
                true,
277
                false
278
            )->addTextColumn(
279
                'awards',
280
                'expansion_mx.gui.mxsearch.column.awards',
281
                1,
282
                true,
283
                false
284
            )->addTextColumn(
285
                'length',
286
                'expansion_mx.gui.mxsearch.column.length',
287
                2,
288
                true,
289
                false
290
            )->addTextColumn(
291
                'style',
292
                'expansion_mx.gui.mxsearch.column.style',
293
                2,
294
                true,
295
                false
296
            )
297
            ->addActionColumn('add', 'expansion_mx.gui.mxsearch.column.add', 2, array($this, 'callbackAdd'),
298
                $addButton);
299
        $this->setGridPosition(0, -24);
300
301
        $content = $manialink->getContentFrame();
302
        $this->setGridSize($content->getWidth(), $content->getHeight() - 24);
303
        $manialink->setData('grid', $gridBuilder);
304
        $this->gridBuilder = $gridBuilder;
305
    }
306
307
    /**
308
     * @param ManialinkInterface $manialink
309
     * @param $login
310
     * @param $params
311
     * @param $args
312
     */
313
    public function callbackAdd(ManialinkInterface $manialink, $login, $params, $args)
314
    {
315
        $this->mxPlugin->addMapToQueue($login, $args['mxid'], $params['site']);
316
    }
317
318
    public function callbackInstallAll(ManialinkInterface $manialink, $login, $params, $arguments)
319
    {
320
        /** @var DataCollection $collection */
321
        $collection = $manialink->getData('dataCollection');
322
323
        /** @var GridBuilder $grid */
324
        $grid = $manialink->getData('grid');
325
326
        $data = $collection->getData($grid->getCurrentPage());
327
        $this->mxPlugin->addAllMaps($login, $data);
328
    }
329
330
    /**
331
     * @param ManialinkInterface $manialink
332
     * @param $login
333
     * @param $params
334
     * @param $arguments
335
     */
336
    public function callbackSearch(ManialinkInterface $manialink, $login, $params, $arguments)
337
    {
338
        $params = (object)$params;
339
340
        $this->modebox->setSelectedByValue($params->mode);
341
        $this->orderbox->setSelectedByValue($params->order);
342
        $this->opbox->setSelectedByValue($params->operator);
343
        $this->lengthBox->setSelectedByValue($params->length);
344
        $this->stylebox->setSelectedByValue($params->style);
345
        $this->difficultiesBox->setSelectedByValue($params->difficulties);
346
        $this->tpackBox->setSelectedByValue($params->tpack);
347
348
        $options = "";
349
350
        if ($params->tpack) {
351
            $options .= "&tpack=".$params->tpack;
352
        }
353
        if ($params->operator != -1) {
354
            $options .= "&lengthop=".$params->operator;
355
        }
356
357
        $args = "&mode=".$params->mode."&trackname=".urlencode($params->map)."&anyauthor=".urlencode($params->author).
358
            "&style=".$params->style."&priord=".$params->order."&length=".$params->length.
359
            "&limit=100&gv=1".$options;
360
361
        $query = 'https://'.$params->site.'.mania-exchange.com/tracksearch2/search?api=on'.$args;
362
363
        $this->http->get($query, [$this, 'setMaps'], ['login' => $login, 'params' => $params, 'ml' => $manialink]);
364
365
    }
366
367
368
    /**
369
     * @param HttpResult $result
370
     */
371
    public function setMaps(HttpResult $result)
372
    {
373
        $manialink = $result->getAdditionalData()['ml'];
374
        $params = $result->getAdditionalData()['params'];
375
376
        $this->gridBuilder->goToFirstPage($manialink);
377
378
        if ($result->hasError()) {
379
            echo $result->getError();
380
381
            return;
382
        }
383
384
        $json = json_decode($result->getResponse(), true);
385
        $data = [];
386
        foreach ($json['results'] as $idx => $mxInfo) {
387
            $map = new MxInfo($mxInfo);
388
            $data[] = [
389
                "index" => $idx + 1,
390
                "name" => TMString::trimControls($map->gbxMapName),
391
                "author" => $map->username,
392
                "envir" => $map->environmentName,
393
                "awards" => $map->awardCount ? '$ff0🏆 $fff'.$map->awardCount : "",
394
                "length" => $map->lengthName,
395
                "style" => $map->styleName,
396
                "mxid" => $map->trackID,
397
                "mxsite" => $params->site,
398
            ];
399
        }
400
401
        $this->setData($manialink, $data);
402
        $group = $this->groupFactory->createForPlayer($result->getAdditionalData()['login']);
403
        $this->update($group);
404
    }
405
}
406