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

ManiaExchangeWindowFactory::callbackInstallAll()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 11
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 9.4285
c 0
b 0
f 0
ccs 0
cts 6
cp 0
cc 1
eloc 5
nc 1
nop 4
crap 2
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