/**
  * @param Session $session
  * @param int $status
  * @return mixed[][]|mixed[]
  */
 protected function getColumns(Session $session, $status)
 {
     $coins = $session->getCoins();
     $this->coinsDelta = $session->getAndUpdateCoinsDelta();
     $skin = $session->getCurrentFaceSkin();
     return ["uid" => ["v" => $session->getUid(), "noupdate" => true], "name" => ["v" => strtolower($session->getPlayer()->getName())], "nicks" => "|" . implode("|", $session->getNicks()) . "|", "lastip" => $session->getPlayer()->getAddress(), "status" => $status, "lastses" => Settings::$LOCALIZE_CLASS, "authuuid" => $session->getPlayer()->getUniqueId(), "coins" => ["v" => $coins, "noupdate" => true], "hash" => ["v" => $session->getPasswordHash(), "noupdate" => true], "pwprefix" => ["v" => $session->getPasswordPrefix(), "noupdate" => true], "pwlen" => ["v" => $session->getPasswordLength(), "noupdate" => true], "registration" => ["v" => $session->getRegisterTime(), "noupdate" => true], "laston" => time(), "ontime" => (int) $session->getAndUpdateOntime(), "config" => $session->getAllSettings(), "skin1" => ["v" => substr($skin, 0, 128), "bin" => true], "skin2" => ["v" => substr($skin, 128, 128), "bin" => true], "lastgrind" => $session->getLastGrind(), "rank" => ["v" => $session->getRank(), "noupdate" => true], "warnpts" => $session->getWarningPoints(), "lastwarn" => $session->getLastWarnTime(), "tid" => $session->getTeamId(), "teamrank" => $session->getTeamRank(), "teamjoin" => $session->getTeamJoinTime(), "ignorelist" => "," . implode(",", $session->getIgnoreList()) . ","];
 }
 protected function run(array $args, Session $sender)
 {
     $lbl = func_get_arg(2);
     if (is_string($lbl) and $lbl !== "cg") {
         $sender->send(Phrases::CMD_GRIND_COIN_ADVICE);
     }
     if (!$sender->canStartGrind()) {
         return $sender->translate(Phrases::CMD_GRIND_COIN_CANNOT_START, ["time" => MUtils::time_secsToString($sender->getGrindWaitTime())]);
     }
     if (!$sender->confirmGrind) {
         $sender->confirmGrind = true;
         return $sender->translate(Phrases::CMD_GRIND_COIN_REQUEST_CONFIRM, ["length" => MUtils::time_secsToString(Settings::getGrindLength($sender->getRank())), "amplitude" => Settings::getGrindFactor($sender->getRank())]);
     }
     $sender->confirmGrind = false;
     $sender->startGrinding();
     return $sender->translate(Phrases::CMD_GRIND_COIN_STARTED);
 }