Completed
Pull Request — master (#132)
by
unknown
03:47
created

ManiaExchangeWindowFactory::callbackSearch()   B

Complexity

Conditions 3
Paths 4

Size

Total Lines 30
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 1
Bugs 0 Features 1
Metric Value
dl 0
loc 30
ccs 0
cts 20
cp 0
rs 8.8571
c 1
b 0
f 1
cc 3
eloc 19
nc 4
nop 4
crap 12
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\DataCollectionFactory;
13
use eXpansion\Framework\Core\Model\Gui\Grid\DataCollectionInterface;
14
use eXpansion\Framework\Core\Model\Gui\Grid\GridBuilderFactory;
15
use eXpansion\Framework\Core\Model\Gui\ManialinkInterface;
16
use eXpansion\Framework\Core\Model\Gui\WindowFactoryContext;
17
use eXpansion\Framework\Core\Plugins\Gui\GridWindowFactory;
18
use eXpansion\Framework\Gui\Components\uiButton;
19
use eXpansion\Framework\Gui\Components\uiDropdown;
20
use eXpansion\Framework\Gui\Components\uiLabel;
21
22
class ManiaExchangeWindowFactory extends GridWindowFactory
23
{
24
    /** @var  uiDropdown */
25
    public $lengthBox;
26
    /** @var  uiDropdown */
27
    public $stylebox;
28
    /** @var  uiDropdown */
29
    public $sitebox;
30
    /** @var  uiDropdown */
31
    public $difficultiesBox;
32
    /** @var  uiDropdown */
33
    public $tpackBox;
34
35
    public $tpack = [
36
        "All" => "",
37
        "Stadium" => "Stadium,TMStadium",
38
        "Canyon" => "Canyon,TmCanyon",
39
        "Valley" => "Valley,TmValley",
40
        "Lagoon" => "Lagoon,TmLagoon",
41
    ];
42
43
    /** @var  uiDropdown */
44
    private $orderbox;
45
    /** @var  uiDropdown */
46
    private $opbox;
47
    /** @var  uiDropdown */
48
    private $modebox;
49
50
    /** @var  array */
51
    private $tracksearch;
52
53
    /** @var GridBuilderFactory */
54
    protected $gridBuilderFactory;
55
56
    /** @var DataCollectionFactory */
57
    protected $dataCollectionFactory;
58
59
    /** @var Time */
60
61
    protected $timeFormatter;
62
    /**
63
     * @var  ManiaExchange $mxPlugin
64
     */
65
    private $mxPlugin;
66
    /**
67
     * @var array
68
     */
69
    private $order;
70
    /**
71
     * @var array
72
     */
73
    private $length;
74
    /**
75
     * @var array
76
     */
77
    private $mapStylesTm;
78
    /**
79
     * @var array
80
     */
81
    private $mapStylesSm;
82
    /**
83
     * @var array
84
     */
85
    private $difficulties;
86
    /**
87
     * @var array
88
     */
89
    private $operator;
90
91
    /**
92
     * @var Http
93
     */
94
    private $http;
95
96
    /**
97
     * ManiaExchangeWindowFactory constructor.
98
     *
99
     * @param $name
100
     * @param $sizeX
101
     * @param $sizeY
102
     * @param null $posX
103
     * @param null $posY
104
     * @param WindowFactoryContext $context
105
     * @param GridBuilderFactory $gridBuilderFactory
106
     * @param DataCollectionFactory $dataCollectionFactory
107
     * @param Time $time
108
     * @param ManiaExchange $mxPlugin
109
     * @param Http $http
110
     * @param $tracksearch
111
     * @param $order
112
     * @param $length
113
     * @param $mapStylesTm
114
     * @param $mapStylesSm
115
     * @param $difficulties
116
     * @param $operator
117
     */
118
    public function __construct(
119
        $name,
120
        $sizeX,
121
        $sizeY,
122
        $posX,
123
        $posY,
124
        WindowFactoryContext $context,
125
        GridBuilderFactory $gridBuilderFactory,
126
        DataCollectionFactory $dataCollectionFactory,
127
        Time $time,
128
        ManiaExchange $mxPlugin,
129
        Http $http,
130
        $tracksearch,
131
        $order,
132
        $length,
133
        $mapStylesTm,
134
        $mapStylesSm,
135
        $difficulties,
136
        $operator
137
138
    ) {
139
        parent::__construct($name, $sizeX, $sizeY, $posX, $posY, $context);
140
141
        $this->gridBuilderFactory = $gridBuilderFactory;
142
        $this->dataCollectionFactory = $dataCollectionFactory;
143
        $this->timeFormatter = $time;
144
        $this->mxPlugin = $mxPlugin;
145
        $this->tracksearch = array_flip($tracksearch);
146
147
        $this->order = array_flip($order);
148
        $this->length = array_flip($length);
149
        $this->mapStylesTm = array_flip($mapStylesTm);
150
        $this->mapStylesSm = array_flip($mapStylesSm);
151
        $this->difficulties = array_flip($difficulties);
152
        $this->operator = array_flip($operator);
153
        $this->http = $http;
154
    }
155
156
    /**
157
     * @param ManialinkInterface $manialink
158
     */
159
    protected function createGrid(ManialinkInterface $manialink)
160
    {
161
        $x = 0;
162
163
        $tooltip = $this->uiFactory->createTooltip();
164
        $manialink->addChild($tooltip);
165
166
        $this->modebox = $this->uiFactory->createDropdown("mode", $this->tracksearch, 0);
167
        $this->modebox->setPosition($x, -6, 2);
168
        $manialink->addChild($this->modebox);
169
170
        $label = $this->uiFactory->createLabel("Sort by", uiLabel::TYPE_HEADER);
171
        $label->setPosition($x, 0);
172
        $manialink->addChild($label);
173
174
        $x += 32;
175
        $this->orderbox = $this->uiFactory->createDropdown("order", $this->order, 0);
176
        $this->orderbox->setPosition($x, -6, 2);
177
        $manialink->addChild($this->orderbox);
178
179
        $label = $this->uiFactory->createLabel("Order", uiLabel::TYPE_HEADER);
180
        $label->setPosition($x, 0);
181
        $manialink->addChild($label);
182
183
        $x += 32;
184
        $this->opbox = $this->uiFactory->createDropdown("operator", $this->operator, 0);
185
        $this->opbox->setPosition($x, -6, 2);
186
        $manialink->addChild($this->opbox);
187
188
        $label = $this->uiFactory->createLabel("Operator", uiLabel::TYPE_HEADER);
189
        $label->setPosition($x, 0);
190
        $manialink->addChild($label);
191
192
        $x += 32;
193
        $this->lengthBox = $this->uiFactory->createDropdown("length", $this->length, 0);
194
        $this->lengthBox->setPosition($x, -6, 2);
195
        $manialink->addChild($this->lengthBox);
196
197
        $label = $this->uiFactory->createLabel("Length", uiLabel::TYPE_HEADER);
198
        $label->setPosition($x, 0);
199
        $manialink->addChild($label);
200
201
        $x += 32;
202
        $this->stylebox = $this->uiFactory->createDropdown("style", $this->mapStylesTm, 0);
203
        $this->stylebox->setPosition($x, -6, 2);
204
        $manialink->addChild($this->stylebox);
205
206
        $label = $this->uiFactory->createLabel("Style", uiLabel::TYPE_HEADER);
207
        $label->setPosition($x, 0);
208
        $manialink->addChild($label);
209
210
        $x += 32;
211
        $this->difficultiesBox = $this->uiFactory->createDropdown("difficulties", $this->difficulties, 0);
212
        $this->difficultiesBox->setPosition($x, -6, 2);
213
        $manialink->addChild($this->difficultiesBox);
214
215
        $label = $this->uiFactory->createLabel("Difficulty", uiLabel::TYPE_HEADER);
216
        $label->setPosition($x, 0);
217
        $manialink->addChild($label);
218
219
        /// second line
220
221
        $this->sitebox = $this->uiFactory->createDropdown("site", ["Trackmania" => "tm", "Storm" => "sm"], 0);
222
        $this->sitebox->setPosition(0, -14, 2);
223
        $manialink->addChild($this->sitebox);
224
225
        $this->tpackBox = $this->uiFactory->createDropdown("tpack", $this->tpack, 0);
226
        $this->tpackBox->setPosition(32, -14, 2);
227
        $manialink->addChild($this->tpackBox);
228
229
        $mapname = $this->uiFactory->createInput("map");
230
        $mapname->setHeight(6);
231
        $author = $this->uiFactory->createInput("author");
232
        $author->setHeight(6);
233
234
        $search = $this->uiFactory->createButton('🔍 Search', uiButton::TYPE_DECORATED);
235
        $search->setAction($this->actionFactory->createManialinkAction($manialink, [$this, 'callbackSearch'],
236
            ["ml" => $manialink]));
237
        $search->setHeight(6);
238
239
        $line = $this->uiFactory->createLayoutLine(64, -14, [$mapname, $author, $search], 2);
240
        $manialink->addChild($line);
241
242
        $addButton = $this->uiFactory->createButton('Install', uiButton::TYPE_DEFAULT);
243
        $addButton->setSize(20, 5);
244
245
        $gridBuilder = $this->gridBuilderFactory->create();
246
        $gridBuilder->setManialink($manialink)
247
            ->setDataCollection($manialink->getData('dataCollection'))
248
            ->setManialinkFactory($this)
249
            ->addTextColumn(
250
                'index',
251
                'expansion_mx.gui.mxsearch.column.index',
252
                1,
253
                true,
254
                false
255
            )->addTextColumn(
256
                'name',
257
                'expansion_mx.gui.mxsearch.column.name',
258
                5,
259
                true,
260
                false
261
            )->addTextColumn(
262
                'author',
263
                'expansion_mx.gui.mxsearch.column.author',
264
                3,
265
                false
266
            )->addTextColumn(
267
                'envir',
268
                'expansion_mx.gui.mxsearch.column.envir',
269
                2,
270
                true,
271
                false
272
            )->addTextColumn(
273
                'awards',
274
                'expansion_mx.gui.mxsearch.column.awards',
275
                1,
276
                true,
277
                false
278
            )->addTextColumn(
279
                'length',
280
                'expansion_mx.gui.mxsearch.column.length',
281
                2,
282
                true,
283
                false
284
            )->addTextColumn(
285
                'style',
286
                'expansion_mx.gui.mxsearch.column.style',
287
                2,
288
                true,
289
                false
290
            )
291
            ->addActionColumn('add', 'expansion_mx.gui.mxsearch.column.add', 2, array($this, 'callbackAdd'),
292
                $addButton);
293
        $this->setGridPosition(0, -24);
294
295
        $content = $manialink->getContentFrame();
296
        $this->setGridSize($content->getWidth(), $content->getHeight() - 24);
297
        $manialink->setData('grid', $gridBuilder);
298
        $this->gridBuilder = $gridBuilder;
299
    }
300
301
    /**
302
     * @param ManialinkInterface $manialink
303
     * @param $login
304
     * @param $params
305
     * @param $args
306
     */
307
    public function callbackAdd(ManialinkInterface $manialink, $login, $params, $args)
308
    {
309
        $this->mxPlugin->addMap($login, $args['mxid'], $params['site']);
310
    }
311
312
    /**
313
     * @param ManialinkInterface $manialink
314
     * @param $login
315
     * @param $params
316
     * @param $arguments
317
     */
318
    public function callbackSearch(ManialinkInterface $manialink, $login, $params, $arguments)
0 ignored issues
show
Unused Code introduced by
The parameter $arguments is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
319
    {
320
        $params = (object)$params;
321
322
        $this->modebox->setSelectedByValue($params->mode);
323
        $this->orderbox->setSelectedByValue($params->order);
324
        $this->opbox->setSelectedByValue($params->operator);
325
        $this->lengthBox->setSelectedByValue($params->length);
326
        $this->stylebox->setSelectedByValue($params->style);
327
        $this->difficultiesBox->setSelectedByValue($params->difficulties);
328
        $this->tpackBox->setSelectedByValue($params->tpack);
329
330
        $options = "";
331
332
        if ($params->tpack) {
333
            $options .= "&tpack=".$params->tpack;
334
        }
335
        if ($params->operator != -1) {
336
            $options .= "&lengthop=".$params->operator;
337
        }
338
339
        $args = "&mode=".$params->mode."&trackname=".urlencode($params->map)."&anyauthor=".urlencode($params->author).
340
            "&style=".$params->style."&priord=".$params->order."&length=".$params->length.
341
            "&limit=100&gv=1".$options;
342
343
        $query = 'https://'.$params->site.'.mania-exchange.com/tracksearch2/search?api=on'.$args;
344
345
        $this->http->get($query, [$this, 'setMaps'], ['login' => $login, 'ml' => $manialink]);
346
347
    }
348
349
350
    /**
351
     * @param HttpResult $result
352
     */
353
    public function setMaps(HttpResult $result)
354
    {
355
        $this->gridBuilder->goToFirstPage();
0 ignored issues
show
Bug introduced by
The call to goToFirstPage() misses a required argument $manialink.

This check looks for function calls that miss required arguments.

Loading history...
356
357
        if ($result->hasError()) {
358
            echo $result->getError();
359
360
            return;
361
        }
362
363
        $json = json_decode($result->getResponse(), true);
364
        $data = [];
365
        foreach ($json['results'] as $idx => $mxInfo) {
366
            $map = new MxInfo($mxInfo);
367
            $data[] = [
368
                "index" => $idx + 1,
369
                "name" => TMString::trimControls($map->GbxMapName),
370
                "author" => $map->Username,
371
                "envir" => $map->EnvironmentName,
372
                "awards" => $map->AwardCount ? '$ff0🏆 $fff'.$map->AwardCount : "",
373
                "length" => $map->LengthName,
374
                "style" => $map->StyleName,
375
                "mxid" => $map->TrackID,
376
            ];
377
        }
378
379
380
        $this->setData($result->getAdditionalData()['ml'], $data);
381
        $group = $this->groupFactory->createForPlayer($result->getAdditionalData()['login']);
382
        $this->update($group);
383
    }
384
}
385