Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
79.55% covered (warning)
79.55%
70 / 88
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
HeroController
79.31% covered (warning)
79.31%
69 / 87
0.00% covered (danger)
0.00%
0 / 5
19.56
0.00% covered (danger)
0.00%
0 / 1
 refinement
91.43% covered (success)
91.43%
32 / 35
0.00% covered (danger)
0.00%
0 / 1
6.02
 sprint
75.00% covered (warning)
75.00%
6 / 8
0.00% covered (danger)
0.00%
0 / 1
2.06
 intuition
71.43% covered (warning)
71.43%
5 / 7
0.00% covered (danger)
0.00%
0 / 1
2.09
 rejuvenation
81.82% covered (warning)
81.82%
9 / 11
0.00% covered (danger)
0.00%
0 / 1
2.02
 revelation
65.38% covered (warning)
65.38%
17 / 26
0.00% covered (danger)
0.00%
0 / 1
6.04
1<?php
2
3App::uses('ForbiddenException', 'Routing/Error');
4
5class HeroController extends AppController
6{
7    public function refinement()
8    {
9        if (!Auth::isLoggedIn())
10            return $this->redirect('/users/login');
11        if (Auth::getUser()['used_refinement'])
12            throw new ForbiddenException("Refinement is already used up.");
13
14        $queryWithoutRankLimit = "SELECT "
15                . "set_connection.id as set_connection_id, tsumego.id as tsumego_id "
16                . " FROM tsumego"
17                . " JOIN set_connection ON set_connection.tsumego_id=tsumego.id"
18                . " JOIN `set` ON `set`.id=set_connection.set_id"
19                . " WHERE tsumego.deleted is null AND set.public = 1";
20
21        // first we try to select golden tsumego with proper rating relative to user
22        $setConnectionIDs = Util::query($queryWithoutRankLimit . " AND tsumego.rating >= ? AND tsumego.rating <= ?",
23            [
24                Auth::getUser()['rating'] - Constants::$GOLDEN_TSUMEGO_LOWER_RELATIVE_RATING_LIMIT,
25                Auth::getUser()['rating'] + Constants::$GOLDEN_TSUMEGO_UPPER_RELATIVE_RATING_LIMIT
26            ]);
27
28        // if it fails, we try to select "some" tsumego
29        if (empty($setConnectionIDs))
30            $setConnectionIDs = Util::query($queryWithoutRankLimit);
31        if (empty($setConnectionIDs))
32            throw new Exception("No valid tsumego to choose from.");
33        $setConnection = $setConnectionIDs[rand(0, count($setConnectionIDs) - 1)];
34        $tsumegoStatus = ClassRegistry::init('TsumegoStatus')->find('first', ['conditions' => [
35            'tsumego_id' => $setConnection['tsumego_id'],
36            'user_id' => Auth::getUserID()]]);
37        if (!$tsumegoStatus)
38        {
39            ClassRegistry::init('TsumegoStatus')->create();
40            $tsumegoStatus = [];
41            $tsumegoStatus['user_id'] = Auth::getUserID();
42            $tsumegoStatus['tsumego_id'] = $setConnection['tsumego_id'];
43        }
44        else
45            $tsumegoStatus = $tsumegoStatus['TsumegoStatus'];
46        $tsumegoStatus['created'] = date('Y-m-d H:i:s');
47        $tsumegoStatus['status'] = 'G';
48        ClassRegistry::init('TsumegoStatus')->save($tsumegoStatus);
49        Auth::getUser()['used_refinement'] = 1;
50        Auth::saveUser();
51        return $this->redirect('/' . $setConnection['set_connection_id']);
52    }
53
54    public function sprint()
55    {
56        if (!HeroPowers::canUseSprint())
57        {
58            $this->response->statusCode(403);
59            return $this->response;
60        }
61        Auth::getUser()['sprint_start'] = date('Y-m-d H:i:s');
62        Auth::getUser()['used_sprint'] = 1;
63        Auth::saveUser();
64        $this->response->statusCode(200);
65        return $this->response;
66    }
67
68    public function intuition()
69    {
70        if (!HeroPowers::canUseIntuition())
71        {
72            $this->response->statusCode(403);
73            return $this->response;
74        }
75        Auth::getUser()['used_intuition'] = 1;
76        Auth::saveUser();
77        $this->response->statusCode(200);
78        return $this->response;
79    }
80
81    public function rejuvenation()
82    {
83        if (!HeroPowers::canUseRejuvanation())
84        {
85            $this->response->statusCode(403);
86            return $this->response;
87        }
88        Auth::getUser()['used_rejuvenation'] = 1;
89        Auth::getUser()['used_intuition'] = 0;
90        Auth::getUser()['damage'] = 0;
91        Auth::saveUser();
92
93        ClassRegistry::init('TsumegoStatus')->query("UPDATE tsumego_status SET status='V' WHERE status='F' AND user_id=" . Auth::getUserID());
94        ClassRegistry::init('TsumegoStatus')->query("UPDATE tsumego_status SET status='W' WHERE status='X' AND user_id=" . Auth::getUserID());
95
96        $this->response->statusCode(200);
97        return $this->response;
98    }
99
100    public function revelation($tsumegoID)
101    {
102        if (!Auth::isLoggedIn())
103        {
104            $this->response->body('Not logged in.');
105            $this->response->statusCode(403);
106            return $this->response;
107        }
108
109        if (!HeroPowers::canUseRevelation())
110        {
111            $this->response->body('Revelation is used up today.');
112            $this->response->statusCode(403);
113            return $this->response;
114        }
115        $tsumego = ClassRegistry::init('Tsumego')->findById($tsumegoID);
116        if (!$tsumego)
117        {
118            $this->response->statusCode(403);
119            return $this->response;
120        }
121
122        $previousTsumegoStatus = ClassRegistry::init('TsumegoStatus')->find('first', ['conditions' => ['user_id' => Auth::getUserID(), 'tsumego_id' => $tsumegoID]]);
123        if (!$previousTsumegoStatus)
124        {
125            $previousTsumegoStatus = [];
126            $previousTsumegoStatus['user_id'] = Auth::getUserID();
127            $previousTsumegoStatus['tsumego_id'] = $tsumegoID;
128            ClassRegistry::init('TsumegoStatus')->create();
129        }
130        else
131            $previousTsumegoStatus = $previousTsumegoStatus['TsumegoStatus'];
132
133        $previousTsumegoStatus['created'] = date('Y-m-d H:i:s');
134        $previousTsumegoStatus['status'] = 'S';
135        ClassRegistry::init('TsumegoStatus')->save($previousTsumegoStatus);
136
137        Auth::getUser()['used_revelation']++;
138        Auth::saveUser();
139
140        $this->response->statusCode(200);
141        return $this->response;
142    }
143}