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

displayMessage()   A
last analyzed

Complexity

Conditions 5
Paths 8

Size

Total Lines 38
Code Lines 25

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 5
eloc 25
nc 8
nop 9
dl 0
loc 38
rs 9.2088
c 0
b 0
f 0

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php declare(strict_types=1);
2
3
namespace Smr\Pages\Player;
4
5
use AbstractSmrPlayer;
6
use Menu;
7
use Smr\Database;
8
use Smr\Epoch;
9
use Smr\Messages;
10
use Smr\Page\PlayerPage;
11
use Smr\Page\ReusableTrait;
12
use Smr\Session;
13
use Smr\Template;
14
use SmrAccount;
15
use SmrPlayer;
16
17
class MessageView extends PlayerPage {
18
19
	use ReusableTrait;
20
21
	public string $file = 'message_view.php';
22
23
	public function __construct(
24
		private readonly int $folderID,
25
		private readonly int $page = 0,
26
		private readonly bool $showAll = false
27
	) {}
28
29
	public function build(AbstractSmrPlayer $player, Template $template): void {
30
		$session = Session::getInstance();
31
32
		Menu::messages();
33
34
		$folderID = $this->folderID;
35
36
		$db = Database::getInstance();
37
		$whereClause = 'WHERE game_id = ' . $db->escapeNumber($player->getGameID());
38
		if ($folderID == MSG_SENT) {
39
			$whereClause .= ' AND sender_id = ' . $db->escapeNumber($player->getAccountID()) . '
40
							AND message_type_id = ' . $db->escapeNumber(MSG_PLAYER) . '
41
							AND sender_delete = ' . $db->escapeBoolean(false);
42
		} else {
43
			$whereClause .= ' AND account_id = ' . $db->escapeNumber($player->getAccountID()) . '
44
							AND message_type_id = ' . $db->escapeNumber($folderID) . '
45
							AND receiver_delete = ' . $db->escapeBoolean(false);
46
		}
47
48
		$messageBox = [];
49
		if ($folderID == MSG_SENT) {
50
			$messageBox['UnreadMessages'] = 0;
51
		} else {
52
			$dbResult = $db->read('SELECT count(*) as count
53
						FROM message ' . $whereClause . '
54
							AND msg_read = ' . $db->escapeBoolean(false));
55
			$messageBox['UnreadMessages'] = $dbResult->record()->getInt('count');
56
		}
57
		$dbResult = $db->read('SELECT count(*) as count FROM message ' . $whereClause);
58
		$messageBox['TotalMessages'] = $dbResult->record()->getInt('count');
59
		$messageBox['Type'] = $folderID;
60
61
		$page = $this->page;
62
63
		if ($page > 0) {
64
			$container = new self($this->folderID, $page - 1, $this->showAll);
65
			$template->assign('PreviousPageHREF', $container->href());
66
		}
67
		if (($page + 1) * MESSAGES_PER_PAGE < $messageBox['TotalMessages']) {
68
			$container = new self($this->folderID, $page + 1, $this->showAll);
69
			$template->assign('NextPageHREF', $container->href());
70
		}
71
72
		$messageBox['Name'] = Messages::getMessageTypeNames($folderID);
73
		$template->assign('PageTopic', 'Viewing ' . $messageBox['Name']);
0 ignored issues
show
Bug introduced by
Are you sure $messageBox['Name'] of type array<integer,string>|string can be used in concatenation? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

73
		$template->assign('PageTopic', 'Viewing ' . /** @scrutinizer ignore-type */ $messageBox['Name']);
Loading history...
74
75
		if ($messageBox['Type'] == MSG_GLOBAL || $messageBox['Type'] == MSG_SCOUT) {
76
			$container = new MessagePreferenceProcessor($folderID);
77
			$template->assign('PreferencesFormHREF', $container->href());
78
		}
79
80
		$container = new MessageDeleteProcessor($folderID);
81
		$messageBox['DeleteFormHref'] = $container->href();
82
83
		$dbResult = $db->read('SELECT * FROM message ' .
84
					$whereClause . '
85
					ORDER BY send_time DESC
86
					LIMIT ' . ($page * MESSAGES_PER_PAGE) . ', ' . MESSAGES_PER_PAGE);
87
88
		$messageBox['NumberMessages'] = $dbResult->getNumRecords();
89
		$messageBox['Messages'] = [];
90
91
		// Group scout messages if they wouldn't fit on a single page
92
		if ($folderID == MSG_SCOUT && !$this->showAll && $messageBox['TotalMessages'] > $player->getScoutMessageGroupLimit()) {
93
			// get rid of all old scout messages (>48h)
94
			$db->write('DELETE FROM message WHERE expire_time < ' . $db->escapeNumber(Epoch::time()) . ' AND message_type_id = ' . $db->escapeNumber(MSG_SCOUT));
95
96
			$dispContainer = new self(MSG_SCOUT, showAll: true);
97
			$messageBox['ShowAllHref'] = $dispContainer->href();
98
99
			displayScouts($messageBox, $player);
100
			$template->unassign('NextPageHREF'); // always displaying all scout messages?
101
		} else {
102
			foreach ($dbResult->records() as $dbRecord) {
103
				$messageBox['Messages'][] = displayMessage($dbRecord->getInt('message_id'), $dbRecord->getInt('account_id'), $dbRecord->getInt('sender_id'), $player->getGameID(), $dbRecord->getString('message_text'), $dbRecord->getInt('send_time'), $dbRecord->getBoolean('msg_read'), $folderID, $player->getAccount());
104
			}
105
		}
106
107
		// This should really be part of a (pre)processing page
108
		if ($page == 0 && !$session->ajax) {
109
			$player->setMessagesRead($folderID);
110
		}
111
112
		$template->assign('MessageBox', $messageBox);
113
	}
114
115
}
116
117
118
/**
119
 * @param array<string, mixed> $messageBox
120
 */
121
function displayScouts(array &$messageBox, AbstractSmrPlayer $player): void {
122
	// Generate the group messages
123
	$db = Database::getInstance();
124
	$dbResult = $db->read('SELECT player.*, count( message_id ) AS number, min( send_time ) as first, max( send_time) as last, sum(msg_read=\'FALSE\') as total_unread
125
					FROM message
126
					JOIN player ON player.account_id = message.sender_id AND message.game_id = player.game_id
127
					WHERE message.account_id = ' . $db->escapeNumber($player->getAccountID()) . '
128
					AND player.game_id = ' . $db->escapeNumber($player->getGameID()) . '
129
					AND message_type_id = ' . $db->escapeNumber(MSG_SCOUT) . '
130
					AND receiver_delete = ' . $db->escapeBoolean(false) . '
131
					GROUP BY sender_id
132
					ORDER BY last DESC');
133
134
	foreach ($dbResult->records() as $dbRecord) {
135
		$sender = SmrPlayer::getPlayer($dbRecord->getInt('account_id'), $player->getGameID(), false, $dbRecord);
136
		$totalUnread = $dbRecord->getInt('total_unread');
137
		$message = 'Your forces have spotted ' . $sender->getBBLink() . ' passing your forces ' . pluralise($dbRecord->getInt('number'), 'time');
138
		$message .= ($totalUnread > 0) ? ' (' . $totalUnread . ' unread).' : '.';
139
		$messageBox['Messages'][] = displayGrouped($sender, $message, $dbRecord->getInt('first'), $dbRecord->getInt('last'), $totalUnread > 0, $player->getAccount());
140
	}
141
142
	// Now display individual messages in each group
143
	// Perform a single query to minimize query overhead
144
	$dbResult = $db->read('SELECT message_id, account_id, sender_id, message_text, send_time, msg_read
145
					FROM message
146
					WHERE account_id = ' . $db->escapeNumber($player->getAccountID()) . '
147
					AND game_id = ' . $db->escapeNumber($player->getGameID()) . '
148
					AND message_type_id = ' . $db->escapeNumber(MSG_SCOUT) . '
149
					AND receiver_delete = ' . $db->escapeBoolean(false) . '
150
					ORDER BY send_time DESC');
151
	foreach ($dbResult->records() as $dbRecord) {
152
		$groupBox =& $messageBox['GroupedMessages'][$dbRecord->getInt('sender_id')];
153
		// Limit the number of messages in each group
154
		if (!isset($groupBox['Messages']) || count($groupBox['Messages']) < MESSAGE_SCOUT_GROUP_LIMIT) {
155
			$groupBox['Messages'][] = displayMessage($dbRecord->getInt('message_id'), $dbRecord->getInt('account_id'), $dbRecord->getInt('sender_id'), $player->getGameID(), $dbRecord->getString('message_text'), $dbRecord->getInt('send_time'), $dbRecord->getBoolean('msg_read'), MSG_SCOUT, $player->getAccount());
156
		}
157
	}
158
159
	// In the default view (groups), we're always displaying all messages
160
	$messageBox['NumberMessages'] = $dbResult->getNumRecords();
161
}
162
163
/**
164
 * @return array<string, mixed>
165
 */
166
function displayGrouped(AbstractSmrPlayer $sender, string $message_text, int $first, int $last, bool $star, SmrAccount $displayAccount): array {
167
	// Define a unique array so we can delete grouped messages
168
	$array = [
169
		$sender->getAccountID(),
170
		$first,
171
		$last,
172
	];
173
174
	$message = [];
175
	$message['ID'] = base64_encode(serialize($array));
176
	$message['Unread'] = $star;
177
	$message['SenderID'] = $sender->getAccountID();
178
	$message['SenderDisplayName'] = $sender->getLinkedDisplayName(false);
179
	$message['SendTime'] = date($displayAccount->getDateTimeFormat(), $first) . ' - ' . date($displayAccount->getDateTimeFormat(), $last);
180
	$message['Text'] = $message_text;
181
	return $message;
182
}
183
184
/**
185
 * @return array<string, mixed>
186
 */
187
function displayMessage(int $message_id, int $receiver_id, int $sender_id, int $game_id, string $message_text, int $send_time, bool $msg_read, int $type, SmrAccount $displayAccount): array {
188
	$message = [];
189
	$message['ID'] = $message_id;
190
	$message['Text'] = $message_text;
191
	$message['Unread'] = !$msg_read;
192
	$message['SendTime'] = date($displayAccount->getDateTimeFormat(), $send_time);
193
194
	// Display the sender (except for scout messages)
195
	if ($type != MSG_SCOUT) {
196
		$sender = Messages::getMessagePlayer($sender_id, $game_id, $type);
197
		if ($sender instanceof AbstractSmrPlayer) {
0 ignored issues
show
introduced by
$sender is never a sub-type of AbstractSmrPlayer.
Loading history...
198
			$message['Sender'] = $sender;
199
			$container = new SearchForTraderResult($sender->getPlayerID());
200
			$message['SenderDisplayName'] = create_link($container, $sender->getDisplayName());
201
202
			// Add actions that we can take on messages sent by other players.
203
			if ($type != MSG_SENT) {
204
				$container = new MessageReportConfirm($type, $message_id);
205
				$message['ReportHref'] = $container->href();
206
207
				$container = new MessageBlacklistAddProcessor($sender_id);
208
				$message['BlacklistHref'] = $container->href();
209
210
				$container = new MessageSend($sender->getAccountID());
211
				$message['ReplyHref'] = $container->href();
212
			}
213
		} else {
214
			$message['SenderDisplayName'] = $sender;
215
		}
216
	}
217
218
	if ($type == MSG_SENT) {
219
		$receiver = SmrPlayer::getPlayer($receiver_id, $game_id);
220
		$container = new SearchForTraderResult($receiver->getPlayerID());
221
		$message['ReceiverDisplayName'] = create_link($container, $receiver->getDisplayName());
222
	}
223
224
	return $message;
225
}
226