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();
     }
 }
 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);
 }
 protected function run(array $args, Session $sender)
 {
     if ($sender->getTeamId() === -1) {
         return $sender->translate(Phrases::CMD_TEAM_ERR_NOT_IN_TEAM);
     }
     if ($sender->getTeamId() < Settings::TEAM_RANK_COLEAD) {
         return $sender->translate(Phrases::CMD_TEAM_CONFIG_NEED_CO_LEADER, ["type" => $sender->translate($this->humanPhrase)]);
     }
     new TeamConfigChangeQuery($this->getPlugin(), $sender, $sender->getTeamId(), $this->bit, $this->boolean, $this->humanPhrase);
     return true;
 }
 protected function run(array $args, Session $sender)
 {
     if ($sender->getTeamId() === -1) {
         return $sender->translate(Phrases::CMD_TEAM_ERR_ALREADY_IN_TEAM);
     }
     if (!isset($args[0])) {
         return false;
     }
     $team = array_shift($args);
     new JoinTeamQuery($this->getMain(), $sender->getUid(), $team);
     return $sender->translate(Phrases::CMD_TEAM_LOADING);
 }
 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);
 }
 protected function run(array $args, Session $sender)
 {
     if ($sender->getTeamId() !== -1) {
         return $sender->translate(Phrases::CMD_TEAM_ERR_ALREADY_IN_TEAM);
     }
     $name = array_shift($args);
     if ($name === null) {
         return false;
     }
     if (!preg_match('/^[A-Za-z0-9_]{5,}$/', $name)) {
         $sender->send(Phrases::CMD_TEAM_CREATE_INVALID_NAME);
         return true;
     }
     new CreateTeamQuery($this->getMain(), $sender->getUid(), $name);
     return $sender->translate(Phrases::CMD_TEAM_LOADING);
 }
 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 ($sender->getTeamId() === -1) {
         return $sender->translate(Phrases::CMD_TEAM_ERR_NOT_IN_TEAM);
     }
     if (!isset($args[0])) {
         new TeamPropertyResponseQuery($this->getPlugin(), $sender, $sender->getTeamId(), $this->column, $this->humanPhrase);
         return true;
     }
     if ($sender->getTeamRank() < Settings::TEAM_RANK_COLEAD) {
         return $sender->translate(Phrases::CMD_TEAM_PROPERTY_NEED_CO_LEADER, ["type" => $sender->translate($this->humanPhrase)]);
     }
     $text = preg_replace('/[ \\t]+\\|[ \\t]+/', "\n", implode(" ", $args));
     $text = trim($text);
     new TeamPropertyChangeQuery($this->getPlugin(), $sender, $sender->getTeamId(), $this->column, $text, $this->humanPhrase);
     return true;
 }
 protected function checkPerm(Session $session, &$msg = null)
 {
     if ($session->isModerator() or $session->isDonator()) {
         return true;
     }
     $msg = $session->translate(Phrases::CMD_ERR_NO_PERM);
     return false;
 }
 protected function run(array $args, Session $sender)
 {
     if (!$sender instanceof ClassicSession) {
         return "This command is only available on PvP servers";
     }
     if (isset($args[0])) {
         if ($args[0] === "on") {
             $on = true;
         } elseif ($args[0] === "off") {
             $on = false;
         }
     }
     if (!isset($on)) {
         return $sender->translate($sender->isFriendlyFireActivated() ? Phrases::CMD_FFA_CHECK_TRUE : Phrases::CMD_FFA_CHECK_FALSE);
     }
     $sender->setFriendlyFireActivated($on);
     return $sender->translate($on ? Phrases::CMD_FFA_SET_TRUE : Phrases::CMD_FFA_SET_FALSE);
 }
 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;
 }
 protected function run(array $args, Session $sender)
 {
     if (!isset($args[0])) {
         return false;
     }
     if ($sender->getTeamRank() < Settings::TEAM_RANK_COLEAD) {
         return $sender->translate(Phrases::CMD_TEAM_KICK_COLEAD);
     }
     new TeamKickQuery($this->getMain(), $sender, array_shift($args), implode(" ", $args));
     return true;
 }
 protected function run(array $args, Session $sender)
 {
     if ($sender->getTeamId() === -1 or $sender->getTeamRank() < Settings::TEAM_RANK_SENIOR) {
         return $sender->translate(Phrases::CMD_TEAM_INVITE_NOT_SENIOR);
     }
     $name = array_shift($args);
     if ($name === null) {
         return false;
     }
     new InviteTeamQuery($this->getMain(), $sender, $name);
     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)
 {
     if (!isset($args[0])) {
         if ($sender->queryTarget === null) {
             return false;
         }
         $sender->setQueryTargetUid(null);
         return $sender->translate(Phrases::CMD_QUERY_CANCELLED);
     }
     $target = $this->getSession($name = array_shift($args));
     if ($target === null) {
         return $this->notOnline($sender, $name);
     }
     $sender->setQueryTargetUid($target->getUid());
     return $sender->translate(Phrases::CMD_QUERY_SUCCESS, ["target" => $target->getInGameName()]);
 }
 protected function run(array $args, Session $sender)
 {
     if (!isset($args[0])) {
         switch ($sender->getCurrentChatState()) {
             case Session::CHANNEL_LOCAL:
                 $sender->send(Phrases::CMD_CHANNEL_VIEW_LOCAL);
                 break;
             case Session::CHANNEL_TEAM:
                 $sender->send(Phrases::CMD_CHANNEL_VIEW_TEAM);
                 break;
             default:
                 $sender->send(Phrases::CMD_CHANNEL_VIEW_OTHER, ["chan" => $sender->getCurrentChatState()]);
         }
         return $sender->translate(Phrases::CMD_CHANNEL_VIEW_SUBSCRIBING_TO_CHANNELS, ["channels" => implode(", ", $sender->getChannelSubscriptions())]);
     }
     $name = array_shift($args);
     if (strtolower($name) === "local" or strtolower($name) === "g" or strtolower($name) === "l") {
         $sender->setCurrentChatState(Session::CHANNEL_LOCAL);
         return $sender->translate(Phrases::CMD_CHANNEL_SET_LOCAL);
     } elseif (strtolower($name) === "team" or strtolower($name) === "t") {
         if ($sender->getTeamId() === -1) {
             return $sender->translate(Phrases::CMD_TEAM_ERR_NOT_IN_TEAM);
         }
         $sender->setCurrentChatState(Session::CHANNEL_TEAM);
         return $sender->translate(Phrases::CMD_CHANNEL_SET_TEAM);
     } elseif (strtolower($name) === "quit") {
         if (!isset($args[0])) {
             return false;
         }
         $ch = array_shift($args);
         if (!$sender->isOnChannel($ch)) {
             return $sender->translate(Phrases::CMD_CHANNEL_QUIT_NOT_ON_CHANNEL);
         }
         $sender->partChannel($ch);
         return $sender->translate(Phrases::CMD_CHANNEL_QUIT_SUCCESS);
     } else {
         if (!$sender->isOnChannel($name)) {
             $sender->joinChannel($name);
             $sender->send(Phrases::CMD_CHANNEL_JOINED_SELF, ["channel" => $name]);
         }
         $sender->setCurrentChatState($name);
         return $sender->translate(Phrases::CMD_CHANNEL_SET_OTHER, ["chan" => $name]);
     }
 }
 protected function run(array $args, Session $sender)
 {
     $sender->reloadKits();
     return $sender->translate(Phrases::KITS_RELOADING);
 }
 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();
     }
 }
 public function sendToSession(Session $session)
 {
     $session->send(Phrases::WARNING_MUTED_NOTIFICATION, ["length" => MUtils::time_secsToString($this->length), "since" => date($session->translate(Phrases::WORDS_DATE_FORMAT), $this->since), "till" => date($session->translate(Phrases::WORDS_DATE_FORMAT), $this->since + $this->length), "passed" => MUtils::time_secsToString(time() - $this->since), "left" => MUtils::time_secsToString($this->since + $this->length - time()), "issuer" => $this->src]);
 }
 protected function offline(Session $sender, $name)
 {
     return $sender->translate(Phrases::CMD_ERR_ABSENT_PLAYER_NAME_KNOWN, ["player" => $name]);
 }