/**
  * @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()) . ","];
 }
 public function onCompletion(Server $server)
 {
     $friends = [Session::FRIEND_LEVEL_NONE => [], Session::FRIEND_LEVEL_ACQUAINTANCE => [], Session::FRIEND_LEVEL_GOOD_FRIEND => [], Session::FRIEND_LEVEL_BEST_FRIEND => []];
     if ($this->session->getPlayer()->isOnline()) {
         $result = $this->getResult()["result"];
         foreach ($result as $row) {
             $type = $row["type"];
             $nick = array_filter(explode("|", $row["nicks"]))[0];
             $isOnline = $server->getPlayerExact($nick) instanceof Player;
             $class = $type & ~Session::FRIEND_BITMASK_REQUEST;
             $req = $type & Session::FRIEND_BITMASK_REQUEST;
             if ($isOnline) {
                 $nick = TextFormat::GREEN . "*" . TextFormat::WHITE . $nick;
             }
             if ($req === Session::FRIEND_IN) {
                 $nick .= TextFormat::GOLD . ">";
             } elseif ($req === Session::FRIEND_OUT) {
                 $nick .= TextFormat::DARK_AQUA . "<";
             }
             $nick .= TextFormat::WHITE;
             $friends[$class][] = $nick;
         }
         $this->session->send(Phrases::CMD_FRIEND_LIST_KEY);
         $this->session->sendCurlyLines();
         foreach ($friends as $class => $list) {
             $type = $this->session->translate(Session::$FRIEND_TYPES[$class]);
             $this->session->setMaintainedPopup(TextFormat::BLUE . $type . ": " . implode(TextFormat::WHITE . ":", $list));
         }
         $this->session->sendCurlyLines();
     }
 }
 public function run(array $args, Session $session)
 {
     if (strtolower($args[0]) == "local") {
         if ($session->getCurrentChatState() === Session::CHANNEL_LOCAL) {
             $session->getPlayer()->sendMessage(TextFormat::RED . "The channel state is already local");
         } else {
             $session->currentChatState = Session::CHANNEL_LOCAL;
         }
     }
     if (strtolower($args[0]) == "team") {
         if ($session->getCurrentChatState() === Session::CHANNEL_TEAM) {
             $session->getPlayer()->sendMessage(TextFormat::RED . "The channel state is already the team");
         } else {
             $session->currentChatState = Session::CHANNEL_TEAM;
         }
     }
     if (strtolower($args[0]) == "create") {
         if (isset($args[1])) {
             $session->joinChannel($args[1]);
             $session->getPlayer()->sendMessage(TextFormat::AQUA . $args[1] . "has been created!");
         } else {
             $session->getPlayer()->sendMessage(TextFormat::RED . "Please specify a channel to be created");
         }
     }
 }
 protected function run(array $args, Session $sender)
 {
     if ($sender->getTeamId() === -1) {
         return $sender->translate(Phrases::CMD_TEAM_ERR_NOT_IN_TEAM);
     }
     if (!$sender->confirmQuitTeam) {
         $sender->confirmQuitTeam = true;
         return $sender->getTeamRank() === Settings::TEAM_RANK_LEADER ? $sender->translate(Phrases::CMD_TEAM_QUIT_WARNING_LEADER) : ($sender->getTeamRank() === Settings::TEAM_RANK_JUNIOR ? $sender->translate(Phrases::CMD_TEAM_QUIT_WARNING_JUNIOR) : $sender->translate(Phrases::CMD_TEAM_QUIT_WARNING_NORMAL));
     }
     if ($sender->getTeamRank() === 4) {
         $prop = Hormone::get($this->getMain(), Hormone::TEAM_DISBAND_PROPAGANDA, $sender->getInGameName(), "Team disbanded by owner /tq", Settings::CLASS_ALL, ["tid" => $sender->getTeamId()]);
         $prop->release();
         new RawAsyncQuery($this->getMain(), "UPDATE users SET tid=-1,teamrank=0,teamjoin=0,teampts=0 WHERE tid={$sender->getTeamId()}");
         new RawAsyncQuery($this->getMain(), "DELETE FROM teams WHERE tid=" . $sender->getTeamId());
         return true;
     }
     $type = Hormone::get($this->getMain(), Hormone::TEAM_CHAT, "Network", "%tr%" . Phrases::CMD_TEAM_QUITTED, Settings::CLASS_ALL, ["tid" => $sender->getTeamId(), "teamName" => $sender->getTeamName(), "ign" => "Network", "data" => ["name" => $sender->getPlayer()->getName(), "teamname" => $sender->getTeamName()]]);
     $type->release();
     $sender->setLoginDatum("tid", -1);
     $sender->setLoginDatum("teamname", null);
     $sender->setLoginDatum("teamrank", 0);
     $sender->setLoginDatum("teamjoin", 0);
     $sender->setLoginDatum("teampts", 0);
     return $sender->translate(Phrases::CMD_TEAM_QUITTED);
 }
 public function detectCaps(&$string)
 {
     if (strtoupper($string) === $string and strtolower($string) !== $string) {
         $string = strtolower($string);
         $type = Hormone::get($this->session->getMain(), Hormone::CONSOLE_MESSAGE, "{BOT}CapsDetector", Phrases::VAR_notify2 . "Player {$this->session->getPlayer()->getName()}@" . Settings::$LOCALIZE_IP . ":" . Settings::$LOCALIZE_PORT . " said: " . $string . " (automatically de-capitalized)", Settings::CLASS_ALL, ["ip" => Settings::$LOCALIZE_IP, "port" => Settings::$LOCALIZE_PORT]);
         $type->release();
     }
 }
 protected function run(array $args, Session $sender)
 {
     if (Settings::$LOCALIZE_CLASS === $this->class) {
         return TextFormat::RED . "You are already in {$this->human}!";
     }
     $this->getPlugin()->transferGame($sender->getPlayer(), $this->class);
     return TextFormat::AQUA . "Finding an available " . MUtils::word_addSingularArticle($this->human) . " server for you...";
 }
 public function __construct(BasePlugin $main, Session $issuer, $name)
 {
     $this->issuerName = $issuer->getPlayer()->getName();
     $this->issuerUid = $issuer->getUid();
     $this->tid = $issuer->getTeamId();
     $this->teamName = $issuer->getTeamName();
     $this->queriedTargetName = $name;
     parent::__construct($main);
 }
 protected function run(array $args, Session $sender)
 {
     if (!isset($args[0])) {
         return false;
     }
     $name = array_shift($args);
     if (strtolower($name) === strtolower($sender->getPlayer()->getName())) {
         return false;
     }
     new SetFriendQuery($this->getMain(), $name, $sender->getUid(), $this->level);
     return true;
 }
 private function canRead(Session $session, $subLevel, &$msg)
 {
     if ($subLevel < $this->level) {
         return true;
     }
     if ($this->level === Session::CHANNEL_SUB_NORMAL and $subLevel === Session::CHANNEL_SUB_MENTION and ($replace = preg_replace_callback("%([^A-Za-z0-9_])({$session->getPlayer()->getName()})([^A-Za-z0-9_])%", function ($match) {
         return $match[1] . Phrases::VAR_em3 . $match[2] . Phrases::VAR_info . $match[3];
     }, $msg)) !== $msg) {
         $msg = $replace;
         return true;
     }
     return false;
 }
 protected function run(array $args, Session $sender)
 {
     if (!$sender->confirmAlt) {
         $sender->confirmAlt = true;
         return $sender->translate(Phrases::CMD_ALT_WARNING);
     }
     $this->getMain()->getAltServer($ip, $port);
     if ($ip !== "0.0.0.0") {
         $this->getMain()->transfer($sender->getPlayer(), $ip, $port, $sender->translate(Phrases::CMD_ALT_SUCCESS, ["ip" => $ip, "port" => $port]));
         return true;
     }
     return $sender->translate(Phrases::CMD_ALT_WAIT);
 }
 public function run(array $args, Session $session)
 {
     if (strtolower($args[0]) == "local") {
         if ($session->getCurrentChatState() === Session::CHANNEL_LOCAL) {
             $session->getPlayer()->sendMessage(TextFormat::RED . "The channel state is already local");
         } else {
             $session->currentChatState = Session::CHANNEL_LOCAL;
         }
     }
     if (strtolower($args[0]) == "team") {
         if ($session->getCurrentChatState() === Session::CHANNEL_TEAM) {
             $session->getPlayer()->sendMessage(TextFormat::RED . "The channel state is already the team");
         } else {
             $session->currentChatState = Session::CHANNEL_TEAM;
         }
     }
     if (!isset($args[0])) {
         return false;
     } else {
         $channel = array_shift($args);
         $session->joinChannel($channel);
         return $session->getPlayer()->sendMessage(TextFormat::AQUA . "You have joined the channel " . $channel);
     }
 }
 protected function run(array $args, Session $sender)
 {
     if ($sender->getTeamId() === -1) {
         return $sender->translate(Phrases::CMD_TEAM_ERR_ALREADY_IN_TEAM);
     }
     if (!$sender->confirmQuitTeam) {
         $sender->confirmQuitTeam = true;
         return $sender->getTeamRank() === Settings::TEAM_RANK_LEADER ? $sender->translate(Phrases::CMD_TEAM_QUIT_WARNING_LEADER) : ($sender->getTeamRank() === Settings::TEAM_RANK_JUNIOR ? $sender->translate(Phrases::CMD_TEAM_QUIT_WARNING_JUNIOR) : $sender->translate(Phrases::CMD_TEAM_QUIT_WARNING_NORMAL));
     }
     $type = ChatType::get($this->getMain(), ChatType::TEAM_CHAT, "Network", "%tr%" . Phrases::CMD_TEAM_QUITTED, Settings::CLASS_ALL, ["tid" => $sender->getTeamId(), "teamName" => $sender->getTeamName(), "ign" => "Network", "data" => ["name" => $sender->getPlayer()->getName(), "teamname" => $sender->getTeamName()]]);
     $type->push();
     $sender->setLoginDatum("tid", -1);
     $sender->setLoginDatum("teamrank", 0);
     $sender->setLoginDatum("teamjoin", 0);
     $sender->setLoginDatum("teampts", 0);
     return true;
 }
 protected function run(array $args, Session $sender)
 {
     if (!isset($args[0])) {
         return false;
     }
     if ($sender->getTeamId() === -1) {
         return $sender->translate(Phrases::CMD_TEAM_ERR_NOT_IN_TEAM);
     }
     if ($sender->getTeamRank() < Settings::TEAM_RANK_SENIOR) {
         return $sender->translate(Phrases::CMD_TEAM_RANK_CHANGE_NEED_SENIOR);
     }
     $name = array_shift($args);
     if (strtolower($sender->getPlayer()->getName()) === strtolower($name)) {
         return false;
     }
     new TeamRankChangeQuery($this->getMain(), $this->promote, $name, $sender);
     return true;
 }
 private function execWarnOn(CommandSender $issuer, Session $ses)
 {
     $msg = $ses->translate(Phrases::WARNING_RECEIVED_NOTIFICATION, ["issuer" => $issuer->getName(), "message" => $this->msg, "points" => $this->points, "totalpoints" => $ses->getWarningPoints()]);
     $conseq = Settings::getWarnPtsConseq($ses->getWarningPoints());
     if ($conseq->banLength) {
         $msg .= $ses->translate(Phrases::WARNING_BANNED_NOTIFICATION, ["length" => MUtils::time_secsToString($conseq->banLength)]);
         $msg = "\n" . $msg;
         $ses->getPlayer()->kick($msg, false);
     } elseif ($conseq->muteSecs) {
         $msg .= $ses->translate(Phrases::WARNING_MUTED_NOTIFICATION, ["length" => MUtils::time_secsToString($conseq->muteSecs)]);
         $ses->getPlayer()->sendMessage($msg);
         // TODO mute
     }
 }
 protected function run(array $args, Session $sender)
 {
     $sender->getPlayer()->attack(20000, new EntityDamageEvent($sender->getPlayer(), EntityDamageEvent::CAUSE_SUICIDE, 20000));
 }
 /**
  * @param Session $session
  * @param MuteIssue|null $mute
  * @return bool
  */
 public function isMuted(Session $session, &$mute = null)
 {
     $uid = $session->getUid();
     $ip = $session->getPlayer()->getAddress();
     /** @noinspection PhpDeprecationInspection */
     $cid = $session->getPlayer()->getClientId();
     foreach ($this->mutes as $k => $mute) {
         if (time() > $mute->since + $mute->length) {
             unset($this->mutes[$k]);
             continue;
         }
         if ($mute->uid === $uid or $mute->ip === $ip or $mute->cid === $cid) {
             return true;
         }
     }
     return false;
 }
 public function execWarnOn(CommandSender $issuer, Session $ses)
 {
     $msg = $ses->translate(Phrases::WARNING_RECEIVED_NOTIFICATION, ["issuer" => $issuer->getName(), "message" => $this->msg, "points" => $this->points, "totalpoints" => $ses->getWarningPoints()]);
     $consequence = Settings::getWarnPtsConsequence($ses->getWarningPoints(), $this->creation);
     if ($consequence->banLength) {
         $msg .= $ses->translate(Phrases::WARNING_BANNED_NOTIFICATION, ["length" => MUtils::time_secsToString($consequence->banLength)]);
         $msg = "\n" . $msg;
         $ses->getPlayer()->kick($msg, false);
     } elseif ($consequence->muteSecs) {
         $mute = new MuteIssue();
         $mute->cid = $this->clientId;
         $mute->ip = $ses->getPlayer()->getAddress();
         $mute->uid = $this->uid;
         $mute->length = $consequence->muteSecs;
         $mute->msg = $this->msg;
         $mute->since = $this->creation;
         $mute->src = $issuer->getName();
         $ses->getPlayer()->sendMessage($msg);
         MuteHormone::fromObject($ses->getMain(), $mute)->release();
     }
 }
 protected function run(array $args, Session $sender)
 {
     $sender->getPlayer()->setLastDamageCause(new EntityDamageEvent($sender->getPlayer(), EntityDamageEvent::CAUSE_SUICIDE, $sender->getPlayer()->getHealth()));
     $sender->getPlayer()->kill();
 }