Scrutinizer GitHub App not installed

We could not synchronize checks via GitHub's checks API since Scrutinizer's GitHub App is not installed for this repository.

Install GitHub App

Completed
Push — live ( a21a05...18f3f5 )
by Dan
20s queued 16s
created

Rankings::collectSectorRankings()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 19
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 13
nc 3
nop 4
dl 0
loc 19
rs 9.8333
c 0
b 0
f 0
1
<?php declare(strict_types=1);
2
3
class Rankings {
4
5
	/**
6
	 * @param array<int, Smr\DatabaseRecord> $rankedStats
7
	 */
8
	public static function collectSectorRankings(array $rankedStats, AbstractSmrPlayer $player, int $minRank = 1, int $maxRank = 10) : array {
9
		$rankedStats = self::filterRanks($rankedStats, $minRank, $maxRank);
10
		$currRank = $minRank;
11
12
		$rankings = [];
13
		foreach ($rankedStats as $sectorID => $dbRecord) {
14
			if ($player->getSectorID() == $sectorID) {
15
				$class = ' class="bold"';
16
			} else {
17
				$class = '';
18
			}
19
20
			$rankings[$currRank++] = [
21
				'Class' => $class,
22
				'SectorID' => $sectorID,
23
				'Value' => $dbRecord->getInt('amount'),
24
			];
25
		}
26
		return $rankings;
27
	}
28
29
	/**
30
	 * @param array<int, Smr\DatabaseRecord> $rankedStats
31
	 */
32
	public static function collectRaceRankings(array $rankedStats, AbstractSmrPlayer $player) : array {
33
		$currRank = 1;
34
		$rankings = [];
35
		foreach ($rankedStats as $raceID => $dbRecord) {
36
			if ($player->getRaceID() == $raceID) {
37
				$style = ' class="bold"';
38
			} else {
39
				$style = '';
40
			}
41
42
			$rankings[$currRank++] = [
43
				'style' => $style,
44
				'race_id' => $raceID,
45
				'amount' => $dbRecord->getInt('amount'),
46
				'amount_avg' => IRound($dbRecord->getInt('amount') / $dbRecord->getInt('num_players')),
47
				'num_players' => $dbRecord->getInt('num_players'),
48
			];
49
		}
50
		return $rankings;
51
	}
52
53
	/**
54
	 * @param array<int, Smr\DatabaseRecord> $rankedStats
55
	 */
56
	public static function collectAllianceRankings(array $rankedStats, AbstractSmrPlayer $player, int $minRank = 1, $maxRank = 10) : array {
57
		$rankedStats = self::filterRanks($rankedStats, $minRank, $maxRank);
58
		$currRank = $minRank;
59
60
		$rankings = array();
61
		foreach ($rankedStats as $allianceID => $dbRecord) {
62
			$currentAlliance = SmrAlliance::getAlliance($allianceID, $player->getGameID());
63
64
			$class = '';
65
			if ($player->getAllianceID() == $currentAlliance->getAllianceID()) {
66
				$class = ' class="bold"';
67
			} elseif ($currentAlliance->hasDisbanded()) {
68
				$class = ' class="red"';
69
			}
70
71
			$rankings[$currRank++] = array(
72
				'Alliance' => $currentAlliance,
73
				'Class' => $class,
74
				'Value' => $dbRecord->getInt('amount'),
75
			);
76
		}
77
		return $rankings;
78
	}
79
80
	/**
81
	 * @param array<int, Smr\DatabaseRecord> $rankedStats
82
	 */
83
	public static function collectRankings(array $rankedStats, AbstractSmrPlayer $player, int $minRank = 1, $maxRank = 10) : array {
84
		$rankedStats = self::filterRanks($rankedStats, $minRank, $maxRank);
85
		$currRank = $minRank;
86
87
		$rankings = array();
88
		foreach ($rankedStats as $dbRecord) {
89
			$currentPlayer = SmrPlayer::getPlayer($dbRecord->getInt('account_id'), $player->getGameID(), false, $dbRecord);
90
91
			$class = '';
92
			if ($player->equals($currentPlayer)) {
93
				$class .= 'bold';
94
			}
95
			if ($currentPlayer->hasNewbieStatus()) {
96
				$class .= ' newbie';
97
			}
98
			if ($class != '') {
99
				$class = ' class="' . trim($class) . '"';
100
			}
101
102
			$rankings[$currRank++] = array(
103
				'Player' => $currentPlayer,
104
				'Class' => $class,
105
				'Value' => $dbRecord->getInt('amount'),
106
			);
107
		}
108
		return $rankings;
109
	}
110
111
	private static function filterRanks(array $rankedStats, int $minRank, int $maxRank) : array {
112
		$offset = $minRank - 1;
113
		$length = $maxRank - $offset;
114
		return array_slice($rankedStats, $offset, $length, preserve_keys: true);
115
	}
116
117
	/**
118
	 * Get stats from the player table grouped by race and sorted by $stat (high to low).
119
	 *
120
	 * @return array<int, Smr\DatabaseRecord>
121
	 */
122
	public static function raceStats(string $stat, int $gameID) : array {
123
		$db = Smr\Database::getInstance();
124
		$raceStats = [];
125
		$dbResult = $db->read('SELECT race_id, COALESCE(SUM(' . $stat . '), 0) as amount, count(*) as num_players FROM player WHERE game_id = ' . $db->escapeNumber($gameID) . ' GROUP BY race_id ORDER BY amount DESC');
126
		foreach ($dbResult->records() as $dbRecord) {
127
			$raceStats[$dbRecord->getInt('race_id')] = $dbRecord;
128
		}
129
		return $raceStats;
130
	}
131
132
	/**
133
	 * Get stats from the player table sorted by $stat (high to low).
134
	 *
135
	 * @return array<int, Smr\DatabaseRecord>
136
	 */
137
	public static function playerStats(string $stat, int $gameID) : array {
138
		$db = Smr\Database::getInstance();
139
		$playerStats = [];
140
		$dbResult = $db->read('SELECT player.*, ' . $stat . ' AS amount FROM player WHERE game_id = ' . $db->escapeNumber($gameID) . ' ORDER BY amount DESC, player_name');
141
		foreach ($dbResult->records() as $dbRecord) {
142
			$playerStats[$dbRecord->getInt('player_id')] = $dbRecord;
143
		}
144
		return $playerStats;
145
	}
146
147
	/**
148
	 * Gets player stats from the hof table sorted by $category (high to low).
149
	 *
150
	 * @return array<int, Smr\DatabaseRecord>
151
	 */
152
	public static function playerStatsFromHOF(array $category, int $gameID) : array {
153
		$db = Smr\Database::getInstance();
154
		$playerStats = [];
155
		$dbResult = $db->read('SELECT p.*, COALESCE(ph.amount,0) amount FROM player p LEFT JOIN player_hof ph ON p.account_id = ph.account_id AND p.game_id = ph.game_id AND ph.type = ' . $db->escapeArray($category, ':', false) . ' WHERE p.game_id = ' . $db->escapeNumber($gameID) . ' ORDER BY amount DESC, player_name');
156
		foreach ($dbResult->records() as $dbRecord) {
157
			$playerStats[$dbRecord->getInt('player_id')] = $dbRecord;
158
		}
159
		return $playerStats;
160
	}
161
162
	/**
163
	 * Get stats from the alliance table sorted by $stat (high to low).
164
	 *
165
	 * @return array<int, Smr\DatabaseRecord>
166
	 */
167
	public static function allianceStats(string $stat, int $gameID) : array {
168
		$db = Smr\Database::getInstance();
169
		$allianceStats = [];
170
		$dbResult = $db->read('SELECT alliance_id, alliance_' . $stat . ' AS amount FROM alliance WHERE game_id = ' . $db->escapeNumber($gameID) . ' ORDER BY amount DESC, alliance_name');
171
		foreach ($dbResult->records() as $dbRecord) {
172
			$allianceStats[$dbRecord->getInt('alliance_id')] = $dbRecord;
173
		}
174
		return $allianceStats;
175
	}
176
177
	/**
178
	 * Given a $rankedStats array returned by one of the stats functions,
179
	 * find the rank associated with a specific ID.
180
	 */
181
	public static function ourRank(array $rankedStats, int $ourID) : int {
182
		return array_search($ourID, array_keys($rankedStats)) + 1;
183
	}
184
185
	public static function calculateMinMaxRanks(int $ourRank, int $totalRanks) : array {
186
		$session = Smr\Session::getInstance();
187
		$minRank = $session->getRequestVarInt('min_rank', $ourRank - 5);
188
		$maxRank = $session->getRequestVarInt('max_rank', $ourRank + 5);
189
190
		if ($minRank <= 0 || $minRank > $totalRanks) {
191
			$minRank = 1;
192
		}
193
194
		$maxRank = min($maxRank, $totalRanks);
195
196
		$template = Smr\Template::getInstance();
197
		$template->assign('MinRank', $minRank);
198
		$template->assign('MaxRank', $maxRank);
199
		$template->assign('TotalRanks', $totalRanks);
200
201
		return [$minRank, $maxRank];
202
	}
203
}
204