Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
75.45% covered (warning)
75.45%
292 / 387
66.67% covered (warning)
66.67%
4 / 6
CRAP
0.00% covered (danger)
0.00%
0 / 1
Play
74.80% covered (warning)
74.80%
282 / 377
66.67% covered (warning)
66.67%
4 / 6
294.64
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
2 / 2
100.00% covered (success)
100.00%
1 / 1
1
 getTsumegoStatus
100.00% covered (success)
100.00%
8 / 8
100.00% covered (success)
100.00%
1 / 1
3
 play
69.81% covered (warning)
69.81%
215 / 308
0.00% covered (danger)
0.00%
0 / 1
307.06
 getActivityValue
100.00% covered (success)
100.00%
29 / 29
100.00% covered (success)
100.00%
1 / 1
6
 getActivityValueSingle
88.24% covered (warning)
88.24%
15 / 17
0.00% covered (danger)
0.00%
0 / 1
3.01
 renderTitle
100.00% covered (success)
100.00%
13 / 13
100.00% covered (success)
100.00%
1 / 1
6
1<?php
2
3App::uses('SetNavigationButtonsInput', 'Utility');
4App::uses('TsumegoButton', 'Utility');
5App::uses('TsumegoButtons', 'Utility');
6App::uses('HeroPowers', 'Utility');
7App::uses('TsumegoXPAndRating', 'Utility');
8App::uses('Level', 'Utility');
9App::uses('AdminActivityLogger', 'Utility');
10App::uses('AdminActivityType', 'Model');
11App::uses('TagConnectionsEdit', 'Utility');
12App::uses('NotFoundException', 'Routing/Error');
13
14class Play
15{
16    private $redirectFunction;
17
18    public function __construct($setFunction, $redirectFunction)
19    {
20        $this->setFunction = $setFunction;
21        $this->redirectFunction = $redirectFunction;
22    }
23
24    public function getTsumegoStatus(array $tsumego): string
25    {
26        if (Auth::isLoggedIn())
27        {
28            $status = ClassRegistry::init('TsumegoStatus')->find('first', ['conditions' => [
29                'user_id' => Auth::getUserID(),
30                'tsumego_id' => $tsumego['Tsumego']['id']]]);
31            if (!$status)
32                return 'V';
33            return $status['TsumegoStatus']['status'];
34        }
35        return 'V';
36    }
37
38    public function play(int $setConnectionID, $params, $data): mixed
39    {
40        ($this->setFunction)('page', 'play');
41
42        $highestTsumegoOrder = 0;
43        $doublexp = null;
44        $suspiciousBehavior = false;
45        $half = '';
46        $isSandbox = false;
47        $goldenTsumego = false;
48        $potion = 0;
49        $potionSuccess = false;
50        $reviewCheat = false;
51        $commentCoordinates = [];
52        $trs = [];
53        $potionAlert = false;
54        $eloScore = 0;
55        $eloScore2 = 0;
56        $requestProblem = '';
57        $achievementUpdate = [];
58        $tRank = '15k';
59        $nothingInRange = false;
60        $queryTitle = '';
61
62        $currentSetConnection = ClassRegistry::init('SetConnection')->findById($setConnectionID);
63        if (!$currentSetConnection)
64            throw new NotFoundException("Set connection " . $setConnectionID . " wasn't found in the database.");
65        $id = $currentSetConnection['SetConnection']['tsumego_id'];
66
67        $setConnections = TsumegoUtil::getSetConnectionsWithTitles($id);
68        $set = ClassRegistry::init('Set')->findById($currentSetConnection['SetConnection']['set_id']);
69
70        if (!Auth::hasPremium() && $set['Set']['premium'] == 1)
71        {
72            CookieFlash::set('This is premium only problem.', 'error');
73            return ($this->redirectFunction)('/sets');
74        }
75
76        $tsumegoVariant = ClassRegistry::init('TsumegoVariant')->find('first', ['conditions' => ['tsumego_id' => $id]]);
77
78        if (isset($params['url']['potionAlert']))
79            $potionAlert = true;
80
81        if (isset($params['url']['search']))
82            if ($params['url']['search'] == 'topics')
83            {
84                $query = $params['url']['search'];
85                $_COOKIE['query'] = $params['url']['search'];
86            }
87
88        $tsumegoFilters = new TsumegoFilters();
89
90        $t = ClassRegistry::init('Tsumego')->findById($id); //the tsumego
91
92        if ($t == null)
93            $t = ClassRegistry::init('Tsumego')->findById($_COOKIE['lastVisit'] ?? Constants::$DEFAULT_TSUMEGO_ID);
94
95        if (Auth::isLoggedIn())
96            $activityValue = $this->getActivityValue(Auth::getUserID(), $t['Tsumego']['id']);
97
98        if ($t['Tsumego']['rating'])
99            $tRank = Rating::getReadableRankFromRating($t['Tsumego']['rating']);
100
101        Util::setCookie('lastVisit', $id);
102
103        if (Auth::isLoggedIn())
104            if (!empty($data))
105            {
106                if (isset($data['Study']))
107                {
108                    $tsumegoVariant['TsumegoVariant']['answer1'] = $data['Study']['study1'];
109                    $tsumegoVariant['TsumegoVariant']['answer2'] = $data['Study']['study2'];
110                    $tsumegoVariant['TsumegoVariant']['answer3'] = $data['Study']['study3'];
111                    $tsumegoVariant['TsumegoVariant']['answer4'] = $data['Study']['study4'];
112                    $tsumegoVariant['TsumegoVariant']['explanation'] = $data['Study']['explanation'];
113                    $tsumegoVariant['TsumegoVariant']['numAnswer'] = $data['Study']['studyCorrect'];
114                    ClassRegistry::init('TsumegoVariant')->save($tsumegoVariant);
115                }
116                elseif (isset($data['Study2']))
117                {
118                    $tsumegoVariant['TsumegoVariant']['winner'] = $data['Study2']['winner'];
119                    $tsumegoVariant['TsumegoVariant']['answer1'] = $data['Study2']['answer1'];
120                    $tsumegoVariant['TsumegoVariant']['answer2'] = $data['Study2']['answer2'];
121                    $tsumegoVariant['TsumegoVariant']['answer3'] = $data['Study2']['answer3'];
122                    ClassRegistry::init('TsumegoVariant')->save($tsumegoVariant);
123                }
124                elseif (isset($data['Settings']))
125                {
126                    if ($data['Settings']['r39'] == 'on' && $t['Tsumego']['alternative_response'] != 1)
127                        AdminActivityLogger::log(AdminActivityType::ALTERNATIVE_RESPONSE, $t['Tsumego']['id'], null, null, '1');
128                    if ($data['Settings']['r39'] == 'off' && $t['Tsumego']['alternative_response'] != 0)
129                        AdminActivityLogger::log(AdminActivityType::ALTERNATIVE_RESPONSE, $t['Tsumego']['id'], null, null, '0');
130                    if ($data['Settings']['r43'] == 'no' && $t['Tsumego']['pass'] != 0)
131                        AdminActivityLogger::log(AdminActivityType::PASS_MODE, $t['Tsumego']['id'], null, null, '0');
132                    if ($data['Settings']['r43'] == 'yes' && $t['Tsumego']['pass'] != 1)
133                        AdminActivityLogger::log(AdminActivityType::PASS_MODE, $t['Tsumego']['id'], null, null, '1');
134                    if ($data['Settings']['r41'] == 'yes' && $tsumegoVariant == null)
135                    {
136                        AdminActivityLogger::log(AdminActivityType::MULTIPLE_CHOICE, $t['Tsumego']['id'], null, null, '1');
137                        $tv1 = [];
138                        $tv1['TsumegoVariant']['tsumego_id'] = $id;
139                        $tv1['TsumegoVariant']['type'] = 'multiple_choice';
140                        $tv1['TsumegoVariant']['answer1'] = 'Black is dead';
141                        $tv1['TsumegoVariant']['answer2'] = 'White is dead';
142                        $tv1['TsumegoVariant']['answer3'] = 'Ko';
143                        $tv1['TsumegoVariant']['answer4'] = 'Seki';
144                        $tv1['TsumegoVariant']['numAnswer'] = '1';
145                        ClassRegistry::init('TsumegoVariant')->create();
146                        ClassRegistry::init('TsumegoVariant')->save($tv1);
147                    }
148                    if ($data['Settings']['r41'] == 'no' && $tsumegoVariant != null)
149                    {
150                        AdminActivityLogger::log(AdminActivityType::MULTIPLE_CHOICE, $t['Tsumego']['id'], null, null, '0');
151                        ClassRegistry::init('TsumegoVariant')->delete($tsumegoVariant['TsumegoVariant']['id']);
152                        $tsumegoVariant = null;
153                    }
154                    if ($data['Settings']['r42'] == 'yes' && $tsumegoVariant == null)
155                    {
156                        AdminActivityLogger::log(AdminActivityType::SCORE_ESTIMATING, $t['Tsumego']['id'], null, null, '1');
157                        $tv1 = [];
158                        $tv1['TsumegoVariant']['tsumego_id'] = $id;
159                        $tv1['TsumegoVariant']['type'] = 'score_estimating';
160                        $tv1['TsumegoVariant']['numAnswer'] = '0';
161                        ClassRegistry::init('TsumegoVariant')->create();
162                        ClassRegistry::init('TsumegoVariant')->save($tv1);
163                    }
164                    if ($data['Settings']['r42'] == 'no' && $tsumegoVariant != null)
165                    {
166                        AdminActivityLogger::log(AdminActivityType::SCORE_ESTIMATING, $t['Tsumego']['id'], null, null, '0');
167                        ClassRegistry::init('TsumegoVariant')->delete($tsumegoVariant['TsumegoVariant']['id']);
168                        $tsumegoVariant = null;
169                    }
170                    if ($data['Settings']['r39'] == 'on')
171                        $t['Tsumego']['alternative_response'] = 1;
172                    else
173                        $t['Tsumego']['alternative_response'] = 0;
174                    if ($data['Settings']['r43'] == 'yes')
175                        $t['Tsumego']['pass'] = 1;
176                    else
177                        $t['Tsumego']['pass'] = 0;
178                    if ($t['Tsumego']['rating'] > 100)
179                        ClassRegistry::init('Tsumego')->save($t, true);
180                }
181                ($this->setFunction)('formRedirect', true);
182            }
183        if (Auth::isAdmin())
184        {
185            $aad = ClassRegistry::init('AdminActivity')->find('first', ['order' => 'id DESC']);
186            if ($aad && $aad['AdminActivity']['type'] === AdminActivityType::PROBLEM_DELETE)($this->setFunction)('deleteProblem2', true);
187        }
188
189        if (isset($_COOKIE['skip']) && $_COOKIE['skip'] != '0' && Auth::getUser())
190        {
191            Auth::getUser()['readingTrial']--;
192            unset($_COOKIE['skip']);
193        }
194        $sandboxSets = ClassRegistry::init('Set')->find('all', ['conditions' => ['public' => 0]]) ?: [];
195        foreach ($sandboxSets as $sandboxSet)
196            if ($set['Set']['id'] == $sandboxSet['Set']['id'])
197                $isSandbox = true;
198
199        $tsumegoStatus = Play::getTsumegoStatus($t);
200
201        if ($tsumegoStatus == 'G')
202            $goldenTsumego = true;
203
204        if (Auth::isLoggedIn() && Auth::getUser()['potion'] >= 15)
205            AppController::setPotionCondition();
206
207        Util::setCookie('previousTsumegoID', $id);
208
209        $amountOfOtherCollection = count(TsumegoUtil::collectTsumegosFromSet($set['Set']['id']));
210
211        $sgf = [];
212        $sgfdb = ClassRegistry::init('Sgf')->find('first', [
213            'order' => 'id DESC',
214            'conditions' => [
215                'tsumego_id' => $id,
216                'accepted' => true]]);
217        if (!$sgfdb)
218        {
219            $sgf['Sgf']['sgf'] = Constants::$SGF_PLACEHOLDER;
220            $sgf['Sgf']['tsumego_id'] = $id;
221        }
222        else
223            $sgf = $sgfdb;
224        if (!is_null($t['Tsumego']['semeaiType']) && $t['Tsumego']['semeaiType'] != 0)
225        {
226            $tr = strpos($sgf['Sgf']['sgf'], 'TR');
227            $sq = strpos($sgf['Sgf']['sgf'], 'SQ');
228            $sequencesSign = strpos($sgf['Sgf']['sgf'], ';B');
229            $p4 = substr($sgf['Sgf']['sgf'], $tr, $sq - $tr);
230            $trX = str_split(substr($p4, 2), 4);
231            $p5 = substr($sgf['Sgf']['sgf'], $sq, $sequencesSign - $sq);
232            $sqX = str_split(substr($p5, 2), 4);
233            $sqXCount = count($sqX);
234
235            for ($i = 0; $i < $sqXCount; $i++)
236                if (strlen($sqX[$i]) < 4)
237                    unset($sqX[$i]);
238            ($this->setFunction)('multipleChoiceTriangles', count($trX));
239            ($this->setFunction)('multipleChoiceSquares', count($sqX));
240        }
241        $sgf2 = str_replace("\n", ' ', $sgf['Sgf']['sgf']);
242        $sgf['Sgf']['sgf'] = str_replace("\r", '', $sgf['Sgf']['sgf']);
243        $sgf['Sgf']['sgf'] = str_replace("\n", '"+"\n"+"', $sgf['Sgf']['sgf']);
244
245        if ($tsumegoFilters->query == 'topics')($this->setFunction)('_title', $set['Set']['title'] . ' ' . $currentSetConnection['SetConnection']['num'] . '/' . $highestTsumegoOrder . ' on Tsumego Hero');
246        else
247        ($this->setFunction)('_title', ($_COOKIE['lastSet'] ?? 'Tsumego') . ' ' . $currentSetConnection['SetConnection']['num'] . '/' . $highestTsumegoOrder . ' on Tsumego Hero');
248
249        if (Auth::isInLevelMode())
250        {
251            $tsumegoButtons = new TsumegoButtons($tsumegoFilters, $currentSetConnection['SetConnection']['id'], null, $set['Set']['id']);
252            new SetNavigationButtonsInput($this->setFunction)->execute($tsumegoButtons, $currentSetConnection);
253            $queryTitle = $tsumegoFilters->getSetTitle($set) . $tsumegoButtons->getPartitionTitleSuffix() . ' ' . $tsumegoButtons->currentOrder . '/' . $tsumegoButtons->highestTsumegoOrder;
254        }
255
256        $t['Tsumego']['status'] = $tsumegoStatus;
257
258        if (!isset($t['Tsumego']['file']) || $t['Tsumego']['file'] == '')
259            $t['Tsumego']['file'] = $currentSetConnection['SetConnection']['num'];
260        $orientation = null;
261        $colorOrientation = null;
262        if (isset($params['url']['orientation']))
263            $orientation = $params['url']['orientation'];
264        if (isset($params['url']['playercolor']))
265            $colorOrientation = $params['url']['playercolor'];
266
267        $checkBSize = 19;
268        for ($i = 2; $i <= 19; $i++)
269            if (strpos(';' . $set['Set']['title'], $i . 'x' . $i))
270                $checkBSize = $i;
271
272        if (Util::getHealthBasedOnLevel(Auth::getWithDefault('level', 0)) >= 8)
273        {
274            $fullHeart = 'heart1small';
275            $emptyHeart = 'heart2small';
276        }
277        else
278        {
279            $fullHeart = 'heart1';
280            $emptyHeart = 'heart2';
281        }
282        if (Auth::isLoggedIn())
283            if (Auth::getUser()['reuse5'] == 1)
284                $suspiciousBehavior = true;
285        $hash = AppController::encrypt($currentSetConnection['SetConnection']['num'] . 'number' . $set['Set']['id']);
286
287        $activate = true;
288        if (Auth::isInRatingMode() || Auth::isInTimeMode())($this->setFunction)('_title', 'Tsumego Hero');
289        if ($isSandbox)
290            $t['Tsumego']['userWin'] = 0;
291
292        $crs = 0;
293
294        if (Auth::isInLevelMode())($this->setFunction)('page', 'level mode');
295        elseif (Auth::isInRatingMode())($this->setFunction)('page', 'rating mode');
296        elseif (Auth::isInTimeMode())($this->setFunction)('page', 'time mode');
297
298        $ui = 2;
299        $file = 'placeholder2.sgf';
300        $startingPlayer = TsumegosController::getStartingPlayer($sgf2);
301
302        $eloScoreRounded = round($eloScore);
303        $eloScore2Rounded = round($eloScore2);
304
305        $existingSignatures = ClassRegistry::init('Signature')->find('all', ['conditions' => ['tsumego_id' => $id]]);
306        if ($existingSignatures == null || $existingSignatures[0]['Signature']['created'] < date('Y-m-d', strtotime('-1 week')))
307            $requestSignature = 'true';
308        else
309            $requestSignature = 'false';
310        if (isset($_COOKIE['signatures']) && $set['Set']['public'] == 1)
311        {
312            $signature = explode('/', $_COOKIE['signatures']);
313            $oldSignatures = ClassRegistry::init('Signature')->find('all', ['conditions' => ['tsumego_id' => $signature[count($signature) - 1]]]);
314            if (!$oldSignatures)
315                $oldSignatures = [];
316
317            $oldSignaturesCount = count($oldSignatures);
318
319            for ($i = 0; $i < $oldSignaturesCount; $i++)
320                ClassRegistry::init('Signature')->delete($oldSignatures[$i]['Signature']['id']);
321
322            $signatureCountMinus1 = count($signature) - 1;
323            for ($i = 0; $i < $signatureCountMinus1; $i++)
324            {
325                ClassRegistry::init('Signature')->create();
326                $newSignature = [];
327                $newSignature['Signature']['tsumego_id'] = $signature[count($signature) - 1];
328                $newSignature['Signature']['signature'] = $signature[$i];
329                ClassRegistry::init('Signature')->save($newSignature);
330            }
331            unset($_COOKIE['signatures']);
332        }
333        $idForSignature = -1;
334        $idForSignature2 = -1;
335        if (isset($params['url']['idForTheThing']))
336        {
337            $idForSignature2 = $params['url']['idForTheThing'] + 1;
338            $idForSignature = TsumegosController::getTheIdForTheThing($idForSignature2);
339        }
340
341        $tagConnectionsEdit = new TagConnectionsEdit($id, TsumegoUtil::hasStateAllowingInspection($t));
342
343        $isAllowedToContribute = false;
344        $isAllowedToContribute2 = false;
345        if (Auth::isLoggedIn())
346        {
347            if (Auth::getUser()['level'] >= 40)
348                $isAllowedToContribute = true;
349            elseif (Auth::getUser()['rating'] >= Constants::$MINIMUM_RATING_TO_CONTRIBUTE)
350                $isAllowedToContribute = true;
351
352            if (Auth::isAdmin())
353            {
354                $isAllowedToContribute = true;
355                $isAllowedToContribute2 = true;
356            }
357            else
358            {
359                $tagsToCheck = ClassRegistry::init('TagConnection')->find('all', ['limit' => 20, 'order' => 'created DESC', 'conditions' => ['user_id' => Auth::getUserID()]]) ?: [];
360                $datex = date('Y-m-d', strtotime('today'));
361                $tagsToCheckCount = count($tagsToCheck);
362
363                for ($i = 0; $i < $tagsToCheckCount; $i++)
364                {
365                    $datexx = new DateTime($tagsToCheck[$i]['TagConnection']['created']);
366                    $datexx = $datexx->format('Y-m-d');
367                    if ($datex !== $datexx)
368                        $isAllowedToContribute2 = true;
369                }
370                if (count($tagsToCheck) < 20)
371                    $isAllowedToContribute2 = true;
372            }
373        }
374
375        $checkNotInSearch = false;
376
377        $isTSUMEGOinFAVORITE = ClassRegistry::init('Favorite')->find('first', ['conditions' => ['user_id' => Auth::getUserID(), 'tsumego_id' => $id]]);
378
379        if (Auth::isInLevelMode())
380            $tsumegoButtons->exportCurrentAndPreviousLink($this->setFunction, $tsumegoFilters, $setConnectionID, $set);
381
382        ($this->setFunction)('isAllowedToContribute', $isAllowedToContribute);
383        ($this->setFunction)('isAllowedToContribute2', $isAllowedToContribute2);
384
385        $sgfProposal = ClassRegistry::init('Sgf')->find('first', ['conditions' => ['tsumego_id' => $id, 'user_id' => Auth::getUserID(), 'accepted' => false]]);
386        ($this->setFunction)('hasSgfProposal', $sgfProposal != null);
387
388        ($this->setFunction)('tagConnectionsEdit', $tagConnectionsEdit);
389        ($this->setFunction)('requestSignature', $requestSignature);
390        ($this->setFunction)('idForSignature', $idForSignature);
391        ($this->setFunction)('idForSignature2', $idForSignature2);
392        if (isset($activityValue))($this->setFunction)('activityValue', $activityValue);
393        ($this->setFunction)('nothingInRange', $nothingInRange);
394        ($this->setFunction)('tRank', $tRank);
395        ($this->setFunction)('sgf', $sgf);
396        ($this->setFunction)('sgf2', $sgf2);
397        ($this->setFunction)('crs', $crs);
398        ($this->setFunction)('orientation', $orientation);
399        ($this->setFunction)('colorOrientation', $colorOrientation);
400        ($this->setFunction)('isTSUMEGOinFAVORITE', $isTSUMEGOinFAVORITE != null);
401        ($this->setFunction)('suspiciousBehavior', $suspiciousBehavior);
402        ($this->setFunction)('isSandbox', $isSandbox);
403        ($this->setFunction)('goldenTsumego', $goldenTsumego);
404        $boardsBitmask = BoardSelector::filterValidBits(Auth::isLoggedIn() ? Auth::getUser()['boards_bitmask'] : BoardSelector::$DEFAULT_BOARDS_BITMASK);
405        ($this->setFunction)('boardSelection', BoardSelector::selectBoard($boardsBitmask, $goldenTsumego, $set['Set']['board_theme_index']));
406        ($this->setFunction)('fullHeart', $fullHeart);
407        ($this->setFunction)('emptyHeart', $emptyHeart);
408        ($this->setFunction)('libertyCount', $t['Tsumego']['libertyCount']);
409        ($this->setFunction)('semeaiType', $t['Tsumego']['semeaiType']);
410        ($this->setFunction)('insideLiberties', $t['Tsumego']['insideLiberties']);
411        ($this->setFunction)('doublexp', $doublexp);
412        ($this->setFunction)('half', $half);
413        ($this->setFunction)('set', $set);
414        if (Auth::isLoggedIn())($this->setFunction)('barPercent', Util::getPercent(Auth::getUser()['xp'], Level::getXPForNext(Auth::getUser()['level'])));
415        else
416        ($this->setFunction)('barPercent', 0);
417        ($this->setFunction)('t', $t);
418        ($this->setFunction)('solvedCheck', AppController::encrypt($t['Tsumego']['id'] . '-' . time()));
419        ($this->setFunction)('hash', $hash);
420        ($this->setFunction)('rating', Auth::getWithDefault('rating', 0));
421        ($this->setFunction)('eloScore', $eloScore);
422        ($this->setFunction)('eloScore2', $eloScore2);
423        ($this->setFunction)('eloScoreRounded', $eloScoreRounded);
424        ($this->setFunction)('eloScore2Rounded', $eloScore2Rounded);
425        ($this->setFunction)('activate', $activate);
426        ($this->setFunction)('tsumegoElo', $t['Tsumego']['rating']);
427        ($this->setFunction)('trs', $trs);
428        ($this->setFunction)('potion', $potion);
429        ($this->setFunction)('potionSuccess', $potionSuccess);
430        ($this->setFunction)('reviewCheat', $reviewCheat);
431        ($this->setFunction)('part', $t['Tsumego']['part']);
432        ($this->setFunction)('checkBSize', $checkBSize);
433        ($this->setFunction)('potionAlert', $potionAlert);
434        ($this->setFunction)('file', $file);
435        ($this->setFunction)('ui', $ui);
436        ($this->setFunction)('requestProblem', $requestProblem);
437        ($this->setFunction)('alternative_response', $t['Tsumego']['alternative_response']);
438        ($this->setFunction)('passEnabled', $t['Tsumego']['pass']);
439        ($this->setFunction)('achievementUpdate', $achievementUpdate);
440        ($this->setFunction)('setConnection', $currentSetConnection);
441        ($this->setFunction)('setConnections', $setConnections);
442        if (isset($params['url']['requestSolution']))($this->setFunction)('requestSolution', AdminActivityLogger::log(AdminActivityType::SOLUTION_REQUEST, $id));
443        ($this->setFunction)('startingPlayer', $startingPlayer);
444        ($this->setFunction)('tv', $tsumegoVariant);
445        ($this->setFunction)('tsumegoFilters', $tsumegoFilters);
446        ($this->setFunction)('queryTitle', $queryTitle);
447        ($this->setFunction)('amountOfOtherCollection', $amountOfOtherCollection);
448        ($this->setFunction)('checkNotInSearch', $checkNotInSearch);
449        ($this->setFunction)('tsumegoXPAndRating', new TsumegoXPAndRating($t['Tsumego'], $tsumegoStatus));
450
451        return null;
452    }
453
454    protected function getActivityValue($uid, $tid)
455    {
456        $return = [];
457        $tsumegoNum = 90;
458        $ra = ClassRegistry::init('TsumegoAttempt')->find('all', ['limit' => $tsumegoNum, 'order' => 'created DESC', 'conditions' => ['user_id' => $uid]]);
459        if (!$ra)
460            $ra = [];
461        if (count($ra) < $tsumegoNum)
462        {
463            $missing = $tsumegoNum - count($ra);
464            $raSize = count($ra);
465            $datex = new DateTime('-1 month');
466            while ($missing != 0)
467            {
468                $ra[$raSize]['TsumegoAttempt']['created'] = $datex->format('Y-m-d H:i:s');
469                $ra[$raSize]['TsumegoAttempt']['tsumego_id'] = 1;
470                $raSize++;
471                $missing--;
472            }
473        }
474        $date = date('Y-m-d H:i:s');
475        $x = [];
476        $avg = 0;
477        $foundTsumego = 0;
478        $raCount = count($ra);
479        for ($i = 0; $i < $raCount; $i++)
480        {
481            if ($ra[$i]['TsumegoAttempt']['tsumego_id'] == $tid)
482                $foundTsumego = 1;
483            $d = $this->getActivityValueSingle($ra[$i]['TsumegoAttempt']['created']);
484            $avg += $d;
485            array_push($x, $d);
486        }
487        $avg /= count($x);
488        $return[0] = round($avg);
489        $return[1] = $foundTsumego;
490
491        return $return;
492    }
493
494    private function getActivityValueSingle($date2)
495    {
496        $date1 = new DateTime('now');
497        $date2 = new DateTime($date2);
498        $interval = $date1->diff($date2);
499        $m = $interval->m;
500        $d = $interval->d;
501        $h = $interval->h;
502        $i = $interval->i;
503        $months = 0;
504        while ($m > 0)
505        {
506            $months += 672;
507            $m--;
508        }
509        $hours = $h;
510        while ($d > 0)
511        {
512            $hours += 24;
513            $d--;
514        }
515        $hours += $months;
516
517        return $hours;
518    }
519
520    public static function renderTitle($setConnection, $set, $tsumegoFilters, $tsumegoButtons, $amountOfOtherCollection, $difficulty, $timeMode, $queryTitle, $t)
521    {
522        if (Auth::isInTimeMode())
523            return '<font size="5px">' . $timeMode->currentOrder . ' of ' . $timeMode->overallCount . '</font>';
524
525        if (Auth::isInRatingMode())
526            return '<div class="slidecontainer">
527                        <input type="range" min="1" max="7" value="' . $difficulty . '" class="slider" id="rangeInput" name="rangeInput">
528                        <div id="sliderText">regular</div>
529                        </div>
530                        <a id="playTitleA" href=""></a>';
531
532        $order = $setConnection['SetConnection']['num'];
533        if ($tsumegoFilters->query == 'difficulty' || $tsumegoFilters->query == 'tags' || $tsumegoFilters->query == 'favorites')
534            return '<a id="playTitleA" href="/sets/view/' . $tsumegoFilters->getSetID($set['Set']['id']) . $tsumegoButtons->getPartitionLinkSuffix() . '">' . $queryTitle . '</a><br>
535                            <font style="font-weight:400;" color="grey">
536                                            <a style="color:grey;" id="playTitleA" href="/sets/view/' . $set['Set']['id'] . '">
537                                                (' . $set['Set']['title'] . ' ' . $order . '/' . $amountOfOtherCollection . ')
538                                            </a>
539                                        </font>';
540        return '<a id="playTitleA" href="/sets/view/' . $set['Set']['id'] . $tsumegoButtons->getPartitionLinkSuffix() . '">' . $set['Set']['title'] . ' ' . $tsumegoButtons->getPartitionTitleSuffix() . ' ' . $order . '/' . $tsumegoButtons->highestTsumegoOrder . '</a>';
541    }
542
543    private $setFunction;
544}