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

Issues (412)

src/pages/Player/MessageView.php (2 issues)

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
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
$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