PocketMine-MP 5.39.3 git-400eb2dddf91a9c112aa09f3b498ffc8c85e98ed
Loading...
Searching...
No Matches
StatusCommand.php
1<?php
2
3/*
4 *
5 * ____ _ _ __ __ _ __ __ ____
6 * | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
7 * | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
8 * | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
9 * |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
10 *
11 * This program is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License as published by
13 * the Free Software Foundation, either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * @author PocketMine Team
17 * @link http://www.pocketmine.net/
18 *
19 *
20 */
21
22declare(strict_types=1);
23
24namespace pocketmine\command\defaults;
25
32use function count;
33use function floor;
34use function microtime;
35use function number_format;
36use function round;
37use function strval;
38
40
41 public function __construct(){
42 parent::__construct(
43 "status",
44 l10n::pocketmine_command_status_description()
45 );
46 $this->setPermission(DefaultPermissionNames::COMMAND_STATUS);
47 }
48
49 private static function send(CommandSender $sender, Translatable $message) : void{
50 $sender->sendMessage($message->prefix(TextFormat::GOLD));
51 }
52
53 private static function formatTPS(float $tps, float $usage, string $tpsColor) : Translatable{
54 return l10n::pocketmine_command_status_tps_stat(strval($tps), strval($usage))->prefix($tpsColor);
55 }
56
57 private static function formatBandwidth(float $bytes) : Translatable{
58 //TODO: this should probably be number formatted?
59 return l10n::pocketmine_command_status_network_stat(strval(round($bytes / 1024, 2)))->prefix(TextFormat::RED);
60 }
61
62 private static function formatMemory(int $bytes) : Translatable{
63 return l10n::pocketmine_command_status_memory_stat(number_format(round(($bytes / 1024) / 1024, 2), 2))->prefix(TextFormat::RED);
64 }
65
66 public function execute(CommandSender $sender, string $commandLabel, array $args){
68
69 $server = $sender->getServer();
70 $sender->sendMessage(l10n::pocketmine_command_status_header()->format(
71 TextFormat::GREEN . "---- " . TextFormat::RESET,
72 TextFormat::GREEN . " ----" . TextFormat::RESET
73 ));
74
75 $time = (int) (microtime(true) - $server->getStartTime());
76
77 $seconds = strval($time % 60);
78 if($time >= 60){
79 $minutes = strval(floor(($time % 3600) / 60));
80 if($time >= 3600){
81 $hours = strval(floor(($time % (3600 * 24)) / 3600));
82 $message = $time >= 3600 * 24 ?
83 l10n::pocketmine_command_status_uptime_days(strval(floor($time / (3600 * 24))), $hours, $minutes, $seconds) :
84 l10n::pocketmine_command_status_uptime_hours($hours, $minutes, $seconds);
85 }else{
86 $message = l10n::pocketmine_command_status_uptime_minutes($minutes, $seconds);
87 }
88 }else{
89 $message = l10n::pocketmine_command_status_uptime_seconds($seconds);
90 }
91
92 self::send($sender, l10n::pocketmine_command_status_uptime($message->prefix(TextFormat::RED)));
93
94 $tpsColor = TextFormat::GREEN;
95 $tps = $server->getTicksPerSecond();
96 if($tps < 12){
97 $tpsColor = TextFormat::RED;
98 }elseif($tps < 17){
99 $tpsColor = TextFormat::GOLD;
100 }
101
102 self::send($sender, l10n::pocketmine_command_status_tps_current(self::formatTPS($tps, $server->getTickUsage(), $tpsColor)));
103 self::send($sender, l10n::pocketmine_command_status_tps_average(self::formatTPS($server->getTicksPerSecondAverage(), $server->getTickUsageAverage(), $tpsColor)));
104
105 $bandwidth = $server->getNetwork()->getBandwidthTracker();
106 self::send($sender, l10n::pocketmine_command_status_network_upload(self::formatBandwidth($bandwidth->getSend()->getAverageBytes())));
107 self::send($sender, l10n::pocketmine_command_status_network_download(self::formatBandwidth($bandwidth->getReceive()->getAverageBytes())));
108
109 self::send($sender, l10n::pocketmine_command_status_threads(TextFormat::RED . Process::getThreadCount()));
110
111 self::send($sender, l10n::pocketmine_command_status_memory_mainThread(self::formatMemory($mUsage[0])));
112 self::send($sender, l10n::pocketmine_command_status_memory_total(self::formatMemory($mUsage[1])));
113 self::send($sender, l10n::pocketmine_command_status_memory_virtual(self::formatMemory($mUsage[2])));
114
115 $globalLimit = $server->getMemoryManager()->getGlobalMemoryLimit();
116 if($globalLimit > 0){
117 self::send($sender, l10n::pocketmine_command_status_memory_manager(self::formatMemory($globalLimit)));
118 }
119
120 foreach($server->getWorldManager()->getWorlds() as $world){
121 $worldName = $world->getFolderName() !== $world->getDisplayName() ? " (" . $world->getDisplayName() . ")" : "";
122 $timeColor = $world->getTickRateTime() > 40 ? TextFormat::RED : TextFormat::YELLOW;
123 self::send($sender, l10n::pocketmine_command_status_world(
124 "\"{$world->getFolderName()}\"$worldName",
125 TextFormat::RED . number_format(count($world->getLoadedChunks())) . TextFormat::GREEN,
126 TextFormat::RED . number_format(count($world->getTickingChunks())) . TextFormat::GREEN,
127 TextFormat::RED . number_format(count($world->getEntities())) . TextFormat::GREEN,
128 l10n::pocketmine_command_status_world_timeStat(strval(round($world->getTickRateTime(), 2)))->prefix($timeColor)
129 ));
130 }
131
132 return true;
133 }
134}
execute(CommandSender $sender, string $commandLabel, array $args)
static getAdvancedMemoryUsage()
Definition Process.php:55